RestTemplate比自己封裝的http工具靠譜,畢竟feign和ribbon也用這個,沒有那么多需要考慮的地方,
apollo也基於restTemplate封裝了一個工具類。默認用的是HttpURLConnection。和okhttp比起來也差不了多少,本人在本地測了一下
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.http.*; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.converter.FormHttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.util.CollectionUtils; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.client.RestTemplate; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Map; /** * @author liyhu * @date 2019年09月06日 */ public class RestTemplateUtil { private static Logger log = LoggerFactory.getLogger(RestTemplateUtil.class); /** * 實際執行請求的template */ private static RestTemplate restTemplate = new RestTemplate(); static { // restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory()); StringHttpMessageConverter converter = new StringHttpMessageConverter(); converter.setDefaultCharset(StandardCharsets.UTF_8); MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter(); restTemplate.setMessageConverters(Arrays.asList(converter,jackson2HttpMessageConverter,formHttpMessageConverter)); } public static String put( Object entity,String url){ return put(entity,url,String.class); } public static <T>T put(Object entity,String url, Class<T> cls){ logParams(RequestMethod.PUT,url,entity); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON_UTF8); HttpEntity<Object> request = new HttpEntity<>(entity,headers); ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.PUT, request, cls); T result = exchange.getBody(); log.info("put result:{}",result); return result; } public static String post( Object entity,String url){ return post(url,entity,String.class); } /** * 得到 參數的字符串 * @param entity * @return */ private static String getStringParams(Object entity){ if(entity instanceof String){ return entity.toString(); } return JsonUtil.toJsonString(entity); } private static void logParams(RequestMethod method, String url, Object entity){ String params=getStringParams(entity); log.info("{} url:{} params:{}",method,url,params); } /** * json請求,可以指定header */ public static <T>T post(String url, Object entity, Map<String,String> headerMap,Class<T> cls){ HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON_UTF8); if(!CollectionUtils.isEmpty(headerMap)){ for (Map.Entry<String, String> entry : headerMap.entrySet()) { headers.set(entry.getKey(),entry.getValue()); } } HttpEntity<Object> request = new HttpEntity<>(entity,headers); return executePost(url,request,cls); } /** * json請求 */ public static <T>T post(String url, Object entity, Class<T> cls){ return post(url,entity,null,cls); } /** * 表單請求 */ public static <T>T formPost(String url, MultiValueMap<String, Object> params, Class<T> cls){ HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); HttpEntity<Object> request = new HttpEntity<>(params,headers); return executePost(url,request,cls); } /** * post 請求 */ private static <T>T executePost(String url, HttpEntity<Object> request, Class<T> cls){ logParams(RequestMethod.POST,url,request); ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.POST, request, cls); T body = exchange.getBody(); log.info("post result:{}", body); return body; } public static <T>T upload(String url, Map<String, Object> updateMap, Class<T> returnClass,Resource resource) { MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); parts.add("file",resource); for (Map.Entry<String, Object> entry : updateMap.entrySet()) { Object value = entry.getValue(); String key = entry.getKey(); log.info("--->upload param key:{},val:{}",key,value); parts.add(key,value); } HttpEntity<Object> httpEntity = new HttpEntity<>(parts, headers); ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.POST, httpEntity, returnClass); T body = exchange.getBody(); return null; } private static <T>T executeGet(String url, HttpEntity<Object> request, Class<T> cls){ logParams(RequestMethod.GET,url,request); ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.GET, request, cls); T body = exchange.getBody(); log.info("get result:{}", body); return body; } public static String get(String url){ return get(url,null,String.class); } public static <T>T get(String url, Map<String,Object> params,Map<String,String> headerMap, Class<T> cls){ String reqUrl = buildUrl(url,params); HttpHeaders headers = new HttpHeaders(); if(headerMap != null){ for (Map.Entry<String, String> entry : headerMap.entrySet()) { headers.set(entry.getKey(),entry.getValue()); } } HttpEntity<Object> request = new HttpEntity<>(headers); return executeGet(reqUrl,request,cls); } /** * get 請求 */ public static <T>T get(String url, Map<String,Object> params, Class<T> cls){ String reqUrl = buildUrl(url,params); log.info("get url:{}",reqUrl); T result = restTemplate.getForObject(reqUrl, cls); log.info("get result:{}", getStringParams(result)); return result; } /** * 設置的url */ public static String buildUrl(String url, Map<String,Object> params){ StringBuilder urlBuiler=new StringBuilder(url); if(!url.contains("?")){ urlBuiler.append("?"); } if(!CollectionUtils.isEmpty(params)){ for (Map.Entry<String, Object> entry : params.entrySet()) { urlBuiler.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } } return urlBuiler.toString(); } }
使用攔截器
package jpush.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpRequestExecution; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpResponse; public class LoggingRequestInterceptor implements ClientHttpRequestInterceptor { final static Logger log = LoggerFactory.getLogger(LoggingRequestInterceptor.class); @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { traceRequest(request, body); ClientHttpResponse response = execution.execute(request, body); traceResponse(response); return response; } private void traceRequest(HttpRequest request, byte[] body) throws IOException { log.info("===========================request begin================================================"); log.debug("URI : {}", request.getURI()); log.debug("Method : {}", request.getMethod()); log.debug("Headers : {}", request.getHeaders() ); log.debug("Request body: {}", new String(body, "UTF-8")); log.info("==========================request end================================================"); } private void traceResponse(ClientHttpResponse response) throws IOException { StringBuilder inputStringBuilder = new StringBuilder(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getBody(), "UTF-8")); String line = bufferedReader.readLine(); while (line != null) { inputStringBuilder.append(line); inputStringBuilder.append('\n'); line = bufferedReader.readLine(); } log.info("============================response begin=========================================="); log.debug("Status code : {}", response.getStatusCode()); log.debug("Status text : {}", response.getStatusText()); log.debug("Headers : {}", response.getHeaders()); log.debug("Response body: {}", inputStringBuilder.toString()); log.info("=======================response end================================================="); } }
RestTemplate代碼
package jpush.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.http.*; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.converter.FormHttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.util.CollectionUtils; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.client.RestTemplate; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; public class RestTemplateUtil { private static Logger log = LoggerFactory.getLogger(RestTemplateUtil.class); /** * 實際執行請求的template */ private static RestTemplate restTemplate = new RestTemplate(); static { // restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory()); StringHttpMessageConverter converter = new StringHttpMessageConverter(); converter.setDefaultCharset(StandardCharsets.UTF_8); MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter(); restTemplate.setMessageConverters(Arrays.asList(converter,jackson2HttpMessageConverter,formHttpMessageConverter)); List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>(); interceptors.add(new LoggingRequestInterceptor()); restTemplate.setInterceptors(interceptors); } public static String put( Object entity,String url){ return put(entity,url,String.class); } public static <T>T put(Object entity,String url, Class<T> cls){ // logParams(RequestMethod.PUT,url,entity); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON_UTF8); HttpEntity<Object> request = new HttpEntity<>(entity,headers); ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.PUT, request, cls); T result = exchange.getBody(); // log.info("put result:{}",result); return result; } public static String post( Object entity,String url){ return post(url,entity,String.class); } /** * 得到 參數的字符串 * @param entity * @return */ private static String getStringParams(Object entity){ if(entity instanceof String){ return entity.toString(); } return JsonUtil.toJsonString(entity); } // private static void logParams(RequestMethod method, String url, Object entity){ // String params=getStringParams(entity); // log.info("{} url:{} params:{}",method,url,params); // } /** * json請求,可以指定header */ public static <T>T post(String url, Object entity, Map<String,String> headerMap,Class<T> cls){ HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON_UTF8); if(!CollectionUtils.isEmpty(headerMap)){ for (Map.Entry<String, String> entry : headerMap.entrySet()) { headers.set(entry.getKey(),entry.getValue()); } } HttpEntity<Object> request = new HttpEntity<>(entity,headers); return executePost(url,request,cls); } /** * json請求 */ public static <T>T post(String url, Object entity, Class<T> cls){ return post(url,entity,null,cls); } /** * 表單請求 */ public static <T>T formPost(String url, MultiValueMap<String, Object> params, Class<T> cls){ HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); HttpEntity<Object> request = new HttpEntity<>(params,headers); return executePost(url,request,cls); } /** * post 請求 */ private static <T>T executePost(String url, HttpEntity<Object> request, Class<T> cls){ // logParams(RequestMethod.POST,url,request); ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.POST, request, cls); T body = exchange.getBody(); log.info("post result:{}", body); return body; } public static <T>T upload(String url, Map<String, Object> updateMap, Class<T> returnClass,Resource resource) { MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); parts.add("file",resource); for (Map.Entry<String, Object> entry : updateMap.entrySet()) { Object value = entry.getValue(); String key = entry.getKey(); log.info("--->upload param key:{},val:{}",key,value); parts.add(key,value); } HttpEntity<Object> httpEntity = new HttpEntity<>(parts, headers); ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.POST, httpEntity, returnClass); T body = exchange.getBody(); return null; } private static <T>T executeGet(String url, HttpEntity<Object> request, Class<T> cls){ // logParams(RequestMethod.GET,url,request); ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.GET, request, cls); T body = exchange.getBody(); log.info("get result:{}", body); return body; } public static String get(String url){ return get(url,null,String.class); } public static <T>T get(String url, Map<String,Object> params,Map<String,String> headerMap, Class<T> cls){ String reqUrl = buildUrl(url,params); HttpHeaders headers = new HttpHeaders(); if(headerMap != null){ for (Map.Entry<String, String> entry : headerMap.entrySet()) { headers.set(entry.getKey(),entry.getValue()); } } HttpEntity<Object> request = new HttpEntity<>(headers); return executeGet(reqUrl,request,cls); } /** * get 請求 */ public static <T>T get(String url, Map<String,Object> params, Class<T> cls){ String reqUrl = buildUrl(url,params); // log.info("get url:{}",reqUrl); T result = restTemplate.getForObject(reqUrl, cls); // log.info("get result:{}", getStringParams(result)); return result; } /** * 設置的url */ public static String buildUrl(String url, Map<String,Object> params){ StringBuilder urlBuiler=new StringBuilder(url); if(!url.contains("?")){ urlBuiler.append("?"); } if(!CollectionUtils.isEmpty(params)){ for (Map.Entry<String, Object> entry : params.entrySet()) { urlBuiler.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } } return urlBuiler.toString(); } }