如何从java.net.HttpClient请求的响应中获取http状态消息

如何从java.net.HttpClient请求的响应中获取http状态消息,java,http,Java,Http,一些http服务器生成带有状态代码和自定义状态消息的响应。使用javaHttpURLConnection类发出请求时,可以访问此消息。然而,对于最近的java.net.HttpClient风格的api,我似乎找不到访问消息本身的方法。我只能找到一种获取状态代码的方法 有没有办法检索我忽略的状态消息 如果无法获取状态消息,这是故意的吗 为了说明这种情况,请考虑下面的代码: /** *替代将自定义消息置于http状态的服务器。 *在接收端的每个连接上盲目地发送固定的http响应,而不考虑 *指协

一些http服务器生成带有状态代码和自定义状态消息的响应。使用java
HttpURLConnection
类发出请求时,可以访问此消息。然而,对于最近的
java.net.HttpClient
风格的api,我似乎找不到访问消息本身的方法。我只能找到一种获取状态代码的方法

  • 有没有办法检索我忽略的状态消息
  • 如果无法获取状态消息,这是故意的吗
为了说明这种情况,请考虑下面的代码:

/**
*替代将自定义消息置于http状态的服务器。
*在接收端的每个连接上盲目地发送固定的http响应,而不考虑
*指协议或上下文。
*/
公共类示例服务器{
专用静态最终int端口=8080;
私有静态最终字节[]固定\u响应=String.join(“\n”,
“HTTP/1.1 403缺少X-Api-Key头”,
“内容长度:12”,
"",
“未经授权”
).getBytes(标准字符集.UTF_8);
公共静态void main(字符串[]args)引发异常{
ServerSocket服务器=新的ServerSocket(端口);
ExecutorService executor=Executors.newCachedThreadPool();
while(true){
Socket=server.accept();
executor.submit(()->{
socket.getOutputStream().write(固定的\u响应);
socket.close();
返回null;
});
}
}
}
我们可以使用
HttpURLConnection
方法显示状态

URI=URI.create(“http://localhost:“+端口+”/any/path”);
HttpURLConnection connection=(HttpURLConnection)uri.toURL().openConnection();
connection.setRequestMethod(“GET”);
System.out.println(“状态:+connection.getResponseCode()+”“+connection.getResponseMessage());
System.out.println(“正文:+新字符串(connection.getErrorStream().readAllBytes()));
在以下场景中,如何创建相同的输出

HttpClient=HttpClient.newHttpClient();
HttpRequest请求=HttpRequest.newBuilder()
.uri(uri.create(“http://localhost:“+端口+”/any/path”))
.GET().build();
HttpResponse response=client.send(请求,HttpResponse.BodyHandlers.ofString());
System.out.println(“状态:“+response.statusCode()+”/*这里是什么?*/);
System.out.println(“body:+response.body());

原因短语真的不重要,在HTTP/2和HTTP/3中不再存在。我不会在这方面花费太多精力。

正如朱利安所说,原因在HTTP/2中已经不存在了。尽管如此,如果您确实需要获取给定状态代码的名称,您可以使用
Map
将数字与名称进行匹配

这是一张代码地图,使用中的名称显示原因

import java.util.Map;
导入静态java.util.Map.entry;
公共类HttpStatus原因{
私有静态最终字符串未知\u STATUS=“未知状态”;
私有静态最终映射原因=Map.ofEntries(
//信息的
条目(100,“继续”),
条目(101,“交换协议”),
条目(102,“处理”),
条目(103,“早期提示”),
//成功的
条目(200,“OK”),
条目(201,“已创建”),
条目(202,“接受”),
条目(203,“非权威信息”),
条目(204,“无内容”),
条目(205,“重置内容”),
条目(206,“部分内容”),
条目(207,“多重身份”),
条目(208,“已报告”),
条目(226,“IM使用”),
//重定向
条目(300,“多项选择”),
条目(301,“永久移动”),
条目(302,“发现”),
条目(303,“见其他”),
条目(304,“未修改”),
条目(305,“使用代理”),//已弃用
条目(307,“临时重定向”),
条目(308,“永久重定向”),
//客户端错误
条目(400,“错误请求”),
进入(401,“未经授权”),
条目(402,“要求付款”),
进入(403,“禁止”),
条目(404,“未找到”),
条目(405,“不允许使用方法”),
条目(406,“不可接受”),
条目(407,“需要代理身份验证”),
条目(408,“请求超时”),
条目(409,“冲突”),
条目(410,“消失”),
条目(411,“所需长度”),
条目(412,“前置条件失败”),
条目(413,“有效载荷过长”),
条目(414,“URI太长”),
条目(415,“不支持的媒体类型”),
条目(416,“范围不可满足”),
条目(417,“预期失败”),
条目(418,“我是茶壶”),
条目(421,“错误指示请求”),
条目(422,“不可处理实体”),
入口(423,“锁定”),
条目(424,“失败的依赖项”),
条目(425,“太早”),
条目(426,“需要升级”),
条目(428,“需要先决条件”),
条目(429,“请求过多”),
条目(431,“请求头字段太大”),
条目(451,“因法律原因不可用”),
//服务器错误
条目(500,“内部服务器错误”),
条目(501,“未实施”),
条目(502,“坏网关”),
条目(503,“服务不可用”),
条目(504,“网关超时”),
条目(505,“不支持HTTP版本”),
条目(506,“变型也可协商”),
条目(507,“存储不足”),
条目(508,“检测到循环”),
入口(