<!-- Apache Http Begin --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.5</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>fluent-hc</artifactId><version>4.5.5</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId><version>4.5.5</version></dependency><!-- Apache Http End -->
1.1.2 ApacheHttpUtil
package com.zifisense.zetag.server.tms.util;import com.alibaba.fastjson.JSONException;import com.alibaba.fastjson.JSONObject;import org.apache.http.entity.ContentType;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.http.HttpEntity;import org.springframework.http.HttpHeaders;import org.springframework.http.MediaType;import org.springframework.util.CollectionUtils;import org.springframework.util.LinkedMultiValueMap;import org.springframework.util.MultiValueMap;import org.springframework.util.StringUtils;import org.springframework.web.client.RestTemplate;import java.util.HashMap;import java.util.Map;import java.util.Objects;
public final class RestTemplateUtils {
private Logger logger = LoggerFactory.getLogger(RestTemplateUtils.class);
private static RestTemplate restTemplate = new RestTemplate();
/**
* bodyEntity
*/
private HttpEntity httpEntity;
/**
* header
*/
private HttpHeaders httpHeaders;
/**
* contentType
*/
private String contentType;
/**
* requestParams
*/
private HashMap<String, Object> requestParams;
/**
* body Params
*/
private HashMap<String, Object> bodyParams;
private RestTemplateUtils(){}
/**
* 构造函数已经私有化,只能通过create方法构造HttpContent
*
* @return HttpContent
*/
public static RestTemplateUtils create(){return new RestTemplateUtils();}
/**
* get请求返回模板对象
*
* @param url url
* @param clazz T.class
* @param <T> T
* @return T
*/
public <T> T getForObj(String url, Class<T> clazz){
Long startTime = System.currentTimeMillis();
T t = RestTemplateUtils.restTemplate.getForObject(this.buildGetUrl(url), clazz);
logger.info("耗时: {} ms", System.currentTimeMillis() - startTime);return t;}
/**
* @param url
* @return
*/
private String buildGetUrl(String url){
StringBuffer builder = new StringBuffer();
builder.append(url);if(!CollectionUtils.isEmpty(this.requestParams)){if(!url.endsWith("?")){
builder.append("?");}for(String key : this.requestParams.keySet()){if(builder.toString().endsWith("?")){
builder.append(key).append("=").append(this.requestParams.get(key).toString());}else{
builder.append("&").append(key).append("=").append(this.requestParams.get(key).toString());}}}
logger.info("https get url: {}", builder.toString());return builder.toString();}
/**
* post请求返回模板对象
*
* @param url url
* @param clazz t.class
* @param <T> 模板
* @return T
*/
public <T> T postForObj(String url, Class<T> clazz){
this.buildBody();
logger.info("https post url: {}", url);
Long startTime = System.currentTimeMillis();
T t = restTemplate.postForObject(url, this.httpEntity, clazz);
logger.info("耗时: {} ms", System.currentTimeMillis() - startTime);return t;}
/**
* 添加Header内容
*
* @param headerName key
* @param headerValue value
* @return HttpContent
*/
public RestTemplateUtils addHeader(String headerName, String headerValue){if(Objects.isNull(httpHeaders)){
httpHeaders = new HttpHeaders();}
httpHeaders.add(headerName, headerValue);return this;}
/**
* 设置请求体
*
* @param key key
* @param value value
* @return HttpContent
*/
public RestTemplateUtils addRequestParams(String key, Object value){if(Objects.isNull(requestParams)){
requestParams = new HashMap<>();}
requestParams.put(key, value);return this;}
/**
* 设置请求体
*
* @param paramsMap
* @return
*/
public RestTemplateUtils addRequestParamsMap(Map<String, Object> paramsMap){if(Objects.isNull(requestParams)){
requestParams = new HashMap<>();}for(String key : paramsMap.keySet()){
requestParams.put(key, paramsMap.get(key));}return this;}
/**
* 设置请求体
*
* @param key key
* @param value value
* @return HttpContent
*/
public RestTemplateUtils addBody(String key, Object value){if(Objects.isNull(bodyParams)){
bodyParams = new HashMap<>();}
bodyParams.put(key, value);return this;}
/**
* 设置请求体
*
* @param paramsMap
* @return
*/
public RestTemplateUtils addBodyMap(Map<String, Object> paramsMap){if(Objects.isNull(bodyParams)){
bodyParams = new HashMap<>();}for(String key : paramsMap.keySet()){
bodyParams.put(key, paramsMap.get(key));}return this;}
/**
* 设置content-Type
*
* @param contentType string
* @return HttpContent
*/
public RestTemplateUtils setContentType(String contentType){if(StringUtils.isEmpty(contentType)){
throw new RuntimeException("content-Type can not be empty,please check your mediaType and try again ~");}
this.contentType = contentType;if(Objects.isNull(httpHeaders)){
httpHeaders = new HttpHeaders();}
httpHeaders.setContentType(MediaType.parseMediaType(contentType));return this;}
/**
* 构建HttpEntity对象
* 不设置Content-Type默认application/json
*/
private void buildBody(){if(Objects.isNull(this.bodyParams)){
throw new RuntimeException("body must be not empty,please add body and try again ~");}if(Objects.isNull(contentType)|| ContentType.APPLICATION_JSON.getMimeType().equals(contentType)){
this.setContentType(ContentType.APPLICATION_JSON.getMimeType());
JSONObject jsonObject = new JSONObject();for(String s : bodyParams.keySet()){
try {
jsonObject.put(s, bodyParams.get(s));} catch (JSONException e){
logger.error("error:", e);}}
String body = jsonObject.toString();
this.httpEntity = new HttpEntity<>(body, httpHeaders);}elseif(ContentType.APPLICATION_FORM_URLENCODED.getMimeType().equals(contentType)){
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();for(String s : bodyParams.keySet()){
formData.add(s, bodyParams.get(s));}
this.httpEntity = new HttpEntity<>(formData, httpHeaders);}else{
throw new RuntimeException("sorry this tool only support content-Type include {application/json,multipart/form-data}");}}}
1.2 SpringBoot 内置的RestTemplate
1.2.1 工具类
import com.alibaba.fastjson.JSONException;import com.alibaba.fastjson.JSONObject;import org.apache.http.entity.ContentType;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.http.HttpEntity;import org.springframework.http.HttpHeaders;import org.springframework.http.MediaType;import org.springframework.util.CollectionUtils;import org.springframework.util.LinkedMultiValueMap;import org.springframework.util.MultiValueMap;import org.springframework.util.StringUtils;import org.springframework.web.client.RestTemplate;import java.util.HashMap;import java.util.Map;import java.util.Objects;
public final class RestTemplateUtils {
private Logger logger = LoggerFactory.getLogger(RestTemplateUtils.class);
private static RestTemplate restTemplate = new RestTemplate();
/**
* bodyEntity
*/
private HttpEntity httpEntity;
/**
* header
*/
private HttpHeaders httpHeaders;
/**
* contentType
*/
private String contentType;
/**
* body
*/
private HashMap<String, Object> params;
private RestTemplateUtils(){}
/**
* 构造函数已经私有化,只能通过create方法构造HttpContent
*
* @return HttpContent
*/
public static RestTemplateUtils create(){return new RestTemplateUtils();}
/**
* get请求返回模板对象
*
* @param url url
* @param clazz T.class
* @param <T> T
* @return T
*/
public <T> T getForObj(String url, Class<T> clazz){return RestTemplateUtils.restTemplate.getForObject(this.buildGetUrl(url), clazz);}
/**
* @param url
* @return
*/
private String buildGetUrl(String url){
StringBuffer builder = new StringBuffer();
builder.append(url);if(!CollectionUtils.isEmpty(this.params)){if(!url.endsWith("?")){
builder.append("?");}for(String key : this.params.keySet()){
if(builder.toString().endsWith("?")){
builder.append(key).append("=").append(this.params.get(key).toString());}else{
builder.append("&").append(key).append("=").append(this.params.get(key).toString());}}}return builder.toString();}
/**
* post请求返回模板对象
*
* @param url url
* @param clazz t.class
* @param <T> 模板
* @return T
*/
public <T> T postForObj(String url, Class<T> clazz){
this.build();return restTemplate.postForObject(url, this.httpEntity, clazz);}
/**
* 添加Header内容
*
* @param headerName key
* @param headerValue value
* @return HttpContent
*/
public RestTemplateUtils addHeader(String headerName, String headerValue){if(Objects.isNull(httpHeaders)){
httpHeaders = new HttpHeaders();}
httpHeaders.add(headerName, headerValue);return this;}
/**
* 设置请求体
*
* @param key key
* @param value value
* @return HttpContent
*/
public RestTemplateUtils addBody(String key, Object value){if(Objects.isNull(params)){
params = new HashMap<>();}
params.put(key, value);return this;}
/**
* 设置请求体
*
* @param paramsMap
* @return
*/
public RestTemplateUtils addBodyMap(Map<String, Object> paramsMap){if(Objects.isNull(params)){
params = new HashMap<>();}for(String key : paramsMap.keySet()){
params.put(key, paramsMap.get(key));}return this;}
/**
* 设置content-Type
*
* @param contentType string
* @return HttpContent
*/
public RestTemplateUtils setContentType(String contentType){if(StringUtils.isEmpty(contentType)){
throw new RuntimeException("content-Type can not be empty,please check your mediaType and try again ~");}
this.contentType = contentType;if(Objects.isNull(httpHeaders)){
httpHeaders = new HttpHeaders();}
httpHeaders.setContentType(MediaType.parseMediaType(contentType));return this;}
/**
* 构建HttpEntity对象
* 不设置Content-Type默认application/json
*/
private void build(){if(Objects.isNull(this.params)){
throw new RuntimeException("body must be not empty,please add body and try again ~");}if(Objects.isNull(contentType)|| ContentType.APPLICATION_JSON.getMimeType().equals(contentType)){
this.setContentType(ContentType.APPLICATION_JSON.getMimeType());
JSONObject jsonObject = new JSONObject();for(String s : params.keySet()){
try {
jsonObject.put(s, params.get(s));} catch (JSONException e){
logger.error("error:", e);}}
String body = jsonObject.toString();
this.httpEntity = new HttpEntity<>(body, httpHeaders);}elseif(ContentType.APPLICATION_FORM_URLENCODED.getMimeType().equals(contentType)){
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();for(String s : params.keySet()){
formData.add(s, params.get(s));}
this.httpEntity = new HttpEntity<>(formData, httpHeaders);}else{
throw new RuntimeException("sorry this tool only support content-Type include {application/json,multipart/form-data}");}}}