0

仅使用核心 Java API,我试图发送带有正确格式的 HTTP 标头的响应。使用我当前的代码,我可以看到客户端收到了我的响应,但我认为我没有包含所有信息,因为当我向 Web 浏览器客户端返回 404 错误时,Web 浏览器只会显示一个空白页面。如果我尝试使用 curl,我也看不到让我知道错误的 curl。这是我目前对响应所做的事情:

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

4

3 回答 3

5

HTTP 响应由三部分组成

  1. 初始状态行,即您发送的内容
  2. 响应标头(带有Content-Type, Content-Length, Last-Modified,Cookie等响应标头)
  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 响应。

编辑

需要注意的是,响应中的每一行都必须用CRLF字符分隔。因此,您还应该在调用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),并且在标题完成后有两个\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 回答