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> T postHeaderForEntity(String url, MultiValueMap<String, String> paramMap, Class<T> responseType, boolean isNeedToken)
|
throws RestClientException {
|
HttpHeaders headers = new HttpHeaders();
|
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
|
if(isNeedToken) {
|
headers.add("Authorization", "Bearer " + RequestUtil.getTokenByParam());
|
}
|
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(paramMap, headers);
|
return restTemplateUtil.restTemplate.postForEntity(url, request, responseType).getBody();
|
}
|
|
|
public static <T> T getHeaderForEntity(String url, MultiValueMap<String, Object> paramMap, Class<T> responseType, boolean isNeedToken)
|
throws RestClientException {
|
HttpHeaders headers = new HttpHeaders();
|
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
|
if(isNeedToken) {
|
headers.add("Authorization", "Bearer " + RequestUtil.getTokenByParam());
|
}
|
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<MultiValueMap<String, Object>>(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<JSONObject> requestEntity = (mediaType == MediaType.APPLICATION_JSON
|
|| mediaType == MediaType.APPLICATION_JSON_UTF8) ? new HttpEntity<JSONObject>(params, requestHeaders)
|
: new HttpEntity<JSONObject>(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> T post(String url, JSONObject params, MediaType mediaType, Class<T> 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<JSONObject>(params, requestHeaders)
|
: (mediaType == MediaType.APPLICATION_FORM_URLENCODED
|
? new HttpEntity<MultiValueMap>(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<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;
|
}
|
|
|
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();
|
}
|
|
}
|