本文介绍了如何通过云苍穹的开放平台和自定义服务,结合Java插件,实现通过HTTP接口调用云苍穹以获取单据数据的详细步骤。首先,需要在开放平台注册第三方应用并获取相关Token,然后编写Java插件处理数据逻辑,注册自定义服务并配置调用。最后,通过携带Token调用自定义服务获取数据,可使用PostMan等工具进行测试。
创作不易,如果文章对您有帮助,请为我点击一个朴实无华的赞^_^,我会更有动力持续地更新文章。
需求场景:
开发者需要通过http接口调用云苍穹,获取单据的数据。
单据数据由云苍穹的插件获取后返回给http请求方,插件由开发者开发。
我个人对开放平台,即OpenApi的一些理解:
在日常开发中,我们有时候需要在非云苍穹的系统或者服务上,通过http来调用云苍穹,例如获取一些单据数据。
开放平台就提供了这样一个功能,支持快速定义单据页面的http接口,开发者只需要在开放平台简单配置一个操作服务,就能生成一个http接口,供其他微服务调用,我们还可以用postMan等接口测试工具,测试和调用这个http接口。
有时候开放平台提供的操作服务已经不能满足需求了,我们需要实现更复杂的数据加载逻辑,
这时可以尝试使用自定义服务+Java插件的方式,使用了Java插件之后,数据加载和组装的过程,就完全由开发者来控制。
在案例中,我会展示 如何自定义服务,如何编写java插件,如何PostMan调用API服务,如何将云苍穹的数据返回给PostMan。
自定义服务使用步骤:
1. 注册第三方应用,在开放平台下找到第三方应用,新增第三方应用信息,填写系统编码和系统密码等信息。
2. 获取appToken,根据第三方应用信息获取appToken。
3. 获取accessToken信息,用appToken和用户信息,从api/login.do中获取accessToken。
api/login.do是云苍穹定义好的api功能,不需要注册或配置,直接使用即可。
4. 编写java代码插件,定义好返回的数据。
5. 注册自定义服务,配置好调用调用的url、注册java插件。
6. 调用自定义服务,携带accessToken调用自定义服务,这时会调用到java插件,获取到代码中自定义的返回数据。
自定义服务使用步骤截图:
1. 注册第三方应用
进入开放平台,打开第三方应用列表
2. 获取appToken
第三方应用注册完成之后,用postMan构造post请求
请求链接:
http://127.0.0.1:8080/ierp/api/getAppToken.do
请求参数:
请求体,appId是第三方应用的系统编码,appSecuret第三方应用的系统密码,tenantId租户id,accountId数据中心id,
{
"appId":"wrx_th_service",
"appSecuret":"123456",
"tenantid":"cosmic-simple",
"accountId":"855027130579288064",
"language":"zh_CN"
}
tenantId租户id在mc中查看
accountId数据中心id在mc中查看
3.获取accesstoken
请求链接:
http://localhost:8080/ierp/api/login.do
请求体:
user是用户名,这里填写登录时的手机号;
usertype登录方式是手机号登录,默认填写为"Mobile";
tenantId租户id;accountId数据中心id。
{
"user":"1370000000",
"apptoken":"8e2646a4-01e2-4c9a-9375-748f06d94ba1",
"tenantid":"cosmic-simple",
"accountId":"855027130579288064",
"usertype":"Mobile",
"language":"zh_CN"
}
如下图,响应体中获取到了accesstoken
4. 编写java代码插件
实现思路是继承IBillWebApiPlugin接口,重写doCustomService方法,获取请求体参数。
判断请求体参数的值,根据值得不同,返回不一样的数据。
package kd.ecos.demo; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import kd.bos.bill.IBillWebApiPlugin; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.serialization.DcJsonSerializer; import kd.bos.dataentity.serialization.DynamicObjectSerializationBinder; import kd.bos.entity.api.ApiResult; import kd.bos.servicehelper.BusinessDataServiceHelper; import java.util.Map; public class DemoBillWebApiPlugin implements IBillWebApiPlugin { private static final String MY_KEY = "getdata"; @Override public ApiResult doCustomService(Map<String, Object> params) { Object result; boolean isSuccess; // 写个实例,根据键"getdata"对应的值的不同,进行不同的操作,返回不同的数据 switch (params.get(MY_KEY).toString()) { case "1011": { // 从单据wrx1_1011中,查询两个字段:billno,wrx1_textfield DynamicObject[] dynamicObjects = BusinessDataServiceHelper.load("wrx1_1011", "billno,wrx1_textfield", null ); // 把获取到的数据转为json DynamicObjectSerializationBinder b = new DynamicObjectSerializationBinder(dynamicObjects[0].getDynamicObjectType()); b.setOnlyDbProperty(false); DcJsonSerializer jsr = new DcJsonSerializer(b); JSONArray jsonArray = new JSONArray(); for(int i = 0; i < dynamicObjects.length; ++i) { JSONObject jsonObject = JSONObject.parseObject(jsr.serializeToString(dynamicObjects[i], (Object)null)); jsonArray.add(jsonObject); } // 成功 isSuccess = true; // 把jsonArray赋值给结果变量result result = jsonArray; break; } case "hw": { result = "hello world"; isSuccess = true; break; } default: { result = "params is wrong"; isSuccess = false; break; } } if (isSuccess) { return ApiResult.success(result); } else { return ApiResult.fail(result.toString()); } } }
5. 新增自定义服务,注册java插件
6. 调用自定义服务
把第3步获取到的accessToken信息作为请求头:
配置请求体:
获取请求结果:
推荐阅读