![通过 telnet 对简单的 HTTP GET 请求获取“400 错误请求”响应](https://linux22.com/image/1550488/%E9%80%9A%E8%BF%87%20telnet%20%E5%AF%B9%E7%AE%80%E5%8D%95%E7%9A%84%20HTTP%20GET%20%E8%AF%B7%E6%B1%82%E8%8E%B7%E5%8F%96%E2%80%9C400%20%E9%94%99%E8%AF%AF%E8%AF%B7%E6%B1%82%E2%80%9D%E5%93%8D%E5%BA%94.png)
我正在学习一些网络知识,在第一个练习中遇到了问题:
我应该使用 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 结束您的请求。