最近公司要接入第三方公司的api,下面实体类的会写请求参数和返会参数,也是弄了很久才弄出来,就想记录一下
请求方式method:post
实时接口服务以 http post 实现 提交格式为 from-data。
最终的签名值sign
Sign=MD5(appId=123456¶m=p&time=1527057327764&key=secret).toUpperCase()
学习内容:
1.接入依赖
com.alibaba fastjson 1.2.68 cn.hutool hutool-all 5.4.5
只要把依赖引入,它下面的工具都可以用了
- 将返回参数和请求参数封装成实体类
请求参数,一会sign签名还要用到
private String appId;
private Long time;
private String sign;
private String startTime;
private Integer regionId;
private Integer pageSize;
private String userId;
private String username;
private String userTel;
private Integer identity;
private String imgPath;
private Integer point;
private Double weight;
private Integer collectType;
private String collectUser;
private Integer village;
private Integer build;
private Integer unit;
private String address;
private Integer rubbishType;
private String createTime;
private String putTime;
这就是返回参数的实体类,就是别人接口文档上的
- 计算签名
签名的要求
获取所有请求参数,剔除sign字段,剔除值为空的参数,并按照第一个字符的键值ASCII码递增排序(字母升序排序)
使用md5加密,将加密后的结果转化成大写最终的签名值sign
private String sign(EnvironmentDTO dto, String time) {
Map map = new HashMap<>();
Map result = new HashMap<>();
map.put("appId", dto.getAppId());
map.put("regionId", dto.getRegionId());
map.put("time", time);
map.put("pageSize", dto.getPageSize());
map.put("startTime", dto.getStartTime());
map.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.forEachOrdered(x -> result.put(x.getKey(), x.getValue()));
StringBuilder s = new StringBuilder();
result.forEach((key, value) -> {
s.append(key);
s.append(value);
});
s.append("e^Qj!vm2LODwn$1X");
return SecureUtil.md5(s.toString()).toUpperCase();
}
4.接入http post请求,获取数据
public JSONObject populateMapost(String url, EnvironmentDTO dto) {
Map map = new HashMap<>();
map.put("appId", dto.getAppId());
map.put("regionId", dto.getRegionId());
map.put("time", dto.getTime());
map.put("pageSize", dto.getPageSize());
map.put("sign", this.sign(dto, url));
String rusult = HttpRequest.post(url)
.form(map)
.header("Content-Type", CONTENT_TYPE)
.header("connection", "Keep-Alive")
.timeout(20000)
.execute()
.body();
JSONObject datas = JSONObject.parseObject(rusult);
return datas;
}
5.接入数据以后对数据进行转换
public CollectInformationRes getData(JSONObject datas) {
//调用方法,回去"datas"里面的数据
CollectInformationRes collectInformationRes = JSONObject.toJavaObject(datas, CollectInformationRes.class);
if (collectInformationRes != null) {
System.out.println(collectInformationRes);
}
return null;
}
我这里就做了简单的逻辑,把接收到的json数据转换成对象,因为拿到数据以后,我们还要接入到我们的平台的sdk接入



