spring boot/cloud中RestTemplate對象的方法調用
簡單單元方法
get和post方式請求資源
get
// get請求方式, 直接封裝json傳遞參數
private JSONObject getData(String url){
System.out.println("remote api request param:\nurl:【"+url+"】");
String result = restTemplate.getForObject(url, String.class);
System.out.println("remote api response param:\nresponse-param:【"+result+"】");
JSONObject results = JSONObject.parseObject(result);
return results;
}
post
// post請求方式, 直接封裝json傳遞參數
private JSONObject postData(JSONObject jsonObj,String urls){
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
HttpEntity<String> formEntity = new HttpEntity<String>(jsonObj.toString(), headers);
System.out.println("remote api request param:\nurl:【"+urls+"】\nrequest-param:【"+JSONObject.toJSON(formEntity)+"】");
String result = restTemplate.postForObject(urls, formEntity, String.class);
System.out.println("remote api response param:\nresponse-param:【"+result+"】");
JSONObject results = JSONObject.parseObject(result);
return results;
}
複雜豐富的方法書寫
基礎類(類對象由於是接收第三方,以下是對接一種第三方的情況)
package com.demo;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/**
* @Description 接收第三方相應結果對象
**/
public class RemoteResultMap {
private String code;
private String status;
private String message;
private String data;
private String datas;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getDatas() {
return datas;
}
public void setDatas(String datas) {
this.datas = datas;
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
@Override
public boolean equals(Object object) {
return EqualsBuilder.reflectionEquals(this, object);
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}
}
package com.demo;
import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/**
* @Description 內部接口統一返回遠程調用結果
**/
public class RemoteResultBean<T> implements Serializable {
private static final long serialVersionUID = -1724546458368592165L;
private String returnCode = "0000";// 返回代碼
private String returnMessage;// 錯誤信息描述
private T model;// 返回對象
private Integer pageCount;// 分頁總頁數
private Integer dataCount;// 數據總條數
public String getReturnCode() {
return returnCode;
}
public void setReturnCode(String returnCode) {
this.returnCode = returnCode;
}
public String getReturnMessage() {
return returnMessage;
}
public void setReturnMessage(String returnMessage) {
this.returnMessage = returnMessage;
}
public T getModel() {
return model;
}
public void setModel(T model) {
this.model = model;
}
public Integer getPageCount() {
return pageCount;
}
public void setPageCount(Integer pageCount) {
this.pageCount = pageCount;
}
public Integer getDataCount() {
return dataCount;
}
public void setDataCount(Integer dataCount) {
this.dataCount = dataCount;
}
public Boolean isSuccess() {
return this.getReturnCode().equals("0000");
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
@Override
public boolean equals(Object object) {
return EqualsBuilder.reflectionEquals(this, object);
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}
}
package com.demo;
/**
* @Description 統一返回遠程調用異常處理集合
**/
public enum RemoteServiceEnum {
requestError("9995", "遠程調用失敗"), bussinessError("9994", "遠程調用業務失敗"), methodError("9999", "請求方式只支持Get和Post"), responeDataEmpty("9993", "調用遠程方法未返回Data");
private String code;
private String name;
RemoteServiceEnum(String code, String name) {
this.code = code;
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
遠程調用接口
package com.demo;
import java.util.List;
import java.util.Map;
import org.springframework.http.HttpMethod;
public interface RemoteService {
/**
* 發送帶Header頭的請求 並返回對應對象
* @param url
* @param requestParam
* @param requestHeader
* @param httpMethod
* @param clazz
* @return
*/
<T> RemoteResultBean<T> sendWithHeader(String url, Map<String, Object> requestParam, Map<String, String> requestHeader, HttpMethod httpMethod, Class<?> clazz);
/**
* 發送帶Header頭的請求 並返回對應對象的List
* @param url
* @param requestParam
* @param requestHeader
* @param httpMethod
* @param clazz
* @return
*/
<T> RemoteResultBean<List<T>> sendWithHeader4List(String url, Map<String, Object> requestParam, Map<String, String> requestHeader, HttpMethod httpMethod, Class<?> clazz);
<T> RemoteResultBean<List<T>> sendObjectWithHeader4List(String url,
Object requestParam, Map<String, String> requestHeader, HttpMethod httpMethod,
Class<?> clazz);
/**
* 發送帶Header頭的請求 請求參數爲Object 並返回對應對象的Object
* @param url
* @param requestParam
* @param requestHeader
* @param httpMethod
* @param clazz
* @param <T>
* @return
*/
<T> RemoteResultBean<T> sendObjectWithHeader4Object(String url,
Object requestParam, Map<String, String> requestHeader, HttpMethod httpMethod,
Class<?> clazz);
/**
* 發送不帶Header頭的請求 並返回對應對象
* @param url
* @param requestParam
* @param httpMethod
* @param clazz
* @return
*/
<T> RemoteResultBean<T> sendWithoutHeader(String url, Map<String, Object> requestParam, HttpMethod httpMethod, Class<?> clazz);
/**
* 發送不帶Header頭的請求 並返回對應對象的List
* @param url
* @param requestParam
* @param httpMethod
* @param clazz
* @return
*/
<T> RemoteResultBean<List<T>> sendWithoutHeader4List(String url, Map<String, Object> requestParam, HttpMethod httpMethod, Class<?> clazz);
<T> RemoteResultBean<T> postByEntity(String url,
Map<String, String> requestParam, Class<?> clazz);
/**
* 手機號碼加解密服務
* @param url
* @param value
* @return
*/
public String cryption(String url,String value);
/**
* 無返回請求
* @param url
* @param requestParam
* @param requestHeader
* @param httpMethod
*/
public void sendWithoutResponse(String url, Map<String, Object> requestParam, Map<String, String> requestHeader, HttpMethod httpMethod);
<T> RemoteResultBean<T> sendReturnString(String url, Map<String, Object> requestParam,
Map<String, String> requestHeader, HttpMethod httpMethod);
}
遠程調用接口實現
package com.demo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.commons.lang.time.DateFormatUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Import;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
/**
* 遠程調用服務實現方法
*/
@Service
@ConfigurationProperties
@Import({RestTemplateConfig.class})
public class RemoteServiceImpl implements RemoteService {
@Resource
private RestTemplate restTemplate;
private Logger logger = LoggerFactory.getLogger(RemoteServiceImpl.class);
@Override
public <T> RemoteResultBean<T> sendWithHeader(String url, Map<String, Object> requestParam,
Map<String, String> requestHeader, HttpMethod httpMethod, Class<?> clazz) {
RemoteResultBean<T> resultBean = new RemoteResultBean<>();
ObjectMapper objectMapper = new ObjectMapper();
try {
JSONObject jsonObject = sendRequest(url, requestParam, requestHeader, httpMethod);
resultBean = convertFromJSONObjectToObject(jsonObject, clazz);
} catch (Exception e) {
logger.error("1.遠程調用異常 err:" , e);
resultBean.setReturnCode("9998");
resultBean.setReturnMessage("遠程調用異常");
}
return resultBean;
}
@Override
public <T> RemoteResultBean<List<T>> sendWithHeader4List(String url,
Map<String, Object> requestParam, Map<String, String> requestHeader, HttpMethod httpMethod,
Class<?> clazz) {
RemoteResultBean<List<T>> resultBean = new RemoteResultBean<>();
try {
logger.info("Invoke URL:"+url);
JSONObject jsonObject = sendRequest(url, requestParam, requestHeader, httpMethod);
resultBean = convertFromJSONObjectToList(jsonObject, clazz);
} catch (Exception e) {
logger.error("1.遠程調用異常 err:" + e);
resultBean.setReturnCode("9998");
resultBean.setReturnMessage("遠程調用異常");
}
return resultBean;
}
@Override
public <T> RemoteResultBean<List<T>> sendObjectWithHeader4List(String url,
Object requestParam, Map<String, String> requestHeader, HttpMethod httpMethod,
Class<?> clazz) {
RemoteResultBean<List<T>> resultBean = new RemoteResultBean<>();
try {
JSONObject jsonObject = sendObjectRequest(url, requestParam, requestHeader, httpMethod);
resultBean = convertFromJSONObjectToList(jsonObject, clazz);
} catch (Exception e) {
logger.error("3.遠程調用異常 err:"+url , e);
resultBean.setReturnCode("9998");
resultBean.setReturnMessage("遠程調用異常");
}
return resultBean;
}
@Override
public <T> RemoteResultBean<T> sendObjectWithHeader4Object(String url, Object requestParam,
Map<String, String> requestHeader, HttpMethod httpMethod, Class<?> clazz) {
RemoteResultBean<T> resultBean = new RemoteResultBean<>();
try {
JSONObject jsonObject = sendObjectRequest(url, requestParam, requestHeader, httpMethod);
resultBean = convertFromJSONObjectToObject(jsonObject, clazz);
} catch (Exception e) {
logger.error("4.遠程調用異常 err:" , e);
resultBean.setReturnCode(RemoteServiceEnum.requestError.getCode());
resultBean.setReturnMessage("遠程調用異常");
}
return resultBean;
}
@Override
public <T> RemoteResultBean<T> sendWithoutHeader(String url, Map<String, Object> requestParam,
HttpMethod httpMethod, Class<?> clazz) {
return sendWithHeader(url, requestParam, null, httpMethod, clazz);
}
@Override
public <T> RemoteResultBean<List<T>> sendWithoutHeader4List(String url,
Map<String, Object> requestParam, HttpMethod httpMethod, Class<?> clazz) {
return sendWithHeader4List(url, requestParam, null, httpMethod, clazz);
}
@Override
public <T> RemoteResultBean<T> postByEntity(String url,
Map<String, String> requestParam, Class<?> clazz) {
ResponseEntity<String> response = restTemplate.postForEntity(url, requestParam, String.class);
return convertFromJSONObjectToObject(JSONObject.parseObject(response.getBody()), clazz);
}
private JSONObject sendRequest(String url, Map<String, Object> requestParam,
Map<String, String> requestHeader, HttpMethod httpMethod) {
//headers
HttpHeaders requestHeaders = new HttpHeaders();
if (null != requestHeader) {
for (Map.Entry<String, String> entry : requestHeader.entrySet()) {
requestHeaders.add(entry.getKey(), entry.getValue());
}
}
//body
MultiValueMap<String, Object> requestBody = new LinkedMultiValueMap<>();
if (null != requestParam) {
for (Map.Entry<String, Object> entry : requestParam.entrySet()) {
requestBody.add(entry.getKey(), entry.getValue());
}
}
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(requestBody,
requestHeaders);
logger.info("遠程調用入參信息:【url="+url+"】,【requestParam="+JSONObject.toJSONString(requestParam)+"】");
String json = this.executeRemote(url,requestEntity,httpMethod);
logger.info("遠程調用出參信息:【json="+json+"】");
return JSONObject.parseObject(json);
}
private String executeRemote(String url, HttpEntity<MultiValueMap<String, Object>> requestEntity, HttpMethod httpMethod){
String json = "";
if (httpMethod == HttpMethod.GET) {
ResponseEntity<String> response = restTemplate
.exchange(url, HttpMethod.GET, requestEntity, String.class);
json = response.getBody();
} else if (httpMethod == HttpMethod.POST) {
json = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class).getBody();
} else {
Map<String, String> result = new HashMap<>();
result.put("code", RemoteServiceEnum.methodError.getCode());
result.put("message", RemoteServiceEnum.methodError.getName());
json = JSON.toJSONString(result);
}
return json;
}
private JSONObject sendObjectRequest(String url, Object requestParam,
Map<String, String> requestHeader, HttpMethod httpMethod) {
//headers
HttpHeaders requestHeaders = new HttpHeaders();
if (null != requestHeader) {
for (Map.Entry<String, String> entry : requestHeader.entrySet()) {
requestHeaders.add(entry.getKey(), entry.getValue());
}
}
//組裝HttpEntity
HttpEntity<Object> requestEntity = new HttpEntity<>(requestParam,
requestHeaders);
logger.info("遠程調用開始");
String json = "";
if (httpMethod == HttpMethod.GET) {
ResponseEntity<String> response = restTemplate
.exchange(url, HttpMethod.GET, requestEntity, String.class);
json = response.getBody();
} else if (httpMethod == HttpMethod.POST) {
json = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class).getBody();
} else {
Map<String, String> result = new HashMap<>();
result.put("code", RemoteServiceEnum.methodError.getCode());
result.put("message", RemoteServiceEnum.methodError.getName());
json = JSON.toJSONString(result);
}
logger.info("遠程調用結束:"+json);
return JSONObject.parseObject(json);
}
/**
* 無返回結果的請求
*/
private void sendRequestWithOutResponse(String url, Map<String, Object> requestParam,
Map<String, String> requestHeader, HttpMethod httpMethod) {
//headers
HttpHeaders requestHeaders = new HttpHeaders();
if (null != requestHeader) {
for (Map.Entry<String, String> entry : requestHeader.entrySet()) {
requestHeaders.add(entry.getKey(), entry.getValue());
}
}
//body
MultiValueMap<String, Object> requestBody = new LinkedMultiValueMap<>();
if (null != requestParam) {
for (Map.Entry<String, Object> entry : requestParam.entrySet()) {
requestBody.add(entry.getKey(), entry.getValue());
}
}
//組裝HttpEntity
HttpEntity<JSONObject> requestEntity = new HttpEntity<>(
JSONObject.parseObject(JSON.toJSONString(requestParam)),
requestHeaders);
String json = "";
if (httpMethod == HttpMethod.GET) {
ResponseEntity<String> response = restTemplate
.exchange(url, HttpMethod.GET, requestEntity, String.class);
json = response.getBody();
} else if (httpMethod == HttpMethod.POST) {
json = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class).getBody();
} else {
Map<String, String> result = new HashMap<>();
result.put("code", RemoteServiceEnum.methodError.getCode());
result.put("message", RemoteServiceEnum.methodError.getName());
json = JSON.toJSONString(result);
}
}
private String sendRequestReturnString(String url, Map<String, Object> requestParam,
Map<String, String> requestHeader, HttpMethod httpMethod) {
//headers
HttpHeaders requestHeaders = new HttpHeaders();
if (null != requestHeader) {
for (Map.Entry<String, String> entry : requestHeader.entrySet()) {
requestHeaders.add(entry.getKey(), entry.getValue());
}
}
//body
MultiValueMap<String, Object> requestBody = new LinkedMultiValueMap<>();
if (null != requestParam) {
for (Map.Entry<String, Object> entry : requestParam.entrySet()) {
requestBody.add(entry.getKey(), entry.getValue());
}
}
//組裝HttpEntity
HttpEntity<JSONObject> requestEntity = new HttpEntity<>(
JSONObject.parseObject(JSON.toJSONString(requestParam)),
requestHeaders);
String json = "";
if (httpMethod == HttpMethod.GET) {
ResponseEntity<String> response = restTemplate
.exchange(url, HttpMethod.GET, requestEntity, String.class);
json = response.getBody();
} else if (httpMethod == HttpMethod.POST) {
json = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class).getBody();
} else {
Map<String, String> result = new HashMap<>();
result.put("code", RemoteServiceEnum.methodError.getCode());
result.put("message", RemoteServiceEnum.methodError.getName());
json = JSON.toJSONString(result);
}
return json;
}
private <T> RemoteResultBean<List<T>> convertFromJSONObjectToList(JSONObject jsonObject,
Class<?> clazz) {
RemoteResultBean<List<T>> resultBean = new RemoteResultBean<>();
if (null == jsonObject) {
resultBean.setReturnCode(RemoteServiceEnum.requestError.getCode());
resultBean.setReturnMessage("調用遠程方法失敗 返回對象爲空");
} else {
RemoteResultMap resultMap = JSONObject
.parseObject(jsonObject.toJSONString(), RemoteResultMap.class);
if ((null != resultMap.getCode() && resultMap.getCode().equals("0")) || (
null != resultMap.getStatus() && resultMap.getStatus().equals("true"))) {
if (null != resultMap.getData()) {
List<T> list = (List<T>) JSON.parseArray(resultMap.getData(), clazz);
resultBean.setModel(list);
} else {
resultBean.setReturnCode(RemoteServiceEnum.responeDataEmpty.getCode());
resultBean.setReturnMessage(RemoteServiceEnum.responeDataEmpty.getName());
logger.info(jsonObject.toString());
}
} else if( null != resultMap.getStatus() && resultMap.getStatus().equals("false")) {
resultBean.setReturnCode(RemoteServiceEnum.bussinessError.getCode());
if(null != resultMap.getMessage()) {
resultBean.setReturnMessage(resultMap.getMessage());
} else {
resultBean.setReturnMessage(RemoteServiceEnum.bussinessError.getName());
}
logger.info(jsonObject.toString());
} else {
resultBean.setReturnCode(RemoteServiceEnum.requestError.getCode());
resultBean.setReturnMessage(RemoteServiceEnum.requestError.getName());
logger.info(jsonObject.toString());
}
}
return resultBean;
}
private <T> RemoteResultBean<T> convertFromJSONObjectToObject(JSONObject jsonObject,
Class<?> clazz) {
RemoteResultBean<T> resultBean = new RemoteResultBean<>();
if (null == jsonObject) {
resultBean.setReturnCode(RemoteServiceEnum.requestError.getCode());
resultBean.setReturnMessage("調用遠程方法失敗 返回對象爲空");
} else {
RemoteResultMap resultMap = JSONObject
.parseObject(jsonObject.toJSONString(), RemoteResultMap.class);
if ((null != resultMap.getCode() && resultMap.getCode().equals("0")) || (
null != resultMap.getStatus() && (resultMap.getStatus().equals("true") || resultMap.getStatus().equals("1")))) {
if (null != resultMap.getData()) {
T object = (T) JSONObject.parseObject(resultMap.getData(), clazz);
resultBean.setModel(object);
}else if (null != resultMap.getDatas()) {
T object = (T) JSONObject.parseObject(resultMap.getDatas(), clazz);
resultBean.setModel(object);
} else {
resultBean.setReturnCode(RemoteServiceEnum.responeDataEmpty.getCode());
resultBean.setReturnMessage(RemoteServiceEnum.responeDataEmpty.getName());
logger.info(jsonObject.toString());
}
} else if( null != resultMap.getStatus() && resultMap.getStatus().equals("false")) {
resultBean.setReturnCode(RemoteServiceEnum.bussinessError.getCode());
if(null != resultMap.getMessage()) {
resultBean.setReturnMessage(resultMap.getMessage());
} else {
resultBean.setReturnMessage(RemoteServiceEnum.bussinessError.getName());
}
logger.info(jsonObject.toString());
} else {
resultBean.setReturnCode(RemoteServiceEnum.requestError.getCode());
resultBean.setReturnMessage(RemoteServiceEnum.requestError.getName());
logger.info(jsonObject.toString());
}
}
return resultBean;
}
/**
* 手機號碼加解密服務
*
* @param url, value
*/
public String cryption(String url, String value) {
logger.info("\n\n <<<<<<<<< 遠程服務調用 【方法名】RemoteServiceImpl.cryption:【開始時間 】: " + DateFormatUtils.format(new Date() ,"yyyyMMddHHmmssSSS"));
value = "=" + value;
byte[] valueByte = value.getBytes();
HttpHeaders requestHeader = new HttpHeaders();
requestHeader.add("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
logger.info("\n\n <<<<<<<<< 遠程服務調用 【url】 :"+url +"<<<<<<< 【參數】 value :"+value+"<<<<<<< 【header參數】application/x-www-form-urlencoded");
HttpEntity<byte[]> requestEntity = new HttpEntity<>(valueByte, requestHeader);
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class);
String json=responseEntity.getBody();
logger.info("\n\n <<<<<<<<< 遠程服務調用 【url】 :"+url +"【結果】 :"+JSON.toJSONString(responseEntity) );
logger.info("\n\n <<<<<<<<< 遠程服務調用 【方法名】RemoteServiceImpl.cryption:【開始時間 】: " + DateFormatUtils.format(new Date() ,"yyyyMMddHHmmssSSS"));
JSONObject jsonObject = JSON.parseObject(json);
return jsonObject.getString("Data");
}
@Override
public void sendWithoutResponse(String url, Map<String, Object> requestParam,
Map<String, String> requestHeader, HttpMethod httpMethod) {
try {
sendRequestWithOutResponse(url, requestParam, requestHeader, httpMethod);
} catch (Exception e) {
logger.error("遠程調用異常 url:" + url + " err:" + e.getMessage());
}
}
@Override
public <T> RemoteResultBean<T> sendReturnString(String url, Map<String, Object> requestParam,
Map<String, String> requestHeader, HttpMethod httpMethod) {
RemoteResultBean<T> resultBean = new RemoteResultBean<>();
try {
String result = sendRequestReturnString(url, requestParam, requestHeader, httpMethod);
resultBean.setModel((T) result);
} catch (Exception e) {
logger.error("遠程調用異常 url:" + url + " err:" + e.getMessage());
resultBean.setReturnCode(RemoteServiceEnum.requestError.getCode());
resultBean.setReturnMessage(RemoteServiceEnum.requestError.getName());
}
return resultBean;
}
public static void main(String[] args){
RestTemplate restTemplate = new RestTemplate();
String url="http://192.168.41.75:8001/Encrypt";
String value = "13761298925";
byte[] valueByte = value.getBytes();
HttpHeaders requestHeader = new HttpHeaders();
requestHeader.add("Content-Type", "application/x-www-form-urlencoded");
HttpEntity<byte[]> requestEntity = new HttpEntity<>(valueByte, requestHeader);
String json = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class)
.getBody();
JSONObject jsonObject = JSON.parseObject(json);
}
}