背景:近期开发的内容涉及到了我们平台对其他平台提供接口的调用,然后也涉及到接口提供方的验签等操作;还有我们的加签操作等。
今天记录一下调用三方接口后返回的接口如何解析;怎么拿到自己想要的东西。
其实调用三方接口分为几步
1、采用哪种方式调用三方接口,这种依赖于第三方系统是提供了什么样的接口,目前我了解的到的接口有http接口还有dubbo接口等。
如果是http接口的话,可以看我的另外一篇文章 ,多方式调用三方接口 本篇文章很详细的总结了多种调用三方接口的API方法,并且包含post、get等不同方式的请求;
对于dubbo接口如何调用,我初步理解为 我们将提供服务的jar包依赖放到pom.xml中,并在相关类中通过dubbo注解引入即可。如下图
对于dubbo接口的调用,我后面也会出一篇博客~
开始今天的正文:
现在有一个这样的调用:
其中有一些内容可以看我的博客
token鉴权相关文章:提供三方API接口、调用第三方接口API接口、模拟API接口(二)通过token实现防止业务接口的重复调用
sign签名相关文章:提供三方API接口、调用第三方接口API接口、模拟API接口(一)通过signature签名验证,避免参数恶意修改
自己假设一个情景,我需要调用用户系统的接口通过自己传输的参数 去获得员工员工绩效、员工职级、员工部门等信息。 我们一起实现这一个简单的调用,其他的就能举一反三了 ☺
入参的构建方式
MyReqDemo.class 一共三个属性 ,姓名 性别 年龄,
public class MyReqDemo{
private String name;
private String sex;
private Integer age;
}
响应参数的解析方式
先建一个接收响应参数中实体属性的对象 MyResDemo.class 一共三个属性,
public class MyResDemo{
private String saleNumber; //员工绩效
private String zclass; //员工职级
private String departName; //员工部门
}
例如我们现在在yml或者nacos中配置的
ip :http://test.com.cn
url: /user/getUserInfo
对方接口提供的是post请求,我们需要把员工姓名、年龄、性别传输到这个用户系统的这个接口中,查询 绩效、部门等信息
//构造入参:
MyReqDemo reqDemo = new MyReqDemo();
reqDemo.setName("张三");
reqDemo.setAge(19);
//将对象转化成JsonObject
JsonObject jsonObject = JSONUtil.parseObj(reqDemo);
jsonObject.put("yyy","yyyyy")//这步可以没有,这里是如果reqDemo中没有的属性想要传过去,可以在这里加上一个键值对,然后再下面传的时候,再toString
//发送请求
String res = httpRequest.post("http://test.com.cn")
.header("satoken","afsdfdsfwefsdfwefxdfwefsa")
.header("apiKey",apiKey)
.body(jsonObject .toString())
.excute();
log.info("响应结果:{}",res);
//将字符串转化成JsonObject
JsonObject jsonResult = JSONUtil.parseObj(res ); //!!!!哈哈这里也用到这个方法了,上面也用到了,所以这个parseObj()可以接受Object类型对象参数,也可以接收String参数,将这两者转化成JSONObject对象。这个JSONObject对象可以通过键值对和层级来取出其中的属性对应的值。
//解析响应参数: 特别注意这里是按照下面提供的接口文章中的响应示例来解析的(一般第三方提供接口之前会给一个接口文章,这样双方可以同步开发)
Boolean reqQes =jsonResult.getBool("success");
if(Boolean.TRUE.equals(reqQes )){
//解析里面的数据
String data = jsonResult.getStr("data");
JsonObject newJsonObject =JSONUtil.parseObj(data);//这里data是String类型
JsonArray jsonArray = newJsonObject. getJsonArray("list");//这里就拿到了响应结果中的list数组了。 JsonArray不是正常的List,我们无法直接使用,我们需要将他转化成List类型,怎么转化呢,接着来看
List<MyResDemo> MyResDemoList =JSONUtil.toList(jsonArray ,MyResDemo.class); //至此我们就拿到了其中List中真正的业务数据了。
}else{
log.info("响应失败,失败信息:{}",res);
}
比如对方提供的接口文档中 响应参数的结构如下:
{
"success": true,
"err": null,
"msg": null,
"data": {
"list": [
{
"saleNumber": "1000",
"zclass": "5",
"departName": "XX超市1部",
},
{
"saleNumber": "20000",
"zclass": "10",
"departName": "XX超市2部",
}
],
"total": 2, //总记录数
"UserNumber": 2, //用户数量
"totalSale": 21000, //销售总额
}
}
注意我这里的解析
//解析响应参数: 特别注意这里是按照下面提供的接口文章中的响应示例来解析的(一般第三方提供接口之前会给一个接口文章,这样双方可以同步开发)
Boolean reqQes =jsonResult.getBool("success");
if(Boolean.TRUE.equals(reqQes )){
//解析里面的数据
String data = jsonResult.getStr("data");
JsonObject newJsonObject =JSONUtil.parseObj(data);//这里data是String类型
JsonArray jsonArray = newJsonObject. getJsonArray("list");//这里就拿到了响应结果中的list数组了。 JsonArray不是正常的List,我们无法直接使用,我们需要将他转化成List类型,怎么转化呢,接着来看
List<MyResDemo> MyResDemoList =JSONUtil.toList(jsonArray ,MyResDemo.class); //至此我们就拿到了其中List中真正的业务数据了。
}else{
log.info("响应失败,失败信息:{}",res);
}
我这里是先把解析出来的字符串类型的data 转化成了JSONObject对象,然后通过这个对象中取 下面的list属性,因为list属性对应的结构是[{“name”:“222”},{“name”:“111”},{“name”:“333”}] 这种结构,通过 newJsonObject. getJsonArray(“list”);方法就能拿到JsonArray对象,之后再把这个对象转化成对象的List就能使用了。
当然最后获取的业务数据是数组时,这是一种解析的方式,对于最后业务数据是数组来说, 还有另外一种方式:
//如果响应的业务数据提取出来之后是String类型的话
String jsonString = “”;//业务数据,json类型的字符串
JSONArray jsonArray = JSONArray.parseArray(jsonString);
for(int i=0; i<jsonArray.size(); i++) {
JSONObject object = jsonArray.getJSONObject(i); //通过这种也可以取出来JsonArray中的每一个JSONObject对象,然后再一个一个转化成Res实体对象也行。这也是一种方法。
SmartProejctEquipmentMap myclass = JSONObject.parseObject(object.toJSONString() , SmartProejctEquipmentMap.class);// 将string类型直接封装成对象
}
这两种方式都是对于
响应结构
“data”: {
“list”: [
{
“saleNumber”: “1000”,
“zclass”: “5”,
“departName”: “XX超市1部”,
},
{
"saleNumber": "20000",
"zclass": "10",
"departName": "XX超市2部",
}
],
"total": 2, //总记录数
"UserNumber": 2, //用户数量
"totalSale": 21000, //销售总额
}
这种data中是对象,对象中的属性是一个数组的,这样取
如果data是一个对象,对象中的属性是age、name这样的,不是一个数组的话。通过下面的这种方式解析:
JsonObject jsonResult = JSONUtil.parseObj(res );
String data =jsonResult .getStr("data");
MyResDemo myResDemo= JSONObject.parseObject(jsonString,MyResDemo .class);
总结:此文章中系统熟悉了
JSONUtil工具中的几个方法:
// //例如上文中 响应结果中res的处理
JsonObject jsonResult =JSONUtil.parseObj(字符串)
//构建入参时,对象到JSONObject对象的转换
JsonObject jsonObject = JSONUtil.parseObj(对象)
// 将JsonArray转换成对象List
List<MyResDemo> MyResDemoList =JSONUtil.toList(jsonArray ,MyResDemo.class);
JSONArray的工具方法
//jsonString的结构是数组类型,则通过下面方法转化成JsonArray对象
JSONArray jsonArray = JSONArray.parseArray(jsonString);
还有JsonObject对象可以调用的方法:
//第一种:res是String类型的,对String类型的参数如何以String类型取出来其中的一个属性
JsonObject jsonResult = JSONUtil.parseObj(res );
String data =jsonResult .getStr("data"); //以String类型取出来data属性
//第二种: //这个可以看上面的例子,先以字符串形式取出其中的一个属性,然后再调用JSONUtil.parseObj(data) 获取到JsonObject 对象,然后就能调用getJsonArray("属性名")
String data = jsonResult.getStr("data");
JsonObject newJsonObject =JSONUtil.parseObj(data);//这里data是String类型
JsonArray jsonArray = newJsonObject. getJsonArray("list");//这里就拿到了响应结果中的list数组了。 JsonArray不是正常的List,我们无法直接
JsonArray对象可以调用的方法:
//第一种:
//如果响应的业务数据提取出来之后是String类型的话
String jsonString = “”;//业务数据,json类型的字符串
JSONArray jsonArray = JSONArray.parseArray(jsonString);
for(int i=0; i<jsonArray.size(); i++) {
JSONObject object = jsonArray.getJSONObject(i); //通过这种也可以取出来JsonArray中的每一个JSONObject对象,然后再一个一个转化成Res实体对象也行。这也是一种方法。
SmartProejctEquipmentMap myclass = JSONObject.parseObject(object.toJSONString() , SmartProejctEquipmentMap.class);// 将string类型直
}
标签:调用,转化成,JsonArray,JSONUtil,接口,对象,解析,data,String
From: https://blog.csdn.net/qq_39666711/article/details/141224782