我使用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
最佳答案
我跟踪了RestTemplate
如何实际进行调用的代码。基本上,发生的是HttpClientErrorException.getStatusText()
的结果由http状态代码的文本填充,而不是您的自定义错误消息。例如,服务器可能返回back error400 Bad Request
,而不是返回返回的错误代码400。服务器可能返回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和其他东西中),那么可以使用regex过滤掉响应消息中不有用的部分。
关于java - HttpClientErrorException.getStatusText和HttpClientErrorException.getResponseBodyAsString之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54333826/