自定义接口
更新时间: 2023-12-01 浏览次数: {{ hits }}

本文档演示如何在氚云中书写一个自定义接口,提供给第三方系统调用

1. 新建一个表单用来保存自定义接口

image.png                                            

 

2.在表单设计----》后端代码 插入自定义接口,(默认的代码保持不变,请勿删除)保存成功后,即可使用自定义代码接口了。

image.png

//自定义接口代码,代码放在本表单默认的类代码下

//说明:自定义接口类个数无限制,类名可以自定义,但是类名不可重复,且必须继承自H3.SmartForm.RestApiController

public class MyApiController:   H3.SmartForm.RestApiController

{

      //此构造方法必须有,但是方法体内不需要写任何代码

      public MyApiController(H3.SmartForm.RestApiRequest request):   base(request) { }

 

      //第三方请求本自定义接口时,会触发本事件

      protected override void OnInvoke(string actionName,   H3.SmartForm.RestApiResponse response)

      {

          try

          {

            //“CreateOneData”可以为任意非空字符串,用来判断第三方请求的动作

            /*注:actionName   不能为已公开的ActionName,如下:

                            LoadBizObject  加载业务数据

                              LoadBizObjects  批量加载业务数据

                              CreateBizObject  创建业务数据

                            CreateBizObjects 批量创建业务数据

                              UpdateBizObject  更新业务数据

                            RemoveBizObject 删除业务数据

            */

            if(actionName ==   "CreateOneData")

            {

                //从传入的参数里获取 key为“para1” 的值,若未传,则得到默认值“defaultValue”,若传的值无法转换成string类型,则报错

                string stringValue =   this.Request.GetValue<string>("para1",   "defaultValue");

                //从传入的参数里获取 key为“para2” 的值,若未传,则得到默认值0,若传的值无法转换成int类型,则报错

                int intValue =   this.Request.GetValue<int>("para2", 0);

 

                //当找到了对应的actionName时,回复给第三方请求一个 key为“result”值为“success” 的结果

                  response.ReturnData.Add("result",   "success");

                //当找到了对应的actionName时,回复给第三方请求一个 key为“message”值为空字符串 的结果

                  response.ReturnData.Add("message", string.Empty);

 

 

                //以下代码演示在自定义接口中查询业务对象的范例,如实际用不上请删除

                H3.Data.Filter.Filter filter   = new H3.Data.Filter.Filter();

                H3.Data.Filter.And andMatcher   = new H3.Data.Filter.And();

                andMatcher.Add(new   H3.Data.Filter.ItemMatcher("Status",   H3.Data.ComparisonOperatorType.Equal, 1));//筛选出数据状态为生效的数据

                filter.Matcher = andMatcher;

                H3.DataModel.BizObjectSchema   schema =   this.Request.Engine.BizObjectManager.GetPublishedSchema("D00021MyApiTest");

                  //查询“D00021MyApiTest”表单里所有符合筛选条件的业务对象,得到一个业务对象数组

                //注:H3.Organization.User.SystemUserId   为系统默认用户Id,在定时器中、自定义接口中由于没有当前登录人,所以用这个代替this.Request.UserContext.UserId

                H3.DataModel.BizObject[] arr   = H3.DataModel.BizObject.GetList(this.Request.Engine,   H3.Organization.User.SystemUserId,

                    schema,   H3.DataModel.GetListScopeType.GlobalAll, filter);

 

 

                Dictionary < string,   object > dic = new Dictionary<string, object>();

                //从第三方传入参数里拿出传回给第三方

                  dic.Add("StringValue", stringValue);

                //传回给第三方一个小数

                  dic.Add("DoubleValue", 5.24343);

                //从第三方传入参数里拿出传回给第三方

                  dic.Add("ArrayValue", new int[4]{ intValue, intValue + 1,   intValue - 2, intValue + 3});

                //回复给第三方请求一个 key为“data”值为对象 的结果

                  response.ReturnData.Add("data", dic);

            } else

            {

                //当传入一个未找到的actionName时,回复给第三方请求一个 key为“result”值为“error” 的结果

                  response.ReturnData.Add("result", "error");

                //当传入一个未找到的actionName时,回复给第三方请求一个 key为“message”值为字符串 的异常提示

                  response.ReturnData.Add("message", "无法处理actionName为“" + actionName + "”的请求!");

            }

          } catch(Exception ex)

          {

            //当执行的代码发生异常时,回复给第三方请求一个 key为“result”值为“error”   的结果

              response.ReturnData.Add("result", "error");

            //当执行的代码发生异常时,回复给第三方请求一个 key为“message”值为捕获到的异常原因

              response.ReturnData.Add("message", ex.Message);

          }

      }

}

 

3.第三方系统中调用自定义接口示例(C#版):

//此处为请求的url

string apiAddress =   @"https://www.h3yun.com/OpenApi/Invoke";

System.Net.HttpWebRequest request =   (System.Net.HttpWebRequest)System.Net.WebRequest.Create(apiAddress);

 

//设置本次请求的方式为POST

request.Method = "POST";

 

//设置本次请求附带的数据为json格式

request.ContentType =   "application/json";

 

//身份认证参数,根据自己企业开发信息修改此处(注意:此两项请对管理员以外人员保密)

request.Headers.Add("EngineCode",   "XXXXXXXXXXXX");//系统集成-企业开发信息-EngineCode

request.Headers.Add("EngineSecret",   "XXXXXXXXXXXX");//系统集成-企业开发信息-Secret

 

//请求附带参数

Dictionary<string, object>   dicParams = new Dictionary<string, object>();

//“CreateOneData”可以为其他任意非空字符串,用来给自定义接口判断本次请求的动作

/*注:actionName 不能为已公开的ActionName,如下:

                LoadBizObject  加载业务数据

                LoadBizObjects  批量加载业务数据

                CreateBizObject  创建业务数据

                CreateBizObjects 批量创建业务数据

                UpdateBizObject  更新业务数据

                RemoveBizObject 删除业务数据

*/

dicParams.Add("ActionName",   "CreateOneData");

 

//“MyApiController”是自定义接口的类名

dicParams.Add("Controller",   "MyApiController");

 

//“D00021hca_test1”是自定义接口所在应用的应用编码,查看应用编码的方法:列表页面点击左上角应用名后的设置按钮,再点击重命名,在弹窗中可以看到当前应用的应用编码

dicParams.Add("AppCode",   "D00021hca_test1");

 

//传给自定义接口的一个字符串

dicParams.Add("para1", "传给接口的参数一");

 

//传给自定义接口的一个数值

dicParams.Add("para2", 999);

 

string jsonData =   Newtonsoft.Json.JsonConvert.SerializeObject(dicParams);

 

byte[] bytes;

bytes =   System.Text.Encoding.UTF8.GetBytes(jsonData);

request.ContentLength = bytes.Length;

using (System.IO.Stream writer =   request.GetRequestStream())

{

      writer.Write(bytes, 0, bytes.Length);

      writer.Close();

}

 

string strValue = string.Empty;

using (System.Net.HttpWebResponse   response = (System.Net.HttpWebResponse)request.GetResponse())

{

      using (System.IO.Stream s = response.GetResponseStream())

      {

          string StrData = string.Empty;

          using (System.IO.StreamReader Reader = new System.IO.StreamReader(s,   Encoding.UTF8))

          {

            while ((StrData =   Reader.ReadLine()) != null)

            {

                strValue += StrData +   "\r\n";

            }

          }

      }

}

 

//控制台打印本次请求得到的结果

Console.WriteLine(strValue);

 

/*调用成功时strValue的值展示:

      {

          "Successful": true,

          "ErrorMessage": null,

          "Logined": false,

          "ReturnData": {

            "result":   "success",

            "message":   "",

            "data": {

                "StringValue":   "传给接口的参数一",

                "DoubleValue":   5.24343,

                "ArrayValue": [

                    999,

                    1000,

                    997,

                    1002

                 ]

            }

          },

          "DataType": 0

      }

      */

 

/*调用失败时strValue的值展示:

      {

          "Successful": true,

          "ErrorMessage": null,

          "Logined": false,

          "ReturnData": {

            "result":   "error",

          "message": "无法处理actionName为“BadActionName”的请求!"

          },

          "DataType": 0

      }

*/