最小的HTTP服务器回复

9
我正在尝试使用AVR + ESP8266构建HTTP服务器。
我已经可以通过telnet发送命令,但现在我想实现一个Web界面。
作为起点,我试图设置一个输出“文本”的网站,但浏览器显示为空白页。请问有人能告诉我网页被解释为HTML所需的最小要求是什么?
telnet 192.168.2.26 81
Trying 192.168.2.26...
Connected to 192.168.2.26.
Escape character is '^]'.

GET / HTTP/1.1

AVR的答案:

HTTP/1.1 200 OK
Content-Type: text/html
<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
<title>Zeitschaltuhr</title></head>
<body>
Text
</body></html>
Connection closed by foreign host.

当在浏览器中查看页面源代码时,你会看到什么?(ctrl-u) - sdabet
空白页面,只有在第一行前面有一个“1”。 - Sebastian Heyn
问题不在于你的HTML语法。如果你只返回了“文本”而没有任何HTML标记,浏览器会显示它。问题是你的浏览器根本没有接收到任何东西。 - sdabet
端口81,我连接192.168.2.26:81 - 我可以在uart记录器上看到回复和所有内容,所以它有效。 - Sebastian Heyn
你可能需要在HTTP头和正文之间添加一个空行,参见我的答案。 - sdabet
显示剩余3条评论
3个回答

12

最简HTTP响应:

HTTP/1.1 404 
Content-Length: 0

内容简洁的响应:

HTTP/1.1 200 OK
Content-Length: 12
Content-Type: text/plain; charset=utf-8

Hello World!

它无法为您工作的原因是您忘记了 Content-Length: 标头。


2
实际上,如果您使用一个程序并且可以控制终止连接,并且通过Chrome浏览器客户端连接,您不需要指定长度。通常情况下,在使用Chrome浏览器连接时,您也不需要指定Content-Type,尽管指定两者可能是一个好习惯。 - yosefrow
是的 @yosefrow,为浏览器兼容性添加它是一个好习惯。 - Zibri
3
为什么长度是13而不是12?末尾有换行符吗? - ScienceDiscoverer
@ScienceDiscoverer 我编辑了答案,因为这也让我感到困惑。我使用了一个简单的Flask服务器,并且如果没有换行符,它会将Content-Length设置为12。我也认为它可能应该是14,因为HTTP使用\r\n而不仅仅是\n,但显然您可以在响应正文中发送任何内容。 - user3064538
在HTTP/1.0中,您可以省略Content-Length头部,这符合规范。对于HTTP/1.1,您需要使用Content-LengthTransfer-Encoding: chunked之一 - 后者需要您以特殊格式发送正文,但是您不需要提前知道字节数量。在您的情况下,HTTP/1.0可能是最合适的解决方案。 - Jonas Berlin

3

在内容之前提供两次CR、LF是非常重要的。

HTTP/1.1 200 OK\r\nContent-Length: 13\r\nContent-Type: text/html\r\n\r\nHello World!

2

你的HTTP响应缺少响应头字段和消息体之间的空行(如此处所解释的):

HTTP/1.1 200 OK
Content-Type: text/html

<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
<title>Zeitschaltuhr</title></head>
<body>
Text
</body></html>

你的代码缺少 Content-Length: header :P - Zibri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接