HTTP请求至少需要什么?

时间:2011-07-13 22:03:45

标签: http

我正在尝试使用netcat向我的本地服务器发出GET命令,执行以下操作:

echo -e "GET / HTTP/1.1\nHost: localhost" | nc localhost 80

不幸的是,我收到HTTP/1.1 400 Bad Request响应。 HTTP请求至少需要什么?

8 个答案:

答案 0 :(得分:61)

如果请求是:"GET / HTTP/1.0\r\n\r\n",则响应包含标题和正文,并在响应后关闭连接。

如果请求是:"GET / HTTP/1.1\r\nHost: host:port\r\nConnection: close\r\n\r\n" 然后响应包含标题和正文,并在响应后关闭连接。

如果请求是:"GET / HTTP/1.1\r\nHost: host:port\r\n\r\n",则响应包含标题和正文,即使在响应之后连接也不会关闭。

如果您的请求是:"GET /\r\n\r\n",则响应不包含标题且仅包含正文,并且响应后连接将关闭。

如果您的请求是:"HEAD / HTTP/1.0\r\n\r\n",则响应仅包含标题且没有正文,并且响应后连接将关闭。

如果请求是:"HEAD / HTTP/1.1\r\nHost: host:port\r\nConnection: close\r\n\r\n",则响应仅包含标题且没有正文,并且响应后连接将关闭。

如果请求是:"HEAD / HTTP/1.1\r\nHost: host:port\r\n\r\n",则响应仅包含标题且没有正文,并且响应后连接不会关闭。

答案 1 :(得分:59)

必须使用CRLF行结尾,并且必须以\r\n\r\n结尾,即空行。这就是我使用的:

printf 'GET / HTTP/1.1\r\nHost: www.example.com\r\nConnection: close\r\n\r\n' |
  nc www.example.com 80

此外,我更喜欢printf而不是echo,我添加了一个额外的标头让服务器关闭连接,但不需要这些。

答案 2 :(得分:10)

请参阅Wiki: HTTP Client Request (Example)

请注意以下事项:

  
    

客户端请求(包含请求行的这种情况,只有一个标题)后跟一个空行,以便请求以双换行结束,每个换行符以回车符的形式后跟换行。 “主机”标头区分共享单个IP地址的各种DNS名称,允许基于名称的虚拟主机。虽然HTTP / 1.0中的是可选的,但在HTTP / 1.1 中是必需的。

  

绝对最小值(如果允许删除主机;-)则为GET / HTTP/1.0\r\n\r\n

快乐编码

答案 3 :(得分:9)

我能够从我的Apache服务器获得响应,所请求的文档,没有响应标题,只有

GET /\r\n

如果你想要响应标题,包括状态代码,你需要其中一个答案。

答案 4 :(得分:5)

400 Bad Request错误本身的事实并不意味着您的请求违反了HTTP。服务器非常好,可能出于另一个原因提供此响应。

据我所知,绝对最小有效HTTP请求是:

GET / HTTP/1.0\r\n\r\n

答案 5 :(得分:3)

请在没有先阅读相关规范的情况下,请不要实现自己的HTTP客户端。请阅读并确保您至少完全理解RFC 2616。 (如果你雄心勃勃,RFC 7230到7235)。

虽然HTTP看起来像一个简单的协议,但实际上有很多细微之处。编写HTTP服务器的任何人都会告诉您他必须实施的解决方法,以便处理不正确但广泛部署的客户端。除非您正在阅读规范,否则请使用完善的客户端库; Curl是一个不错的选择,但我确信还有其他选择。

如果你要实现自己的:

  • 不要使用HTTP / 0.9;
  • HTTP / 1.0需要查询行和空行;
  • 在HTTP / 1.1中,除上述内容外,Host:标题是强制性的。

忽略HTTP / 1.1中的Host:标头是导致400次错误的最常见原因。

答案 6 :(得分:1)

答案 7 :(得分:0)

非常真正的BARE最小值,不是使用netcat,而是使用bash本身:

user@localhost:~$ exec 3<>/dev/tcp/127.0.0.1/80
user@localhost:~$ echo -e "GET / HTTP/1.1\n" >&3
user@localhost:~$ cat <&3
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/2.7.6
Date: Mon, 13 Oct 2014 17:55:55 GMT
Content-type: text/html; charset=UTF-8
Content-Length: 514

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
<title>Directory listing for /</title>
<body>
<h2>Directory listing for /</h2>
<hr>
<ul>
</ul>
<hr>
</body>
</html>
user@localhost:~$