有没有办法使用 Java 11 的 HttpClient 从 HTTP 1.1 响应的状态行中获取 Reason-Phrase?

Nat*_*ams 4 java java-http-client

Javajava.net.HttpURLConnection有一个getResponseMessage()方法来检索任何Reason-Phrase文本(如RFC2616 6.1 Status Line所指定)。

在较新的 Java 11 HttpClient 中,java.net.http.HttpResponse只有一个statusCode()方法。

有没有办法使用此 API 获取状态行末尾返回的文本?如果没有,为什么不包括在内?(我知道 HTTP 2没有定义这个值,但大多数应用程序仍然使用 HTTP 1.1,它仍然有效。)

Ste*_*n C 5

有没有办法使用此 API 获取状态行末尾返回的文本?

不。

如果没有,为什么不包括在内?

我们无法告诉您实际原因,因为尚未发布详细的设计原理。

但是,我想原因/推理是这样的:

  1. 因为客户经常忽略文本。(忍耐一下……)

  2. 因为文本很少包含任何有用的内容。它通常只是与响应代码对应的标准(推荐)文本消息。(这是一个原因文本通常由客户忽略)。

  3. 因为如果 Web 应用程序要提供有意义的解释,它很可能会在有效负载中进行。(因为 1。但也加强了它。)

  4. 因为某些网络堆栈不允许网络应用程序设置原因文本。

  5. 因为某些 HTTP 1.1 Web 服务器通常会将原因完全排除在外!(例如,对于 Tomcat 8.0.x,没有消息,对于 Tomcat 8.5.x,有一个选项可以启用它。)


(我知道 HTTP 2 没有定义这个值,但大多数应用程序仍然使用 HTTP 1.1,它仍然有效。)

现在是... 1

这实际上是(新)Web 应用程序不尝试在原因文本中传递有用信息并且不在 API 中支持它的另一个原因。

最终,大多数应用程序将使用 HTTP 2 或更高版本。或者至少,足够多的人会使用它,依靠对 HTTP 1.x 功能的良好支持可能会给您的应用程序带来问题。

请记住,HTTP 3 现在正在筹备中。没有人能看到足够远的未来来准确预测在(比如)5 年内有多少 Web 服务器将使用什么版本的 HTTP。

1 - 服务器端采用率呈上升趋势,但因服务器平台而异。有关一些数据点,请参阅2020 年网络年鉴


鉴于上述情况,如果您使您的客户端代码依赖于查看特定原因文本……或者根本没有看到……那么对于某些 Web 服务器来说,它很可能会中断。

因此,我想说 Java 11 的 HttpClient API 设计者没有将原因文本暴露给客户端代码,这给了我们很大的帮助

您可以自由地不同意……并使用其他 HTTP 客户端库。


我的建议是顺其自然。如果您不尝试使用原因文本(客户端或服务器端),那么您将不必处理使用它会带来的问题。问题只会变得更糟。