英文:
Spring rest template garbage error response body
问题
我有以下的Rest Template配置:
@Bean
public RestTemplate restTemplate() {
RestTemplate template = new RestTemplate();
template.getMessageConverters().add(new ObjectToUrlEncodedConverter());
return template;
}
ObjectToUrlEncodedConverter
是直接从这个答案中复制过来的。
我按照下面的方式调用Rest API:
try {
response = template.exchange(uri, httpRequestObject.getMethod(), requestEntity, httpRequestObject.getResponseClass());
responseObject.setHeaders(response.getHeaders().toSingleValueMap());
responseObject.setHttpStatus(response.getStatusCode());
responseObject.setResponseBody(response.getBody());
} catch (HttpStatusCodeException ex) {
log.error("服务器返回非OK响应。状态码:{},响应:{}", ex.getStatusCode(), ex.getResponseBodyAsString());
throw ex;
}
我遇到的问题是,当响应是4xx或5xx系列时,响应体 ex.getResponseBodyAsString()
返回的是一些垃圾值。类似于这样:�0E%ܙ6�1�Y������hP��N��\]8���w���+Q��\�:S�Ȕ�������뚈M�'Z��
�ml�)�@��]B͎�L؏4Ğ V�`�V�Qx�F<{Q���/fZ�������S�3RNy��>ć��]S���+Е=��!�x9��)Ԏ��n%������
我已经尝试将 Charset
设置为 "UTF-8",就像下面这样获取错误响应体一样:
ex.getResponseBodyAsString(Charset.forName("UTF-8"))
同时,还尝试从 responseBodyByteArray 构建字符串,如下所示:
new String(ex.getResponseBodyAsByteArray())
但仍然没有成功。
相同的端点在 Postman 中运行良好。Rest Template 似乎在某种情况下搞乱了错误响应体。
英文:
I have the following rest template config:
@Bean
public RestTemplate restTemplate() {
RestTemplate template = new RestTemplate();
template.getMessageConverters().add(new ObjectToUrlEncodedConverter());
return template;
}
ObjectToUrlEncodedConverter
is copied as is from this answer
And I call the rest API as mentioned below:
try {
response = template.exchange(uri, httpRequestObject.getMethod(), requestEntity, httpRequestObject.getResponseClass());
responseObject.setHeaders(response.getHeaders().toSingleValueMap());
responseObject.setHttpStatus(response.getStatusCode());
responseObject.setResponseBody(response.getBody());
} catch (HttpStatusCodeException ex) {
log.error("Non OK response received from server. Status code: {}, response: {}", ex.getStatusCode(), ex.getResponseBodyAsString());
throw ex;
}
The problem I am facing is, when the response is 4xx or 5xx series, The response body ex.getResponseBodyAsString()
is giving garbage values. Something like this: �0E%ܙ6�1�Y������hP��N��\]8���w���+Q��\�:S�Ȕ�������뚈M�'Z��
�ml�)�@��]B͎�L؏4Ğ V�`�V�Qx�F<{Q���/fZ�������S�3RNy��>ć��]S���+Е=��!�x9��)Ԏ��n%������
I have tried setting the Charset
to "UTF-8" while getting the errorResponseBody like the following.
ex.getResponseBodyAsString(Charset.forName("UTF-8"))
also, building the string from responseBodyByteArray as follows:
new String(ex.getResponseBodyAsByteArray())
But still no luck.
The same endpoint works well in Postman. Rest template seems to be messing up the error response body somehow.
答案1
得分: 0
我不太确定问题究竟是什么。我将配置余下的模板以使用 Apache Http 客户端,而不是默认的 HttpUrlConnection 用于余下的模板。
这似乎很有效,并修复了错误响应体的问题。
这个教程 帮助我们实现了相同的操作。
英文:
I am not sure what the problem was exactly. I configured the rest template to use apache Http client instead of the default HttpUrlConnection used by rest template.
This seemed to work well and fixed the garbage error response body issue.
This tutorial helps us do the same.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论