当我使用 HTTP 协议尝试请求时,为啥会收到错误的请求响应?

Posted

技术标签:

【中文标题】当我使用 HTTP 协议尝试请求时,为啥会收到错误的请求响应?【英文标题】:Why am I getting a Bad Request response when I try my request with HTTP Protocol?当我使用 HTTP 协议尝试请求时,为什么会收到错误的请求响应? 【发布时间】:2016-04-24 22:02:54 【问题描述】:

我目前在我的本地机器上运行 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 响应标头,例如 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 响应标头?为什么我会收到 Bad Request 响应?

【问题讨论】:

【参考方案1】:

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

使用 HTTP/1.0,您应该使用更容易在 telnet 上键入的协议。一旦您转到 HTTP/1.0,您将拥有更多可以发送的请求标头 - 例如

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

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

当我远程登录到网络服务器时,我只使用 HTTP/1.0(超过 1.1) - 很长一段时间,我不记得 HTTP/1.1 是否难以或无法键入,或者如果它是只是我开始这样做时发现的示例。可能有强制性标题或信息,例如编码等,这些都丢失了,让你的请求很糟糕。如果 HTTP/1.0 对你来说足够了:用它运行。否则,请告诉我们您还需要什么。

【讨论】:

以上是关于当我使用 HTTP 协议尝试请求时,为啥会收到错误的请求响应?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在尝试使用 fetch 连接 Api 时收到“错误请求”错误 400?

Vue2:当我从响应中分配属性时,为啥会收到无限的 $http.get 请求?

为啥我在页面刷新时收到网络错误? (获取请求)

当我尝试保存测试计划时,为啥会收到 NoClassDefFound 错误?

当我发送超过过期日期的令牌时,为啥会收到 401 错误?

当我尝试从双向链表中删除最后一个元素时,为啥会收到“信号 SIGSEGV,分段错误”?