有没有办法从Java11的httpclient的HTTP1.1响应的状态行中获取原因短语?

kdfy810k  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(282)

用java的 java.net.HttpURLConnection 有一个getresponsemessage()方法来检索 Reason-Phrase 文本(由rfc2616 6.1状态行指定)。
在较新的Java11HttpClient中, java.net.http.HttpResponse 只有statuscode()方法。
有没有一种方法可以使用这个api获取状态行末尾返回的文本?如果没有,为什么没有包括在内(我知道http2没有定义这个值,但是大多数应用程序仍然使用http1.1,因为它仍然有效。)

dbf7pr2w

dbf7pr2w1#

有没有一种方法可以使用这个api获取状态行末尾返回的文本?
不。
如果没有,为什么没有包括在内?
因为文本通常被客户忽略(忍受我……)
因为文本很少包含有用的内容。它通常只是与响应代码相对应的标准(推荐)文本消息(一个被忽视的原因)
因为如果一个web应用程序要提供一个有意义的解释,它很可能在有效负载中这样做(因为1。但也加强了这一点。)
因为有些web堆栈不允许web应用设置原因文本。
因为一些http1.1web服务器通常会完全忽略原因文本(例如,对于Tomcat8.0.x,没有消息,而对于Tomcat8.5.x,有一个启用消息的选项。)
(我知道HTTP2没有定义这个值,但大多数应用程序仍然使用HTTP1.1,因为它仍然有效。)
这实际上是(新的)web应用程序不尝试在原因文本中传递有用信息,也不支持在api中传递有用信息的另一个原因。
鉴于上述情况,如果你让你的客户代码取决于看到具体的原因文本。。。或者看到任何。。。然后,它很容易打破一些网络服务器。
因此,我想说Java11的httpclient api设计人员没有向客户端代码公开原因文本,这对我们大家都是一个很大的帮助。
你可以不同意。。。并使用其他http客户端库。
我的建议是顺其自然。如果不尝试使用原因文本(客户端或服务器端),那么就不必处理使用它会带来的问题。问题只会变得更糟。

chhkpiq4

chhkpiq42#

当你注意到 HttpResponse 不提供任何api来获取原因短语。没有隐藏的方法可以得到它。您是否有一个用例,其中在 HttpResponse 会有用吗?

相关问题