Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有一种方法可以使用Java 11'从HTTP 1.1响应的状态行获取原因短语;什么是HttpClient?_Java_Java Http Client - Fatal编程技术网

是否有一种方法可以使用Java 11'从HTTP 1.1响应的状态行获取原因短语;什么是HttpClient?

是否有一种方法可以使用Java 11'从HTTP 1.1响应的状态行获取原因短语;什么是HttpClient?,java,java-http-client,Java,Java Http Client,使用Java的Java.net.HttpURLConnection可以检索任何原因短语文本(由指定) 在较新的Java11HttpClient中,Java.net.http.HttpResponse只有一个方法 是否有方法使用此API获取状态行末尾返回的文本?如果没有,为什么不包括在内?(我知道HTTP 2是这个值,但大多数应用程序仍然使用HTTP 1.1,因为它仍然有效。)正如您注意到的那样,HttpResponse没有提供任何API来获取原因短语。没有隐藏的方法可以得到它。您是否有这样一个用

使用Java的
Java.net.HttpURLConnection
可以检索任何
原因短语
文本(由指定)

在较新的Java11HttpClient中,
Java.net.http.HttpResponse
只有一个方法


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

正如您注意到的那样,
HttpResponse
没有提供任何API来获取原因短语。没有隐藏的方法可以得到它。您是否有这样一个用例,在
HttpResponse
中为原因短语提供一个访问器会很有用

是否有方法使用此API获取状态行末尾返回的文本

没有

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

  • 因为文本通常被客户忽略。(请容忍我…)

  • 因为文本很少包含有用的内容。它通常只是对应于响应代码的标准(推荐)文本消息。(这是客户经常忽略文本的原因之一。)

  • 因为如果一个web应用程序要提供一个有意义的解释,它很可能会在有效负载中完成。(因为1。但也加强了它。)

  • 因为某些web堆栈不允许web应用设置原因文本

  • 因为一些HTTP1.1Web服务器通常会完全忽略原因文本!(例如,对于Tomcat 8.0.x,没有消息,而对于Tomcat 8.5.x,有一个启用消息的选项。)


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

    那是现在

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

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

    请记住,HTTP 3现在正在开发中。没有人能够对未来有足够的了解,准确预测在(比如)5年内,web服务器将使用什么版本的HTTP的比例


    鉴于上述情况,如果您让您的客户机代码依赖于查看特定的原因文本。。。或者看到任何一个。。。然后,一些web服务器可能会出现故障

    因此,我想说,Java11的HttpClient API设计人员没有向客户端代码公开原因文本,这给了我们大家一个很大的帮助

    你可以不同意。。。并使用其他HTTP客户端库



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

    我在Java中查找http状态码原因短语,并在我的Google搜索中发现了此讨论。最后我写了我自己的函数,我想分享一下,以防别人发现它有用。它可能不完整,但符合我的目的

    public static String getReasonPhrase(int statusCode) {
        switch(statusCode) {
            case (200): return "OK";
            case (201): return "Created";
            case (202): return "Accepted";
            case (203): return "Non Authoritative Information";
            case (204): return "No Content";
            case (205): return "Reset Content";
            case (206): return "Partial Content";
            case (207): return "Partial Update OK";
            case (300): return "Mutliple Choices";
            case (301): return "Moved Permanently";
            case (302): return "Moved Temporarily";
            case (303): return "See Other";
            case (304): return "Not Modified";
            case (305): return "Use Proxy";
            case (307): return "Temporary Redirect";
            case (400): return "Bad Request";
            case (401): return "Unauthorized";
            case (402): return "Payment Required";
            case (403): return "Forbidden";
            case (404): return "Not Found";
            case (405): return "Method Not Allowed";
            case (406): return "Not Acceptable";
            case (407): return "Proxy Authentication Required";
            case (408): return "Request Timeout";
            case (409): return "Conflict";
            case (410): return "Gone";
            case (411): return "Length Required";
            case (412): return "Precondition Failed";
            case (413): return "Request Entity Too Large";
            case (414): return "Request-URI Too Long";
            case (415): return "Unsupported Media Type";
            case (416): return "Requested Range Not Satisfiable";
            case (417): return "Expectation Failed";
            case (418): return "Reauthentication Required";
            case (419): return "Proxy Reauthentication Required";
            case (422): return "Unprocessable Entity";
            case (423): return "Locked";
            case (424): return "Failed Dependency";
            case (500): return "Server Error";
            case (501): return "Not Implemented";
            case (502): return "Bad Gateway";
            case (503): return "Service Unavailable";
            case (504): return "Gateway Timeout";
            case (505): return "HTTP Version Not Supported";
            case (507): return "Insufficient Storage";
            default: return "";
        }
    }
    

    最典型的是作为一种简单的方式来传达错误文本,它在状态代码上展开。协商短消息的有效负载格式比只使用规范本身提供的插槽要复杂得多将状态代码映射到其标准原因短语。关键是服务器可能会在原因短语中表达固定映射无法反映的唯一细节。例句:随着HTTP 2的采用,这种模式将会下降,但它今天仍然在使用。你经常遇到这种情况吗?我希望响应主体包含详细信息。我在简单服务中使用过它。没有办法知道它在野外有多普遍。它仍然是servlet规范的一部分,因此在客户端API决策中存在一些不对称性(尽管这种东西不像以前那么单一)。所有这些都是解释该决策的好理由。不幸的是,规范支持对以前包含的内容是选择性的。既然Java的移动速度更快了,而且可以更好地进行弃用通信,那么就可以很容易地将其包括在内,以平滑迁移,并在使用减少时/如果使用减少,则可以稍后删除。我想这很难评估…有很多私人服务。“很不幸,规范支持对以前包含的东西是选择性的。”-意见问题。我会说这是件好事。“现在Java的移动速度更快了,并且可以更好地传达弃用信息,这将很容易包括到平滑迁移中,并在使用减少时/如果使用减少了的话将其删除。我想这很难评估……有很多私有服务存在。”-我们正在谈论一个全新的API。旧的JavaSEAPI仍然存在,而且据我所知,现在还没有关于弃用的讨论。使用旧的API并使用(非琐碎的)原因文本的人将被困在HTTP 1.x上。它看起来不像
    HttpUrlConnection
    etc可能支持http2。读一读。我的看法是,他们正在将
    HttpUrlConnection
    视为遗留。。。像旧的Java日期/时间文件和
    Java.io.File