0

Web サーバーにある php ファイルに POST リクエストを送信しようとしています。現在、リクエストは正常に送信されていますが、ヘッダーが正しく送信されていません。

以下は、送信したいクエリ文字列です。

lastName=Jones&title=Android+Game+Programming+2&price=22.99&isbn=9876543210123&year=2012&firstName=Joe&publisher=Android+Press

そして、これは私がそれらをサーバーに送信しようとする方法です:

if(method.equalsIgnoreCase("POST")){

        //Write the http post request to web server
        s.getOutputStream().write(("POST " + path + " HTTP/1.0\r\n").getBytes("ASCII"));
        s.getOutputStream().write("Host: www.jdiadt.com\r\n\r\n".getBytes("ASCII"));

        //Request Headers
        String title = "title: "+request.getParameters().get("title") + "\r\n";
        String firstName = "firstName: "+request.getParameters().get("firstName") + "\r\n";
        String lastName = "lastName: " + request.getParameters().get("lastName") + "\r\n";
        String isbn = "isbn: " + request.getParameters().get("isbn") + "\r\n";
        String publisher = "publisher: " + request.getParameters().get("publisher") + "\r\n";
        String year = "year: " + request.getParameters().get("year") + "\r\n";
        String price = "price: " + request.getParameters().get("price") + "\r\n";

       s.getOutputStream().write(title.getBytes("ASCII"));
       s.getOutputStream().write(firstName.getBytes("ASCII"));
       s.getOutputStream().write(lastName.getBytes("ASCII"));
       s.getOutputStream().write(isbn.getBytes("ASCII"));
       s.getOutputStream().write(publisher.getBytes("ASCII"));
       s.getOutputStream().write(year.getBytes("ASCII"));
       s.getOutputStream().write(price.getBytes("ASCII"));

         //Blank line
        String blankline = "\r\n";
        s.getOutputStream().write(blankline.getBytes("ASCII"));

        //Flush and wait for response...
        s.getOutputStream().flush();

コードを実行すると、スクリプトから次の通知が表示され、ヘッダーが正しく送信されていないと思われます。

Notice: Undefined index: title in C:\wamp\www\bookstore\createBook.php on line 3

POST経由で送信された変数を取得しようとするすべての行で上記のエラーが発生します。コードは次のとおりです。

$title = $_POST['title'];
$firstName = $_POST['firstName'];
$lastName = $_POST['lastName'];
$publisher = $_POST['publisher'];
$isbn = $_POST['isbn'];
$year = $_POST['year'];
$price = $_POST['price'];

何が間違っている可能性があるかについての情報はありますか?

createBook.php

<?php

$title = $_POST['title'];
$firstName = $_POST['firstName'];
$lastName = $_POST['lastName'];
$publisher = $_POST['publisher'];
$isbn = $_POST['isbn'];
$year = $_POST['year'];
$price = $_POST['price'];

try {
    require_once 'BookDAO.php';
    require_once 'Book.php';

    $dao = new BookDAO();
    $book = new Book(NULL, $title, $firstName, $lastName,
                    $publisher, $isbn, $year, $price);

    $dao->insert($book);

    $books = $dao->findAll();


    if (count($books) > 0) {
        echo '<table>';
        echo '<tr>';
        echo '  <th>Title</th>
                            <th>First name</th>
                            <th>Last name</th>
                            <th>Year</th>
                            <th>Price</th>
                            <th>Actions</th>';
        echo '</tr>';
        foreach ($books as $book) {
            echo '<tr>';
            echo '<td>' . $book->getTitle() . '</td>';
            echo '<td>' . $book->getFirstName() . '</td>';
            echo '<td>' . $book->getLastName() . '</td>';
            echo '<td>' . $book->getYear() . '</td>';
            echo '<td>' . $book->getPrice() . '</td>';
            echo '<td>';
            echo '<a href="editBookForm.php?id=' . $book->getId() . '">';
            echo '<img src="images/edit20.png" alt="Edit Book" />';
            echo '</a>';
            echo '<a href="deleteBook.php?id=' . $book->getId() . '"';
            echo ' onclick="return confirm(\'Are you sure you want to delete';
            echo ' this book?\');">';
            echo '<img src="images/delete20.png" alt="Delete Book" />';
            echo '</a>';
            echo '</td>';
            echo '</tr>';
        }
        echo '</table>';
    }
    else {
        echo "<p>There are no books in the database.</p>";
    }
    echo '<p>';
    echo '<a href="createBookForm.php">';
    echo '<img src="images/new20.png" alt="New Book" /> New Book';
    echo '</a>';
    echo '</p>';
}
catch (PDOException $e) {
    exit("Connection failed: " . $e->getMessage());
}
?>
4

3 に答える 3

1

私は自分で問題を解決しました。私がここで何をしたか疑問に思っている人にとっては、私の解決策です。

上記のコードでわかるように、最初の質問に含めましたが、ヘッダーを次々に送信しようとしていましたが、これは完全に間違ったことです!

次の 2 つのリンク (特に 2 つ目) を調べたところ、POST 要求の構造を説明するのに非常に役立ちました。

http://net.tutsplus.com/tutorials/other/http-headers-for-dummies/

http://ruturajv.wordpress.com/2005/12/25/http-post-request/

次にコードに戻り、投稿リクエストの作成方法に次の変更を加えました。

//POST REQUEST
    if(method.equalsIgnoreCase("POST")){

        //CONSTRUCT REQUEST
        String blankline = "\r\n";
        String query = request.getQueryString();
        String length = String.valueOf(query.length());
        System.out.println(length);

        //Write the http post request to web server
        s.getOutputStream().write(("POST " + path + " HTTP/1.0" +"\r\n").getBytes("ASCII"));
        s.getOutputStream().write(("Host: localhost.com" + "\r\n").getBytes("ASCII"));
        s.getOutputStream().write(("Content-Type: application/x-www-form-urlencoded"+"\r\n").getBytes("ASCII"));
        s.getOutputStream().write(("Content-Length: " + length + "\r\n").getBytes("ASCII"));
        s.getOutputStream().write(blankline.getBytes("ASCII"));
        s.getOutputStream().write(query.getBytes("ASCII"));

        //Flush and wait for response...
        s.getOutputStream().flush();

次に、サーバーから返された応答を読み取るだけです。

于 2013-01-29T23:35:02.137 に答える
1

HttpClient のようなライブラリを使用しないのはなぜですか? HTTP GET、POST、およびその他のメソッドを実行するための非常に優れた API があります。壊れにくく、より理解しやすいコードを書くことができます。

リンク: http://hc.apache.org/httpclient-3.x/

于 2013-01-29T22:45:36.050 に答える
1

パラメータを GET タイプ (クエリ文字列) の方法で設定しており、POST を使用してパラメータを取得しようとしています。それらのいずれかを同じになるように変更する必要があります。

于 2013-01-29T22:50:23.807 に答える