RestTemplate使用总结
在实际开发中,很多情况下都需要调用不同项目的接口。此时可以用RestTemplate进行调用。本例以Spring Boot下使用RestTemplate为例。
RestTemplate有三个构造器,可以根据需要使用不同的构造器。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。public RestTemplate() {...}
public RestTemplate(ClientHttpRequestFactory requestFactory) {
this();
this.setRequestFactory(requestFactory);
}
public RestTemplate(List<HttpMessageConverter<?>> messageConverters) {
this.messageConverters = new ArrayList();
this.errorHandler = new DefaultResponseErrorHandler();
this.headersExtractor = new RestTemplate.HeadersExtractor();
Assert.notEmpty(messageConverters, "At least one HttpMessageConverter required");
this.messageConverters.addAll(messageConverters);
this.uriTemplateHandler = initUriTemplateHandler();
}
根据需要创建Bean实例,采用SimpleClientHttpRequestFactory的方式。可以设置连接超时时间等信息
package com.study.config; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; @Configuration @EnableAutoConfiguration @ComponentScan public class Config { @Bean public RestTemplate restTemplate(){ SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); requestFactory.setConnectTimeout(100000); requestFactory.setReadTimeout(100000); RestTemplate restTemplate = new RestTemplate(requestFactory); return restTemplate; } }
设置接口的请求地址及方法名(只测试常用的两种请求get和post)
请求地址常用有以下几种方式
GET请求:
/get_products?name=aa&code=aa123
/get_products
/get_product_details/{code}
POST请求:
/update_product
package com.study.common; public class Constants { public final static String requestUrl = "http://localhost:8080/rest"; public final static String GET_PRODUCTS = "/get_products"; public final static String GET_PRODUCT_DETAILS = "/get_product_details/{code}"; public final static String UPDATE_PRODUCTS = "/update_product"; }
创建RestUtils工具类。RestUtils.request(String url, Map<String,Object> params, HttpMethod httpMethod)方法调用。后面会说明params及url传递的方式
package com.study.utils; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.*; import org.springframework.util.MimeType; import org.springframework.util.MimeTypeUtils; import org.springframework.web.client.RestTemplate; import java.util.Map; import java.util.Set; public class RestUtils<T> { private RestTemplate restTemplate; public RestUtils() { super(); } public RestUtils(RestTemplate restTemplate) { super(); this.restTemplate = restTemplate; } public ServiceResponse<T> request(String url, Map<String, Object> params, HttpMethod httpMethod) { ServiceResponse<T> serviceResponse = new ServiceResponse<>(); try { HttpHeaders headers = new HttpHeaders(); MimeType mimeType = MimeTypeUtils.parseMimeType("application/json"); MediaType mediaType = new MediaType(mimeType.getType(), mimeType.getSubtype()); headers.setContentType(mediaType); HttpEntity<Object> entity = null; if (params == null) { entity = new HttpEntity<>(headers); } else { if (params.containsKey("data")) { entity = new HttpEntity<>(params.get("data"), headers); params.remove("data"); } else { entity = new HttpEntity<>(params, headers); } } ResponseEntity<T> responseEntity = null; if (params == null || params.isEmpty()) { responseEntity = restTemplate.exchange(url, httpMethod, entity, new ParameterizedTypeReference<T>() { }); } else { responseEntity = restTemplate.exchange(expandURL(url, params.keySet()), httpMethod, entity, new ParameterizedTypeReference<T>() { }, params); } serviceResponse.setResult(responseEntity.getBody()); } catch (Exception e) { e.printStackTrace(); serviceResponse.setCode(500); serviceResponse.setDescription(e.getMessage()); } return serviceResponse; } private String expandURL(String url, Set<?> keys) { StringBuffer sb = new StringBuffer(url); if (url.indexOf("?") > 0) { sb.append("&"); } else { sb.append("?"); } for (Object key : keys) { sb.append(key).append("=").append("{").append(key).append("}") .append("&"); } return sb.deleteCharAt(sb.length() - 1).toString(); } }

更多精彩