通过 telnet 对简单的 HTTP GET 请求获取“400 错误请求”响应

通过 telnet 对简单的 HTTP GET 请求获取“400 错误请求”响应

我正在学习一些网络知识,在第一个练习中遇到了问题:
我应该使用 telnet 向 httpbin.org 发送一个基本的 HTTP GET 请求。
以下是我输入的内容:

$ telnet www.httpbin.org 80
Trying 23.23.171.5...
Connected to www.httpbin.org.herokudns.com.
Escape character is '^]'.
GET /ip HTTP/1.0

以下是我得到的结果:

HTTP/1.1 400 Bad Request
Server: Cowboy
Date: Tue, 09 Jan 2018 20:06:36 GMT
Content-Length: 0

我究竟做错了什么?

答案1

问题在于在需要 HTTP 1.1(以及Host:HTTP 1.1 的必需部分标头)的服务器上使用 HTTP 1.0,可能是因为它可能在一个 IP 地址上虚拟托管多个网站。或者它位于 HTTP 负载平衡器或反向代理后面,它们基本上在做同样的事情:在一个 IP 地址和端口后面支持多个单独的 Web 服务器域名。

这对我有用:

$ telnet www.httpbin.org 80
正在尝试 23.23.171.5...
连接到 www.httpbin.org.herokudns.com。
转义字符是‘^]’。
获取/ip HTTP/1.1
主机:www.httpbin.org

…然后我回来了…

HTTP/1.1 200 正常
连接:保持连接
服务器:meinheld/0.6.1
日期:2018 年 1 月 9 日星期二 22:01:19 GMT
内容类型:application/json
访问控制允许来源:*
访问控制允许凭据:true
X-Powered-By: Flask
X 处理时间:0.000454902648926
内容长度:32
通过:1.1 vegur

{
  “origin”:“[我的 IPv4 地址已删除]”
}

^]
telnet>关闭
$

请注意,连接保持打开状态,我不得不退出以关闭提示。我可以通过向请求telnet>添加标头来避免这种情况。Connection: close

如果您尝试使用带标头的 HTTP/1.1Host:并且它仍然不起作用,请确保您的 telnet 客户端发送的是 CRLF,而不仅仅是回车符或换行符。请确保在最后一行之后使用额外的 CRLF 结束您的请求。

相关内容