简介:
当我们与第三方系统交互,通常接口返回数据,有的时候第三方接口再非正常响应结果时,会将返回的具体信息放置body,HTTP状态码为非200,此时restTemplate设置不对会任务此次请求失败,而直接报异常。举例说明:
那么再这种请求下我们如何直接获取到对方的返回body信息呢?
解决办法:importorg.springframework.http.client.ClientHttpResp
当我们与第三方系统交互,通常接口返回数据,有的时候第三方接口再非正常响应结果时,会将返回的具体信息放置body,HTTP状态码为非200,此时restTemplate设置不对会任务此次请求失败,而直接报异常。
举例说明:
解决办法:
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.web.client.ResponseErrorHandler;
import java.io.IOException;
/**
* 当服务端自定义400或500错误返回体时,使用restTemplate 请求接收不到消息体。
* restTemplate 默认只会返回状态码为200的消息体,需要重写
* @author dengshiling
*/
public class FacePlusThrowErrorHandler implements ResponseErrorHandler {
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
return false;
}
@Override
public void handleError(ClientHttpResponse response) throws IOException {
}
}
/**
* restTemplate 针对https ssl认证
* 并接收自定义500错误返回体
* @return
*/
@Bean(name = "restTemplateForHttpsIgnoreError")
public RestTemplate newRestTemplateForHttpsIgnoreError() {
/**jdk自带的实现*/
RestTemplate restTemplate = new RestTemplate();
HttpComponentsClientHttpRequestFactory simpleClientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
/**设置连接超时*/
simpleClientHttpRequestFactory.setConnectTimeout(60000);
simpleClientHttpRequestFactory.setReadTimeout(60000);
restTemplate.setRequestFactory(simpleClientHttpRequestFactory);
restTemplate.setErrorHandler(new FacePlusThrowErrorHandler());
StringHttpMessageConverter m = new StringHttpMessageConverter(Charset.forName("UTF-8"));
restTemplate.getMessageConverters().add(m);
return restTemplate;
}
在使用的地方注入:
@Autowired
@Qualifier("restTemplateForHttpsIgnoreError")
private RestTemplate restTemplateHttps;