当我尝试使用 HTTP 协议发出请求时,为什么会收到 Bad Request 响应?

Why am I getting a Bad Request response when I try my request with HTTP Protocol?

我的本地机器上目前有 Apache Tomcat 运行。

当我尝试使用 telnet 时:

telnet localhost 8080
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET /beer/

我会收到如下回复:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Beer Expert!</title>
    <meta charset="utf-8">
</head>
<body>

等等等等

我的第一个问题是:所有 HTTP 响应 Headers 在哪里,例如 HTTP/1.1 200 OK等?

另外,当我按如下方式尝试 telnet 查询时:

telnet localhost 8080
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET /beer/ HTTP/1.1

我会得到:

HTTP/1.1 400 Bad Request
Server: Apache-Coyote/1.1
Transfer-Encoding: chunked
Date: Tue, 19 Jan 2016 12:15:23 GMT
Connection: close

0

Connection closed by foreign host.

为什么我现在看到 HTTP 响应 headers?为什么我会收到 错误请求 响应?

仅仅说明 GET /beer/ 你并没有说明你想要哪个协议版本。我不确定 tomcat 默认是什么,但我的建议是说明您喜欢的协议版本。

使用 HTTP/1.0,您应该使用更易于在 telnet 上键入的协议。只要您转到 HTTP/1.0,您就会有更多请求 headers 可以发送 - 例如

GET /beer/ HTTP/1.0
Host: www.example.com

将显示该虚拟主机的内容,以防您在一台服务器上有许多不同的主机。

当我远程登录到网络服务器时,我只使用 HTTP/1.0(超过 1.1)- 时间太长以至于我不记得 HTTP/1.1 是不是很难或不可能打字,或者这只是我开始打字时发现的例子。可能有强制性的 headers 或信息,例如编码等,丢失并使你的请求不好。如果 HTTP/1.0 对你来说足够了: 运行 就可以了。否则请告诉我们您还需要什么。