发帖

自定义接口

氚云知识库  / 前端/移动端  / 倒序浏览   © 著作权归作者本人所有

#楼主# 2020-11-30

跳转到指定楼层

注册氚云社区,学习低代码知识,与更多氚友互动交流

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 氚云-白泽 于 2020-12-28 03:03 编辑

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

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

                                            

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

[color=rgba(11, 19, 32, 0.64)]

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

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

  3. public class MyApiController:   H3.SmartForm.RestApiController

  4. {

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

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



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

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

  9.       {

  10.           try

  11.           {

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

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

  14.                             LoadBizObject  加载业务数据

  15.                               LoadBizObjects  批量加载业务数据

  16.                               CreateBizObject  创建业务数据

  17.                             CreateBizObjects 批量创建业务数据

  18.                               UpdateBizObject  更新业务数据

  19.                             RemoveBizObject 删除业务数据

  20.             */

  21.             if(actionName ==   "CreateOneData")

  22.             {

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

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

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

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



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

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

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

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





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

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

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

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

  35.                 filter.Matcher = andMatcher;

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

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

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

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

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





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

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

  43.                   dic.Add("StringValue", stringValue);

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

  45.                   dic.Add("DoubleValue", 5.24343);

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

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

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

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

  50.             } else

  51.             {

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

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

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

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

  56.             }

  57.           } catch(Exception ex)

  58.           {

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

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

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

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

  63.           }

  64.       }

  65. }
复制代码

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

  1. //此处为请求的url

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

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



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

  5. request.Method = "POST";



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

  7. request.ContentType =   "application/json";



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

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

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



  11. //请求附带参数

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

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

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

  15.                 LoadBizObject  加载业务数据

  16.                 LoadBizObjects  批量加载业务数据

  17.                 CreateBizObject  创建业务数据

  18.                 CreateBizObjects 批量创建业务数据

  19.                 UpdateBizObject  更新业务数据

  20.                 RemoveBizObject 删除业务数据

  21. */

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



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

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



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

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



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

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



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

  30. dicParams.Add("para2", 999);



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



  32. byte[] bytes;

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

  34. request.ContentLength = bytes.Length;

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

  36. {

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

  38.       writer.Close();

  39. }



  40. string strValue = string.Empty;

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

  42. {

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

  44.       {

  45.           string StrData = string.Empty;

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

  47.           {

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

  49.             {

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

  51.             }

  52.           }

  53.       }

  54. }



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

  56. Console.WriteLine(strValue);



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

  58.       {

  59.           "Successful": true,

  60.           "ErrorMessage": null,

  61.           "Logined": false,

  62.           "ReturnData": {

  63.             "result":   "success",

  64.             "message":   "",

  65.             "data": {

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

  67.                 "DoubleValue":   5.24343,

  68.                 "ArrayValue": [

  69.                     999,

  70.                     1000,

  71.                     997,

  72.                     1002

  73.                  ]

  74.             }

  75.           },

  76.           "DataType": 0

  77.       }

  78.       */



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

  80.       {

  81.           "Successful": true,

  82.           "ErrorMessage": null,

  83.           "Logined": false,

  84.           "ReturnData": {

  85.             "result":   "error",

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

  87.           },

  88.           "DataType": 0

  89.       }

  90. */
复制代码

回复

使用道具

2

主题

13

帖子

282

金币

lv4

Rank: 5

积分
383
佛门余孽 发表于 2021-9-10 09:53:13
我看不懂,但我大受震撼,大佬**666
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|氚云社区 |粤ICP备15096637号-1
Powered by Discuz! X3.4 Licensed  © 2001-2017 Comsenz Inc.