2

HTTP クライアントが Java でどのように機能するかについて学習しようとしています。PHPファイルをWebサーバーにリクエストする独自のクライアントを構築しようとしています。

現在、リクエストを行うと、サーバーから次のエラーが表示されます。

HTTP/1.1 400 不正な要求

ただし、ブラウザ内から問題なくファイルにアクセスできます。何が間違っているのかわかりませんが、理解できません。以下は、私の HTTP クライアント クラスのコードです。

public class MyHttpClient {

MyHttpRequest request;
String host;

public MyHttpResponse execute(MyHttpRequest request) throws IOException {

    //Creating the response object
    MyHttpResponse response = new MyHttpResponse();

    //Get web server host and port from request.
    String host = request.getHost();
    int port = request.getPort();

    //Check 1: HOST AND PORT NAME CORRECT!
    System.out.println("host: " + host + " port: " + String.valueOf(port));

    //Get resource path on web server from requests.
    String path = request.getPath();

    //Check 2: ENSURE PATH IS CORRECT!
    System.out.println("path: " + path);

    //Open connection to the web server
    Socket s = new Socket(host, port);

    //Get Socket input stream and wrap it in Buffered Reader so it can be read line by line.
    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(s.getInputStream()));

    //Get Socket output stream and wrap it in a Buffered Writer so it can be written to line by line.
    PrintWriter outToServer = new PrintWriter(s.getOutputStream(),true);

    //Get request method
    String method = request.getMethod();

    //Check 3: ENSURE REQUEST IS CORRECT GET/POST!
    System.out.println("Method: " + method);

    //GET REQUEST
    if(method.equalsIgnoreCase("GET")){
        //Send request to server
        outToServer.println("GET " + path + " HTTP/1.1 " + "\r\n");
        String line = inFromServer.readLine();
        System.out.println("Line: " + line);
    }

    //Returning the response
    return response;
}

}

誰かがこの問題に光を当てることができれば、とても感謝しています! ありがとう。

サーバーへの新しいリクエスト:

outToServer.print("GET " + path+ " HTTP/1.1" + "\r\n");
outToServer.print("Host: " + host + "\r\n");
outToServer.print("\r\n");

応答:

メソッド: GET

line: <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
line: <html><head>
line: <title>400 Bad Request</title>
line: </head><body>
line: <h1>Bad Request</h1>
line: <p>Your browser sent a request that this server could not understand.<br />
line: </p>
line: <hr>
line: <address>Apache Server at default.secureserver.net Port 80</address>
line: </body></html>
line: null
4

2 に答える 2

3

PrintWriter を使用しないでください。アスキー文字を書く必要があります。

 s.getOutputStream().write(("GET " + path + " HTTP/1.1\r\n\r\n").getBytes("ASCII"));
于 2013-01-29T00:14:59.573 に答える
1

少なくともHostリクエストにヘッダーを追加する必要があると思います。

http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocolからの例

GET /index.html HTTP/1.1
Host: www.example.com

ヘッダーが完了したら\r\n、リクエストが完了したことをサーバーが認識できるように、エクストラも転送する必要があります。

printlnしかし、使用しないでくださいprint。は、すべての行printlnに別の行を追加し、行が で終了するようにします。\n\r\n\n

于 2013-01-28T23:43:46.310 に答える