package com.cloud.common.utils; import com.alibaba.fastjson.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.converter.FormHttpMessageConverter; import org.springframework.stereotype.Component; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import javax.annotation.PostConstruct; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author lp */ @Component public class RestTemplateUtil { private static final Pattern QUERY_PARAM_PATTREN = Pattern.compile("([^&=]+)(=?)([^&]+)?"); @Autowired private RestTemplate restTemplate; private static RestTemplateUtil restTemplateUtil; @PostConstruct public void init() { restTemplateUtil = this; restTemplateUtil.restTemplate = this.restTemplate; } /** * httpclient POST调用,可以携带token,[-封装的postForEntity接口-] * @param url 请求地址 * @param paramMap 请求参数,必须是MultiValueMap类型 * @param responseType 返回类型 * @param isNeedToken 请求header是否需要携带token * @return T * @throws RestClientException */ public static T postHeaderForEntity(String url, MultiValueMap paramMap, Class responseType, boolean isNeedToken) throws RestClientException { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); if(isNeedToken) { headers.add("Authorization", "Bearer " + RequestUtil.getTokenByParam()); } HttpEntity> request = new HttpEntity>(paramMap, headers); return restTemplateUtil.restTemplate.postForEntity(url, request, responseType).getBody(); } public static T getHeaderForEntity(String url, MultiValueMap paramMap, Class responseType, boolean isNeedToken) throws RestClientException { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); if(isNeedToken) { headers.add("Authorization", "Bearer " + RequestUtil.getTokenByParam()); } HttpEntity> request = new HttpEntity>(paramMap, headers); return restTemplateUtil.restTemplate.exchange(url, HttpMethod.GET, request, responseType).getBody(); } /** * @param url * @param params * @return * @Title: get * @author: lp * @Description: TODO * @return: String */ public static String get(String url, JSONObject params,boolean isNeedToken) { if(isNeedToken){ params.put("access_token", RequestUtil.getTokenByParam()); } String response = restTemplateUtil.restTemplate.getForObject(expandURL(url, params.keySet()), String.class, params); return response; } /** * @param url * @param params * @param mediaType * @param isNeedToken * @return * @Title: post * @author: lp * @Description: 将参数都拼接在url之后 * @return: String */ public static String post(String url, JSONObject params, MediaType mediaType,boolean isNeedToken) { // 拿到header信息 HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.setContentType(mediaType); if(isNeedToken) { requestHeaders.add("Authorization", "Bearer " + RequestUtil.getTokenByParam()); } HttpEntity requestEntity = (mediaType == MediaType.APPLICATION_JSON || mediaType == MediaType.APPLICATION_JSON_UTF8) ? new HttpEntity(params, requestHeaders) : new HttpEntity(null, requestHeaders); String result = (mediaType == MediaType.APPLICATION_JSON || mediaType == MediaType.APPLICATION_JSON_UTF8) ? restTemplateUtil.restTemplate.postForObject(url, requestEntity, String.class) : restTemplateUtil.restTemplate.postForObject(expandURL(url, params.keySet()), requestEntity, String.class, params); return result; } /** * @param url * @param params * @param mediaType * @param clz * @return * @Title: post * @author: lp * @Description: 发送json或者form格式数据 * @return: String */ public static T post(String url, JSONObject params, MediaType mediaType, Class clz,boolean isNeedToken) { //这是为 MediaType.APPLICATION_FORM_URLENCODED 格式HttpEntity 数据 添加转换器 //还有就是,如果是APPLICATION_FORM_URLENCODED方式发送post请求, //也可以直接HttpHeaders requestHeaders = new HttpHeaders(createMultiValueMap(params),true),就不用增加转换器了 restTemplateUtil.restTemplate.getMessageConverters().add(new FormHttpMessageConverter()); // 设置header信息 HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.setContentType(mediaType); if(isNeedToken) { requestHeaders.add("Authorization", "Bearer " + RequestUtil.getTokenByParam()); } HttpEntity requestEntity = ( mediaType == MediaType.APPLICATION_JSON || mediaType == MediaType.APPLICATION_JSON_UTF8) ? new HttpEntity(params, requestHeaders) : (mediaType == MediaType.APPLICATION_FORM_URLENCODED ? new HttpEntity(createMultiValueMap(params), requestHeaders) : new HttpEntity<>(null, requestHeaders)); T result = (mediaType == MediaType.APPLICATION_JSON || mediaType == MediaType.APPLICATION_JSON_UTF8) ? restTemplateUtil.restTemplate.postForObject(url, requestEntity, clz) : restTemplateUtil.restTemplate.postForObject(mediaType == MediaType.APPLICATION_FORM_URLENCODED ? url : expandURL(url, params.keySet()), requestEntity, clz, params); return result; } private static MultiValueMap createMultiValueMap(JSONObject params) { MultiValueMap map = new LinkedMultiValueMap<>(); for(String key : params.keySet()) { if(params.get(key) instanceof List) { for(Iterator it = ((List) params.get(key)).iterator(); it.hasNext(); ) { String value = it.next(); map.add(key, value); } } else { map.add(key, params.getString(key)); } } return map; } private static String expandURL(String url, Set keys) { Matcher mc = RestTemplateUtil.QUERY_PARAM_PATTREN.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(); } }