- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用 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 状态代码的文本填充,而不是您的自定义错误消息。例如,服务器可能不会返回错误代码 400,而是返回错误 400 Bad Request
。服务器可能会返回 200 OK
,而不是状态代码 200。如果服务器用该可选文本进行响应,这就是您在调用 getStatusText()
时看到的内容。请注意,您无法在服务器端自定义诸如 OK
和 Bad Request
之类的文本。
发生这种情况是因为在内部,Spring 正在使用 SimpleClientHttpResponse.getStatusText()
内部依赖 HttpUrlConnection.getResponseMessage()
.正如您从 getResponseMessage
的 Javadoc 中看到的那样,返回的可能值并不意味着是自定义错误消息。请注意,在您的情况下,getStatusText()
返回 null
因为您的服务器只是发回状态行,例如 400
而不是 400 错误请求
。您也可以从 Javadoc 中看到这一点。您或许可以将服务器配置为发回状态代码文本消息,但这样做仍然无法帮助您使用 getStatusText()
方法获取自定义错误消息。
因此,HttpClientErrorException.getStatusText()
并不是您所需要的。相反,您需要继续调用 getResponseBodyAsString()
。但是,如果您知道从服务器发回的响应正文的格式(因为这可能包含在 HTML 和其他内容中),您可以使用正则表达式过滤掉响应消息中无用的部分。
关于java - HttpClientErrorException.getStatusText 和 HttpClientErrorException.getResponseBodyAsString 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54333826/
我在从第三方服务器的 403 http 代码响应获取响应正文时遇到问题。在 2019 年 4 月 5 日之前,我能够正确从第三方获取响应正文,但现在我正在检索一个可能无法从 getResponseBo
正在查看 Apache 对 HttpClient 的建议 ( http://hc.apache.org/httpclient-3.x/performance.html )其中提到了 Response
我使用 httpResp.sendError(400, "You are missing customer id") 发回响应 当我尝试在客户端检索消息时(使用 Rest 模板调用端点)。 但是,打印
我刚遇到那个问题,不明白为什么会这样。 客户端片段: try { ResponseEntity response = this.restTemplate.exchange(uri, HttpM
我是一名优秀的程序员,十分优秀!