系统业务免不了与第三方公司进行交互,需要远程调用,RestTemplate到底是什么玩意?
RestTemplate
是Spring提供的用于访问Rest
服务的客户端工具,它提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。
弱弱呼吁一句:对于那些在Spring
环境下还在使用HttpClient
(或其它Client)的同学,今儿看完本文后,建议切换到RestTemplate
(有特殊需求的当然除外喽~)。
RestTemplate
简化了与http服务的通信,程序代码可以给它提供URL,并提取结果。它默认使用的JDK 的HttpURLConnection
进行通信,然而我们是可以通过RestTemplate.setRequestFactory
切换到不同的HTTP源:如Apache HttpComponents
、Netty
、OkHttp
等等。
关于响应:
xxxForObject:返回响应体(也就直接是body体力的内容) (T)
xxxForEntity:返回的相应行、响应头、响应码、响应体等等 (ResponseEntity<T>)
xxxForLocation:提交成功之后,返回新资源的URI。这个只需要服务提供者返回一个 URI 即可,该 URI 表示新资源的位置,可谓非常轻量。 (URI)
注意:使用字符串类型的url默认会对url进行转义,如http://example.com/hotel list
在执行时会转义为http://example.com/hotel%20list
,隐式的转义这样是没有问题的。但如果你自己已经转义过了,那就不ok了。
若不想要这种隐式的转义,建议使用URI(URI uri = uriComponents.toUri()
)来构造。
请求方式、载体、编码等都需要注意
public class RestTemplateUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(RestTemplateUtil.class);
/**
* RestTemplate 工具方法
* @param url
* @param object
* @return
*/
public static String postRestTemplate(String url, Map<String,Object> object){
SimpleClientHttpRequestFactory httpRequestFactory = new SimpleClientHttpRequestFactory();
httpRequestFactory.setReadTimeout(35000);
httpRequestFactory.setConnectTimeout(5000);
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
List<MediaType> supportedMediaTypes = new ArrayList<>();
supportedMediaTypes.add(MediaType.APPLICATION_JSON);
supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
supportedMediaTypes.add(MediaType.APPLICATION_PDF);
supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XML);
supportedMediaTypes.add(MediaType.IMAGE_GIF);
supportedMediaTypes.add(MediaType.IMAGE_JPEG);
supportedMediaTypes.add(MediaType.IMAGE_PNG);
supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
supportedMediaTypes.add(MediaType.TEXT_HTML);
supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
supportedMediaTypes.add(MediaType.TEXT_PLAIN);
supportedMediaTypes.add(MediaType.TEXT_XML);
fastConverter.setSupportedMediaTypes(supportedMediaTypes);
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
fastConverter.setFastJsonConfig(fastJsonConfig);
messageConverters.add(fastConverter);
RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
restTemplate.setMessageConverters(messageConverters);
LOGGER.info("请求地址"+url);
LOGGER.info("入参"+ JSON.toJSONString(object));
String s = restTemplate.postForObject(url, object, String.class);
LOGGER.info(url+"出参" + s);
return s;
}
/**
* RestTemplate 工具方法
* @param url
* @param object
* @return
*/
public static String postRestTemplate(String url, Map<String,Object> object,Map<String, String> headers){
RestTemplate restTemplate = getRestTemplate();
HttpHeaders httpHeaders = new HttpHeaders();
if (Objects.nonNull(headers)) {
headers.forEach((key, value) -> {
httpHeaders.add(key, value);
});
}
HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<Map<String, Object>>(object, httpHeaders);
LOGGER.info("请求地址"+url+"Header"+JSON.toJSONString(object));
LOGGER.info("请求地址"+url);
LOGGER.info("入参"+ JSON.toJSONString(httpEntity));
String s = restTemplate.postForObject(url, httpEntity, String.class);
LOGGER.info("出参" + s);
return s;
}
/**
* RestTemplate 工具方法
* @param url
* @param object
* @return
*/
public static String postRestTemplate(String url, Map<String,Object> object,Map<String, String> headers,SmpSendLogBO reqBO ){
RestTemplate restTemplate = getRestTemplate();
HttpHeaders httpHeaders = new HttpHeaders();
if (Objects.nonNull(headers)) {
headers.forEach((key, value) -> {
httpHeaders.add(key, value);
});
}
HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<Map<String, Object>>(object, httpHeaders);
LOGGER.info("请求地址"+url+" Header"+JSON.toJSONString(object));
reqBO.setSendData( new Gson().toJson(httpEntity));
LOGGER.info("入参"+ new Gson().toJson(httpEntity));
String s = restTemplate.postForObject(url, httpEntity, String.class);
reqBO.setReceiveData(s);
LOGGER.info("出参" + s);
return s;
}
public static RestTemplate getRestTemplate() {
SimpleClientHttpRequestFactory httpRequestFactory = new SimpleClientHttpRequestFactory();
httpRequestFactory.setReadTimeout(35000);
httpRequestFactory.setConnectTimeout(10000);
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
List<MediaType> supportedMediaTypes = new ArrayList<>();
supportedMediaTypes.add(MediaType.APPLICATION_JSON);
supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
supportedMediaTypes.add(MediaType.APPLICATION_PDF);
supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XML);
supportedMediaTypes.add(MediaType.IMAGE_GIF);
supportedMediaTypes.add(MediaType.IMAGE_JPEG);
supportedMediaTypes.add(MediaType.IMAGE_PNG);
supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
supportedMediaTypes.add(MediaType.TEXT_HTML);
supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
supportedMediaTypes.add(MediaType.TEXT_PLAIN);
supportedMediaTypes.add(MediaType.TEXT_XML);
fastConverter.setSupportedMediaTypes(supportedMediaTypes);
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
fastConverter.setFastJsonConfig(fastJsonConfig);
messageConverters.add(fastConverter);
RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
restTemplate.setMessageConverters(messageConverters);
return restTemplate;
}
}