首页 文章

Spring RestTemplate,当http状态代码为404时获得垃圾响应

提问于
浏览
2

我正在编写一个rest代理(它公开API并将调用委托给其他服务器)并且它适用于正常情况,并且对于500 http状态代码,我们从其余客户端获得响应 . 但是当我们获得404状态代码时,Rest API服务器返回消息但我们从RestTemplate获取垃圾值 . 我们需要将相同的响应传递给其他API用户,但无法获得相同的响应 .

Message returned from REST API Server:


{"status_code":"0","error":{
"code":"404","description":"Source not found"}}

Getting the below response by RestTemplate client:

无法粘贴内容,附加响应的屏幕截图 .
Response for Http 404 error
请参阅下面的代码 .

@RequestMapping(value = "/api/**")
public @ResponseBody String apiProxy(@RequestBody String body, HttpMethod method, HttpServletRequest request,
        HttpServletResponse response) throws URISyntaxException {
    RestTemplate restTemplate = new RestTemplate(
            new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
    restTemplate.setInterceptors(Collections.singletonList(new RestClientLoggingInterceptor()));
    restTemplate.setErrorHandler(new CustomResponseErrorHandler());
    restTemplate.getMessageConverters().add(new StringHttpMessageConverter());

    HttpHeaders httpHeaders = new HttpHeaders();
    Enumeration<String> headers = request.getHeaderNames();
    String headerName = null;
    String headerValue = null;
    while (headers.hasMoreElements()) {
        headerName = headers.nextElement();
        headerValue = request.getHeader(headerName);
        httpHeaders.set(headerName, headerValue);
    }
    HttpEntity<String> httpEntity = new HttpEntity<String>(body, httpHeaders);

    URI uri = new URI(ServerProtocol, null, ServerDomain, Integer.valueOf(ServerPort),
            request.getRequestURI(), request.getQueryString(), null);

    ResponseEntity<String> responseEntity = null;
    try {
        responseEntity = restTemplate.exchange(uri, method, httpEntity, String.class);
    } catch (RestClientResponseException e) {
        response.setStatus(e.getRawStatusCode());
        return e.getResponseBodyAsString();
    }
    response.setStatus(responseEntity.getStatusCode().value());
    return responseEntity.getBody();
}

ResponseErrorHandler类

public class CustomResponseErrorHandler extends DefaultResponseErrorHandler {

        private static final Logger logger = LogManager.getLogger(CustomResponseErrorHandler.class);

        @Override
        public void handleError(ClientHttpResponse response) throws IOException {
            logger.error("Response error: {} {}", response.getStatusCode(), response.getStatusText());
        }

    }

RestClientLoggingInterceptor类

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
                    throws IOException {
                ClientHttpResponse response = execution.execute(request, body);
                logger.debug("request method:" + request.getMethod());
                logger.debug("request URI:" + request.getURI());
                logger.debug("request headers:" + request.getHeaders());
                logger.debug("request body:" + new String(body, Charset.forName("UTF-8")));
                logger.debug("response status code:" + response.getStatusCode());
                logger.debug("response headers:" + response.getHeaders());
                logger.debug("response body:" + IOUtils.toString(response.getBody(), "UTF-8"));

                return response;
            }

谢谢

1 回答

相关问题