Java HttpClientErrorException.getStatusText和HttpClientErrorException.getResponseBodyAsString之间的差异
我使用Java HttpClientErrorException.getStatusText和HttpClientErrorException.getResponseBodyAsString之间的差异,java,spring-boot,http,resttemplate,Java,Spring Boot,Http,Resttemplate,我使用httpResp.sendError(400,“您缺少客户id”)将响应发回 当我尝试在客户端检索消息时(使用Rest模板调用端点) 但是,打印HttpClientErrorException始终会为我生成以下结果: HttpClientErrorException:400 null 我看到我有HttpClientErrorException。getResponseBody包含有关时间戳、消息等的所有信息。但是HttpClientErrorException。getStatusText始终
httpResp.sendError(400,“您缺少客户id”)
将响应发回
当我尝试在客户端检索消息时(使用Rest模板调用端点)
但是,打印HttpClientErrorException始终会为我生成以下结果:
HttpClientErrorException:400 null
我看到我有HttpClientErrorException。getResponseBody
包含有关时间戳、消息等的所有信息。但是HttpClientErrorException。getStatusText
始终为空
我的问题是:如何在服务器端设计ResponseEntity,以便HTTP客户端在response.getStatusText()中找到服务器端异常消息,而不是null
这是我的密码
try{
ResponseEntity<String> responseEntity = restTemplate.exchange(uri, HttpMethod.POST, requestEntity, String.class );
System.out.println(responseEntity.getBody());
}
catch (HttpClientErrorException | HttpServerErrorException e) {
if (e.getStatusCode().equals(HttpStatus.UNAUTHORIZED) || e.getStatusCode().equals(HttpStatus.FORBIDDEN)) { System.out.println("Response Body returned:");
System.out.println(e.getResponseBodyAsString());
System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
System.out.println("Status text is:");
System.out.println(e.getStatusText());
} else if (e.getStatusCode().equals(HttpStatus.BAD_REQUEST)) {
System.out.println("Response Body returned:");
System.out.println(e.getResponseBodyAsString());
System.out.println("-------------------------------");
System.out.println("Status text is:");
System.out.println(e.getStatusText());
} else {
throw e;
}
}
试试看{
ResponseEntity ResponseEntity=restemplate.exchange(uri,HttpMethod.POST,requestEntity,String.class);
System.out.println(responseEntity.getBody());
}
捕获(HttpClientErrorException | HttpServerErrorException e){
如果(e.getStatusCode().equals(HttpStatus.UNAUTHORIZED)| e.getStatusCode().equals(HttpStatus.FORBIDDEN)){System.out.println(“返回的响应体:”);
System.out.println(例如getResponseBodyAsString());
System.out.println(“%%%;
System.out.println(“状态文本为:”);
System.out.println(例如getStatusText());
}else if(例如getStatusCode().equals(HttpStatus.BAD_请求)){
System.out.println(“返回的响应体:”);
System.out.println(例如getResponseBodyAsString());
System.out.println(“------------------------------------”;
System.out.println(“状态文本为:”);
System.out.println(例如getStatusText());
}否则{
投掷e;
}
}
Sprint启动版本:2.1.0.RELEASE我跟踪了
restemplate
如何实际进行调用的代码。基本上,所发生的是HttpClientErrorException的结果。getStatusText()由HTTP状态代码的文本填充,而不是由自定义错误消息填充。例如,服务器可能会返回错误400错误请求,而不是返回错误代码400。服务器可能返回200 OK
,而不是状态代码200。如果服务器用该可选文本进行响应,则调用getStatusText()
时将看到该文本。请注意,像OK
和Bad Request
这样的文本不能由您在服务器端自定义
之所以会发生这种情况,是因为Spring在内部利用了内部依赖的资源。从getResponseMessage
的Javadoc中可以看到,返回的可能值并不意味着是自定义错误消息。请注意,在您的情况下,getStatusText()
返回null
,因为您的服务器只是返回一个类似400
的状态行,而不是400错误请求
。您也可以从Javadoc中看到这一点。您可能可以将服务器配置为发回状态代码文本消息,但这样做仍然无法帮助您使用getStatusText()
方法获取自定义错误消息
因此,HttpClientErrorException.getStatusText()
不是您所需要的。相反,您需要继续调用getResponseBodyAsString()
。但是,如果您知道从服务器发回的响应体的格式(因为这很可能是用HTML和其他东西包装的)您可以使用正则表达式过滤掉响应消息中不有用的部分。您有实际实例化HttpClientErrorException
和调用getResponseBody()
和getStatusText()
的示例代码吗?另外,您正在运行哪个版本的Spring Boot?@entpnerd我已经添加了代码谢谢您的简要解释。在我的情况下,它只返回400
,而不是400
。那么,我如何在服务器上配置以通过异常按预期发送回