万能API
金蝶云社区-zym
zym
5人赞赏了该文章 2,438次浏览 未经作者许可,禁止转载编辑于2018年06月14日 09:10:40

K/3 Cloud在5.0版本中推出了集成利器WebApi,使得伙伴的集成开发更加简单了,无需构建Webservice站点,轻引用,轻松实现数据集成。唯一遗憾的是webapi接口仍然是面向表单级别的服务,缺少一个万能接口,可以由开发伙伴来自定义参数、自己实现接口的业务逻辑,自己返回处理结果。现在很高兴的告诉大家,我们将马上放开这个接口给到大家,让大家爱怎么玩就怎么玩。具体实现步骤请参考下面:

1、首先写一个K/3Cloud服务插件,需要引用Kingdee的相关组件,这个插件必须要继承抽象类Kingdee.BOS.WebApi.ServicesStub.AbstractWebApiBusinessService,实现构造函数,然后就可以任意定义服务接口和接口参数了,如下例子定义了两个服务接口:ExecuteService和UpdateData

参考示例如下:

using Kingdee.BOS.Core.Metadata;

using Kingdee.BOS.Core.SqlBuilder;

using Kingdee.BOS.JSON;

using Kingdee.BOS.Orm.DataEntity;

using Kingdee.BOS.Orm.Metadata.DataEntity;

using Kingdee.BOS.ServiceHelper;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace ApiServiceTest

{

    /// <summary>

    /// 

    /// </summary>

    public class CustomBusinessService : Kingdee.BOS.WebApi.ServicesStub.AbstractWebApiBusinessService

    {

        public CustomBusinessService(Kingdee.BOS.ServiceFacade.KDServiceFx.KDServiceContext context)

            : base(context)

        { }

        /// <summary>

        /// 执行服务,根据参数来处理自己的业务并返回结果

        /// </summary>

        /// <param name="ctx"></param>

        /// <param name="parameter"></param>

        /// <returns></returns>

        public JSONArray ExecuteService(string parameter)

        {

            // TODO:在此方法中处理业务,可以引用Kingdee现有接口,根据传入的参数来实现自己的业务逻辑,

            // 例如查询数据、单据转换、甚至数据同步等都可以

            // 以下为查询币别信息的示例代码

            // 构造查询参数

            QueryBuilderParemeter para = new QueryBuilderParemeter()

            {

                // 查询表单,测试用例中直接传入了“BD_Currency”

                FormId = parameter,

                // 需要查询币别主键、币别名称等信息,此处用字段的标识来构造

                SelectItems = SelectorItemInfo.CreateItems("FCURRENCYID,FName"),

            };

            // 调用查询接口

            DynamicObjectCollection list = QueryServiceHelper.GetDynamicObjectCollection(this.KDContext.Session.AppContext, para);

            // 返回结果类型可以自定义

            // 如果第三方系统不想引用BOS其他组件的,可以使用json字符串、List、Dictionary等类型做为返回结果

            // 此处示例代码使用 BOS定义的类型JSONArray

            JSONArray jsonArray = new JSONArray();

            foreach (DynamicObject dynamicObject in list)

            {

                jsonArray.Add(ConvertDynamicObject2Json(dynamicObject));

            }

            return jsonArray;

        }

        

        /// <summary>

        /// 自定义服务接口

        /// </summary>

        /// <param name="parameter"></param>

        /// <param name="formId"></param>

        /// <returns></returns>

        public bool UpdateData(string parameter,string formId)

        {

            return true;

        }


        private JSONObject ConvertDynamicObject2Json(DynamicObject dynamicObject)

        {

            DynamicPropertyCollection dynamicPropertyCollection = dynamicObject.DynamicObjectType.Properties;

            JSONObject obj = new JSONObject();

            foreach (DynamicProperty property in dynamicPropertyCollection)

            {

                obj.Put(property.Name, dynamicObject[property.Name]);

            }

            return obj;

        }

    }

}

2、第三方系统集成调用,参考示例如下:

namespace Test1

{

    static class Program

    {

        static void Main(string[] args)

        {

            // 使用webapi引用组件Kingdee.BOS.WebApi.Client.dll

            ApiClient client = new ApiClient("http://localhost:1200/");

            bool result = client.Login("00155dd2d2b4b79811e4113e191b84d1", "Developer", "888888", 2052);

            // 登陆成功

            object responseOut = null;

            if (result)

            {

                // 注意第一个参数 sn + classname + methodname,assembly

                responseOut = client.Execute<JSONArray>("ApiServiceTest.CustomBusinessService.ExecuteService,ApiServiceTest", new object[] { "BD_Currency" });

            }


            Console.Write(responseOut);


        }

    }

}

转载论坛:http://club.kingdee.com/home.php?mod=space&uid=421001&do=blog&id=119314&page=2#comment

赞 5