我使用httpResp.sendError(400, "You are missing customer 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;
}
}
Sprint引导版本:2.1.0.RELEASE
答案 0 :(得分:0)
我跟踪了RestTemplate
实际如何进行呼叫的代码。基本上,发生的情况是HttpClientErrorException.getStatusText()
的结果是由HTTP状态代码的文本填充的,而不是您的自定义错误消息。例如,服务器可能不仅返回错误代码400,还可能返回错误400 Bad Request
。服务器可能会返回200 OK
来代替状态码200。如果服务器以该可选文本作为响应,则调用getStatusText()
时将看到此内容。请注意,您无法在服务器端自定义OK
和Bad Request
之类的文本。
之所以发生这种情况,是因为在内部,Spring在内部使用SimpleClientHttpResponse.getStatusText()
来使用HttpUrlConnection.getResponseMessage()
。从getResponseMessage
的Javadoc中可以看到,返回的可能值并非自定义错误消息。请注意,在您的情况下,getStatusText()
返回null
,因为您的服务器只是发回了诸如400
之类的状态行,而不是400 Bad Request
。您也可以从Javadoc中看到这一点。您可能可以将服务器配置为发送回状态代码文本消息,但是这样做仍然无法帮助您使用getStatusText()
方法来获取自定义错误消息。
因此,HttpClientErrorException.getStatusText()
并不是您所需要的。相反,您需要继续调用getResponseBodyAsString()
。但是,如果您知道从服务器发送回的响应主体的格式(因为它可能会包装在HTML和其他内容中),则可以使用正则表达式来过滤掉响应消息中无用的部分。 / p>