前言:項目中使用http協議調用接口時,如何被調用方設置的是httpbody請求加密的格式的話,就需要我們傳入參數的對象按照本身的屬性值傳入,這樣的話,就會有兩個條件:1、屬性名大小寫必須一致;2、空值的屬性不能轉換成jsonMap中的key和value值;
我們會想到使用fastJson工具類進行轉換,將一個對象的所有屬性轉換成jsonMap形式,假如如果使用fastJson進行轉換的話,並不能將一個帶有空值屬性去掉,也不能保證轉換後的key值和屬性值完全一致(大小寫問題);
基於這種情況,可以這樣處理:
/**
* POST請求
* 帶參數、請求頭, application/json 格式
* 使用了Gson將bean-->json格式,解決了按屬性名大寫轉換問題
* @author: 研發部-sunwh
* @param <T> 請求參數封裝的實體
* @param url
* @param headers
* @param params
* @return
* @throws UnsupportedEncodingException
*/
public static <T> String httpPostJsonRequest(String url, Map<String, Object> headers, T bean) throws UnsupportedEncodingException {
log.info("http request url:{}, params:{}, headers:{}", url,GsonUtil.util().tojsonString(bean), headers);
HttpPost httpPost = new HttpPost(url);
StringEntity stringEntity = new StringEntity(GsonUtil.util().tojsonString(bean));
stringEntity.setContentType("application/json");
httpPost.setEntity(stringEntity);
for (Map.Entry<String, Object> param : headers.entrySet()) {
httpPost.addHeader(param.getKey(), String.valueOf(param.getValue()));
}
return getResult(httpPost);
}
GsonUtil方法如下:
package com.zcy.rflow.common.utils;
import org.springframework.util.ObjectUtils;
import com.google.gson.Gson;
/**
* Gson工具類
* 靜態內部類的單例模式
* @author: 研發部-sunwh
* @since: 2018年7月3日下午1:49:03
* @version: 1.0
*/
public class GsonUtil {
private GsonUtil() {}
private static class singletonBuild {
private static GsonUtil value = new GsonUtil();
}
public static GsonUtil util() {
return singletonBuild.value;
}
private Gson gson = new Gson();
/**
* bean轉換json
* 解決對象屬性名大寫自動變爲小寫問題,即轉換後字符串是原本屬性名
* @author: 研發部-孫文豪
* @param bean
* @return
*/
public <T> String tojsonString(T bean) {
if(ObjectUtils.isEmpty(bean)) {
return null;
}
return gson.toJson(bean);
}
}
這樣解決了上述兩種問題。
附上將對象轉換成LinkedHashMap,並解決屬性轉換順序問題
/**
* 將對象轉換成LinkedHashMap
* 解決屬性轉換順序問題
* @author: 研發部-sunwh
* @param obj
* @return
* @throws IllegalAccessException
*/
public static LinkedHashMap<String, Object> objectToLinkedHasHMap(Object obj) throws IllegalAccessException {
LinkedHashMap<String, Object> linkedHashMap = new LinkedHashMap<>();
Class<?> clazz = obj.getClass();
for (Field field : clazz.getDeclaredFields()) {
//修改訪問權限
field.setAccessible(true);
String fieldName = field.getName();
Object value = field.get(obj);
//剔除空值屬性
if(ObjectUtils.isEmpty(fieldName) || ObjectUtils.isEmpty(value)) {
continue;
}
linkedHashMap.put(fieldName, value);
}
return linkedHashMap;
}