山东网站排行,网站运营模式,pc网站同步手机网站,绵阳网站建设工作室问题背景
业务需要#xff0c;经常需要http方式调用某服务#xff0c;然后某服务返回特定类型的返回内容。 类似 String resStr xxxHttpClient.post() #xff0c;然后它返回一个字符串#xff0c;你还需要反序列化成某种格式的。
返回值可以反序列化成的形式如下#…问题背景
业务需要经常需要http方式调用某服务然后某服务返回特定类型的返回内容。 类似 String resStr xxxHttpClient.post() 然后它返回一个字符串你还需要反序列化成某种格式的。
返回值可以反序列化成的形式如下
{private String code;private String message;//这里的这个“T”就是根据具体业务需要而不同的类型可能是一个class也可能是一个List等private T data;
}注意这里的这个T是个活的它可能根据接口的内容不同而不同。
有时候是个普通对象如
public class StudentInfo{private Integer age;private String name;
}这样。 2. 有时候是个List如 ListStudentInfo 这样 3. 有时候是个嵌套对象如
public class StudentInfo{private Integer pageNum;private Integer pageSize;private Integer totalCount;private ListStudentInfo list;
}这样。
甚至更多种情况那么要怎么办呢 还挺不好写活的。
封装了一个方法实现上述功能
(已删除若干不相干代码不影响含义)
import cn.xxx.dto.BaseCommonResDTO;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import java.util.List;
import java.util.Map;/*** author * date 2023年8月25日* desc 泛型方法返回泛型完美封装* https://blog.csdn.net/qq_39348918/article/details/120529916*/
Slf4j
Component
public class MyCustomHttp {/*** 返回数据类型* 其中T是xxx的htttp接口返回的数据的类型** param url* param params* return*/public T extends Object T doPost(String url, MapString, String params, ClassT clazz) {//当前时间戳Long timestamp System.currentTimeMillis();String sign .....;//headersMapString, String heads ...;ResponseBody responseBody myXXHttpClient.doPost(url, heads, params);String responseMsg responseBody.getResponseMsg();//普通反序列化//MyDataResDTO myDataResDTO JSONObject.parseObject(reposeBody.getResponseMsg(), MyDataResDTO.class);//嵌套类反序列化BaseCommonResDTOT result JSONObject.parseObject(responseMsg, new TypeReferenceBaseCommonResDTOT(clazz) {});if (null ! result) {T data result.getData();return data;} else {return null;}}public T extends Object ListT doPostForList(String url, MapString, String params, ClassT clazz) {//当前时间戳Long timestamp System.currentTimeMillis();String sign ...;//headersMapString, String heads ...;ResponseBody responseBody myXXHttpClient.doPost(url, heads, params);String responseMsg responseBody.getResponseMsg();//普通反序列化//MyDataResDTO myDataResDTO JSONObject.parseObject(reposeBody.getResponseMsg(), MyDataResDTO.class);//嵌套类反序列化BaseCommonResDTOListT result JSONObject.parseObject(responseMsg, new TypeReferenceBaseCommonResDTOListT(clazz) {});if (null ! result) {ListT data result.getData();return data;} else {return null;}}
}
使用举例
调用的时候 //返回对象 包括返回普通对象 和 返回嵌套对象都亲测成功
public StudentInfo getStudentInfo (Integer page, Integer pageSize) {MapString, String params Maps.newHashMap();params.put(param1, page);params.put(param2, pageSize);StudentInfo studentInfo MyCustomHttp.doPost(url, params, StudentInfo.class);return studentInfo;
}//返回list
public ListStudentInfo getAllStudentInfos(Integer page, Integer pageSize) {MapString, String params Maps.newHashMap();params.put(param1, page);params.put(param2, pageSize);ListStudentInfo studentInfos MyCustomHttp.doPostForList(url, params, StudentInfo.class);return studentInfos;
}然后再使用就非常优雅了。 主要思想就是把想返回的数据类型作为doPost 或 doPostForList的第三个参数传入从而实现灵活控制接口返回类型的目的。 感觉效果不错推荐使用。