Spring rest 模板垃圾错误响应正文

Spring rest template garbage error response body

我有以下休息模板配置:

@Bean
public RestTemplate restTemplate() {
    RestTemplate template = new RestTemplate();
    template.getMessageConverters().add(new ObjectToUrlEncodedConverter());
    return template;
}

ObjectToUrlEncodedConverter 原样从

复制而来

我将其余部分称为 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("Non OK response received from server. Status code: {}, response: {}", 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”,同时获取如下所示的 errorResponseBody。

ex.getResponseBodyAsString(Charset.forName("UTF-8"))

另外,从 responseBodyByteArray 构建字符串如下:

new String(ex.getResponseBodyAsByteArray())

但还是没有运气。

相同的端点在 Postman 中运行良好。休息模板似乎以某种方式搞乱了错误响应主体。

我不确定到底是什么问题。我将其余模板配置为使用 apache Http 客户端,而不是其余模板使用的默认 HttpUrlConnection。

这似乎运作良好并修复了垃圾错误响应正文问题。

This tutorial 帮助我们做同样的事情。