RestTemplate工具類


 

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();
    }


}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM