zoukankan      html  css  js  c++  java
  • RestTemplate发送请求并携带header信息 RestTemplate post json格式带header信息

    原文地址:  http://www.cnblogs.com/hujunzheng/p/6018505.html

    RestTemplate发送请求并携带header信息

     

    v1、使用restTemplate的postForObject方法

      注:目前没有发现发送携带header信息的getForObject方法。

    复制代码
    HttpHeaders headers = new HttpHeaders();
    Enumeration<String> headerNames = request.getHeaderNames();
    while (headerNames.hasMoreElements()) {
      String key = (String) headerNames.nextElement();
      String value = request.getHeader(key);
      headers.add(key, value);
    }        
    String restStrResult = restTemplate.postForObject(url, /*携带header*/new HttpEntity<String>(headers), String.class,
                 /*携带parameter*/request.getParameterMap());
    复制代码

    v2、使用restTemplate

    复制代码
    import java.util.Enumeration;
    import java.util.Map;
    import javax.servlet.ServletRequest;
    import javax.servlet.http.HttpServletRequest;
    import org.springframework.http.HttpEntity;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpMethod;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.client.RestTemplate;
    
    public class RestTemplateUtil {
        
        private RestTemplate restTemplate;
        
        public void setRestTemplate(RestTemplate restTemplate) {
            this.restTemplate = restTemplate;
        }
    
        public String post(ServletRequest req, String url, Map<String, ?> params) {
            ResponseEntity<String> rss = request(req, url, HttpMethod.POST, params);
            return rss.getBody();
        }
    
        public String get(ServletRequest req, String url, Map<String, ?> params) {
            ResponseEntity<String> rss = request(req, url, HttpMethod.GET, params);
            return rss.getBody();
        }
        
        public String delete(ServletRequest req, String url, Map<String, ?> params) {
            ResponseEntity<String> rss = request(req, url, HttpMethod.DELETE, params);
            return rss.getBody();
        }
        
        public String put(ServletRequest req, String url, Map<String, ?> params) {
            ResponseEntity<String> rss = request(req, url, HttpMethod.PUT, params);
            return rss.getBody();
        }
        
        /**
         * @param req
         * @param url
         * @param method
         * @param params maybe null
         * @return
         */
        private ResponseEntity<String> request(ServletRequest req, String url, HttpMethod method, Map<String, ?> params) {
            HttpServletRequest request = (HttpServletRequest) req;
            //获取header信息
            HttpHeaders requestHeaders = new HttpHeaders();
            Enumeration<String> headerNames = request.getHeaderNames();
            while (headerNames.hasMoreElements()) {
              String key = (String) headerNames.nextElement();
              String value = request.getHeader(key);
              requestHeaders.add(key, value);
            }
            //获取parameter信息
            if(params == null) {
                params = request.getParameterMap();
            }
            
            HttpEntity<String> requestEntity = new HttpEntity<String>(null, requestHeaders);
            ResponseEntity<String> rss = restTemplate.exchange(url, method, requestEntity, String.class, params);
            return rss;
        }
    }
    复制代码

    v 3.restTemplate以json格式发送post请求

      1.发送请求

    复制代码
      public String _post(ServletRequest req, String url, Map<String, ?> params) {
            HttpServletRequest request = (HttpServletRequest) req;
            //拿到header信息
            HttpHeaders requestHeaders = new HttpHeaders();
            requestHeaders.setContentType(MediaType.APPLICATION_JSON);
            Enumeration<String> headerNames = request.getHeaderNames();
            while (headerNames.hasMoreElements()) {
              String key = (String) headerNames.nextElement();
              String value = request.getHeader(key);
              requestHeaders.add(key, value);
            }
            net.sf.json.JSONObject jsonParams = net.sf.json.JSONObject.fromObject(params);
            HttpEntity<net.sf.json.JSONObject> requestEntity = new HttpEntity<net.sf.json.JSONObject>(jsonParams, requestHeaders);
            String result = restTemplate.postForObject(url, requestEntity, String.class);
            return result;
        }
    复制代码

      2.接收处理

    复制代码
       @RequestMapping("/xxx")  
        @ResponseBody  
        public String xxx(HttpServletRequest request) throws IOException {  
      
            String jsonString = getBodyString(request.getReader());  
      
            JSONObject jbJsonObject = new JSONObject().fromObject(jsonString);  
      
            User user = (User) JSONObject.toBean(jbJsonObject, User.class);  
            System.out.println(jbJsonObject);  
            System.out.println("id:" + user.getUserName());return null;  
      
        }  
      
        @RequestMapping("/xxx2")  
        @ResponseBody  
        public String xxx2(User user) throws IOException {  
      
            System.out.println("---------------");  
            System.out.println(user.getUserName());  
            System.out.println(user.getPassWord());  
            System.out.println("---------------");  
      
            if (true) {  
                return "success";  
            } else {  
                return "fail";  
            }  
      
        }  
    
      
      public String getBodyString(BufferedReader br) { 
        String inputLine; 
        String str = ""; 
        try { 
          while ((inputLine = br.readLine()) != null) { 
          str += inputLine; 
        } 
          br.close(); 
        } catch (IOException e) { 
          System.out.println("IOException: " + e); 
        } 
        return str; 
      }
    复制代码

    v4. RestTemplate 的两个 postForObject方法的使用

    复制代码
      private static String post(String url, JSONObject params, MediaType mediaType) {
            RestTemplate restTemplate = new RestTemplate();
            //拿到header信息
            HttpHeaders requestHeaders = new HttpHeaders();
            requestHeaders.setContentType(mediaType);
            HttpEntity<JSONObject> requestEntity = (mediaType == MediaType.APPLICATION_JSON || mediaType == MediaType.APPLICATION_JSON_UTF8) ? 
                    new HttpEntity<JSONObject>(params, requestHeaders) : new HttpEntity<JSONObject>(null, requestHeaders);
            restTemplate.setErrorHandler(new ResponseErrorHandler() {
                
                @Override
                public boolean hasError(ClientHttpResponse response) throws IOException {
                    return response.getStatusCode().value() != HttpServletResponse.SC_OK;
                }
                
                @Override
                public void handleError(ClientHttpResponse response) throws IOException {
                    BufferedReader br = new BufferedReader(new InputStreamReader(response.getBody()));
                    String str = null;
                    while((str = br.readLine()) != null) {
                        System.out.println(str);
                    }
                }
            });
            String result = (mediaType == MediaType.APPLICATION_JSON || mediaType == MediaType.APPLICATION_JSON_UTF8)  ? 
                    restTemplate.postForObject(url, requestEntity, String.class) : restTemplate.postForObject(expandURL(url, params.keySet()), requestEntity, String.class, params);
            return result;
        }
        
        
        private static String expandURL(String url, Set<?> keys){
            final Pattern QUERY_PARAM_PATTERN = Pattern.compile("([^&=]+)(=?)([^&]+)?");
            Matcher mc = QUERY_PARAM_PATTERN.matcher(url);
            StringBuilder sb = new StringBuilder(url);
            if(mc.find()) {
                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();
        }
    复制代码

    v5.最强版RestTemplateUtils

    复制代码
    import com.alibaba.fastjson.JSONObject;
    import org.springframework.http.HttpEntity;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.MediaType;
    import org.springframework.http.client.ClientHttpResponse;
    import org.springframework.http.converter.FormHttpMessageConverter;
    import org.springframework.util.LinkedMultiValueMap;
    import org.springframework.util.MultiValueMap;
    import org.springframework.web.client.ResponseErrorHandler;
    import org.springframework.web.client.RestTemplate;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Set;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * @Title: RestTemplateUtils.java
     * @Prject: sensorsdata
     * @Package: com.springboottest.sensorsdata.utils
     * @Description: TODO
     * @author: hujunzheng
     * @date: 2017年4月20日 下午2:07:18
     * @version: V1.0
     */
    public class RestTemplateUtils {
    
        /**
         * @ClassName: DefaultResponseErrorHandler
         * @Description: TODO
         * @author: hujunzheng
         * @date: 2017年4月20日 下午2:15:27
         */
        private static class DefaultResponseErrorHandler implements ResponseErrorHandler {
    
            @Override
            public boolean hasError(ClientHttpResponse response) throws IOException {
                return response.getStatusCode().value() != HttpServletResponse.SC_OK;
            }
    
            @Override
            public void handleError(ClientHttpResponse response) throws IOException {
                BufferedReader br = new BufferedReader(new InputStreamReader(response.getBody()));
                StringBuilder sb = new StringBuilder();
                String str = null;
                while ((str = br.readLine()) != null) {
                    sb.append(str);
                }
                try {
                    throw new Exception(sb.toString());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * @param url
         * @param params
         * @return
         * @Title: get
         * @author: hujunzheng
         * @Description: TODO
         * @return: String
         */
        public static String get(String url, JSONObject params) {
            RestTemplate restTemplate = new RestTemplate();
            restTemplate.setErrorHandler(new DefaultResponseErrorHandler());
            String response = restTemplate.getForObject(expandURL(url, params.keySet()), String.class, params);
            return response;
        }
    
        /**
         * @param url
         * @param params
         * @param mediaType
         * @return
         * @Title: post
         * @author: hujunzheng
         * @Description: 将参数都拼接在url之后
         * @return: String
         */
        public static String post(String url, JSONObject params, MediaType mediaType) {
            RestTemplate restTemplate = new RestTemplate();
            // 拿到header信息
            HttpHeaders requestHeaders = new HttpHeaders();
            requestHeaders.setContentType(mediaType);
            HttpEntity<JSONObject> requestEntity = (mediaType == MediaType.APPLICATION_JSON
                    || mediaType == MediaType.APPLICATION_JSON_UTF8) ? new HttpEntity<JSONObject>(params, requestHeaders)
                    : new HttpEntity<JSONObject>(null, requestHeaders);
            restTemplate.setErrorHandler(new DefaultResponseErrorHandler());
            String result = (mediaType == MediaType.APPLICATION_JSON || mediaType == MediaType.APPLICATION_JSON_UTF8)
                    ? restTemplate.postForObject(url, requestEntity, String.class)
                    : restTemplate.postForObject(expandURL(url, params.keySet()), requestEntity, String.class, params);
            return result;
        }
    
    
        /**
         * @param url
         * @param params
         * @param mediaType
         * @param clz
         * @return
         * @Title: post
         * @author: hujunzheng
         * @Description: 发送json或者form格式数据
         * @return: String
         */
        public static <T> T post(String url, JSONObject params, MediaType mediaType, Class<T> clz) {
            RestTemplate restTemplate = new RestTemplate();
            //这是为 MediaType.APPLICATION_FORM_URLENCODED 格式HttpEntity 数据 添加转换器
            //还有就是,如果是APPLICATION_FORM_URLENCODED方式发送post请求,
            //也可以直接HttpHeaders requestHeaders = new HttpHeaders(createMultiValueMap(params),true),就不用增加转换器了
            restTemplate.getMessageConverters().add(new FormHttpMessageConverter());
            // 设置header信息
            HttpHeaders requestHeaders = new HttpHeaders();
            requestHeaders.setContentType(mediaType);
    
            HttpEntity<?> requestEntity = (
                    mediaType == MediaType.APPLICATION_JSON
                            || mediaType == MediaType.APPLICATION_JSON_UTF8)
                    ? new HttpEntity<JSONObject>(params, requestHeaders)
                    : (mediaType == MediaType.APPLICATION_FORM_URLENCODED
                        ? new HttpEntity<MultiValueMap>(createMultiValueMap(params), requestHeaders)
                        : new HttpEntity<>(null, requestHeaders));
    
            restTemplate.setErrorHandler(new DefaultResponseErrorHandler());
            T result = (mediaType == MediaType.APPLICATION_JSON || mediaType == MediaType.APPLICATION_JSON_UTF8)
                    ? restTemplate.postForObject(url, requestEntity, clz)
                    : restTemplate.postForObject(mediaType == MediaType.APPLICATION_FORM_URLENCODED
                        ? url
                        : expandURL(url, params.keySet()), requestEntity, clz, params);
    
            return result;
        }
    
        private static MultiValueMap<String, String> createMultiValueMap(JSONObject params) {
            MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
            for(String key : params.keySet()) {
                if(params.get(key) instanceof List) {
                    for(Iterator<String> it=((List<String>) params.get(key)).iterator(); it.hasNext(); ) {
                        String value = it.next();
                        map.add(key, value);
                    }
                } else {
                    map.add(key, params.getString(key));
                }
            }
            return map;
        }
    
        /**
         * @param url
         * @param keys
         * @return
         * @Title: expandURL
         * @author: hujunzheng
         * @Description: TODO
         * @return: String
         */
        private static String expandURL(String url, Set<?> keys) {
            final Pattern QUERY_PARAM_PATTERN = Pattern.compile("([^&=]+)(=?)([^&]+)?");
            Matcher mc = QUERY_PARAM_PATTERN.matcher(url);
            StringBuilder sb = new StringBuilder(url);
            if (mc.find()) {
                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();
        }
    }
    复制代码
  • 相关阅读:
    Python3常用内置函数
    你所不知道的Python奇技淫巧
    Django1.8教程——从零开始搭建一个完整django博客(三)
    Django1.8教程——从零开始搭建一个完整django博客(二)
    Django1.8教程——从零开始搭建一个完整django博客(一)
    Django1.8教程——安装Django
    Django实际站点项目开发经验谈
    docker swarm集群搭建
    kubernetes 集群的安装部署
    linux下简洁优化部署tomcat应用
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/10134057.html
Copyright © 2011-2022 走看看