开放平台,API服务,自定义服务+java插件原创
金蝶云社区-吴锐雄
吴锐雄
23人赞赏了该文章 7053次浏览 未经作者许可,禁止转载编辑于2021年06月24日 16:19:14

创作不易,如果文章对您有帮助,请为我点击一个朴实无华的赞^_^,我会更有动力持续地更新文章。


需求场景:

开发者需要通过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. 注册第三方应用

进入开放平台,打开第三方应用列表

image.png

image.png

image.png

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中查看

image.png

accountId数据中心id在mc中查看

image.png

image.png

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

image.png


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插件

image.png

image.png

image.png

image.png

image.png

image.png


6. 调用自定义服务

把第3步获取到的accessToken信息作为请求头:

image.png


配置请求体:

image.png


获取请求结果:

image.png




赞 23