0

コア Java API を使用するだけで、正しくフォーマットされた HTTP ヘッダーで応答を送信しようとしています。現在のコードでは、クライアントが応答を受信して​​いることがわかりますが、Web ブラウザー クライアントに 404 エラーを返すと、Web ブラウザーは空白のページを表示するだけなので、すべての情報を含めていないと思います。curl を試してみると、エラーを知らせる curl も表示されません。これが私が現在応答で行っていることです:

outputStream.write("HTTP/1.1 404 Not Found".getBytes());

4

3 に答える 3

5

HTTP 応答は 3 つの部分で構成されています

  1. 送信している初期ステータス行
  2. 応答ヘッダー (、、、、などの応答ヘッダーContent-Typeを含む)Content-LengthLast-ModifiedCookie
  3. 応答本文 - (何が起こったかをユーザーに伝えるユーザーフレンドリーなコンテンツを含む実際の HTML。

あなたは最初のものだけを送っています。

送信する必要があるものの例は次のとおりです。

HTTP/1.1 404 Not Found
Date: Fri, 18 Aug 2012 13:24:45 GMT
Content-Type: text/HTML
Content-Length: 90

<html><head><title>Page not found</title></head><body>The page was not found.</body></html>

また、最後にソケットを閉じることを忘れないでください。

このページでは、HTTP レスポンスをわかりやすく説明しています。

編集

応答の各行は、 と の両方の文字で区切る必要があることに注意してCRくださいLF。したがって、への呼び出しの前に、各改行を表す \r\n も書く必要がありますgetBytes()

于 2012-08-18T16:23:30.970 に答える
2

404エラーが発生した場合は、ブラウザに表示するコンテンツを含める必要があります。Content-LengthプロパティとContent-Typeプロパティを含めてから、ブラウザに表示するHTMLコンテンツをいくつか含めます。また、ストリームに書き込んだ後は、ストリームをフラッシュすることを忘れないでください。適切な応答は次のようになります。

String response = "HTTP/1.1 404 Not Found\r\n" +
    "Content-Length: 22\r\n" +
    "Content-Type: text/html\r\n\r\n" +
    "<h1>404 Not Found</h1>";
outputStream.write(response.getBytes());
outputStream.flush();

各ヘッダーの後にキャリッジリターンとラインフィード(\ r \ n)があり、ヘッダーの後に2つの\ r \ nがあるはずです。これにより、コンテンツが近づいていることを示すことができます。

于 2012-08-18T16:28:50.857 に答える
0

改行を追加して接続を閉じると、ブラウザcurlが応答を理解するのに役立ちます。

outputStream.write("HTTP/1.1 404 Not Found\n".getBytes());
outputStream.close();

...そして最小限の「機能する」応答:

outputStream.write("HTTP/1.1 200 OK\n\nHello, world!".getBytes())
outputStream.close()
于 2012-08-18T16:28:13.743 に答える