跳转至

自定义接口

本文档演示在氚云中编写自定义接口供第三方系统调用的方法。当 OpenAPI 接口无法满足需求时,可开发自定义接口。

编写自定义接口

新建表单用于编写自定义接口代码,该表单需至少包含一个控件方可保存。

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

以下示例在表单设计>后端代码中创建名为MyApiController的自定义接口类。自定义接口类必须继承H3.SmartForm.RestApiController类,所有方法逻辑入口统一为OnInvoke方法,通过actionName参数区分不同逻辑。

using System;
using System.Collections.Generic;
using System.Text;
using H3;

public class D00018sm493dffc8fb7849e0937dcb9eafdda0b9 : H3.SmartForm.SmartFormController
{
    public D00018sm493dffc8fb7849e0937dcb9eafdda0b9(H3.SmartForm.SmartFormRequest request) : base(request)
    {
    }

    protected override void OnLoad(H3.SmartForm.LoadSmartFormResponse response)
    {
        base.OnLoad(response);
    }

    protected override void OnSubmit(string actionName, H3.SmartForm.SmartFormPostValue postValue, H3.SmartForm.SubmitSmartFormResponse response)
    {
        base.OnSubmit(actionName, postValue, response);
    }
}

//自定义接口代码放在本表单默认类代码下
//说明:自定义接口类个数无限制,类名可自定义但不可重复,必须继承自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 stringValue =   this.Request.GetValue<string>("para1",   "defaultValue");
                //从传入参数获取key为“para2”的值,未传则取默认值0,转换失败则报错
                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,定时器或自定义接口中无当前登录人时使用
                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时,回复异常提示
                response.ReturnData.Add("message", "无法处理actionName为“" + actionName + "”的请求!");
            }
          }
          catch(Exception ex)
          {
            //代码异常时,回复key为“result”值为“error”的结果
            response.ReturnData.Add("result", "error");
            //代码异常时,回复捕获的异常原因
             response.ReturnData.Add("message", ex.Message);
          }
      }
}

⚠️ 注意
actionName 不可使用以下保留字段:

  • LoadBizObject
  • LoadBizObjects
  • CreateBizObject
  • CreateBizObjects
  • UpdateBizObject
  • RemoveBizObject

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

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";
            }
        }
    }
}

⚠️ 注意
获取应用编码路径:列表 > 点击左上角应用名后的设置按钮 > 重命名

返回结果

参数 说明
Successful 接口调用是否成功(true/false)
ErrorMessage 错误提示信息
Logined 保留字段,可忽略
ReturnData 接口返回的业务数据
DataType 返回数据类型(默认值 0)

返回结果示例:

 {
     "Successful": true,
     "ErrorMessage": null,
     "Logined": false,
     "ReturnData": {
       "result":   "success",
       "message":   "",
       "data": {
           "StringValue":   "传给接口的参数一",
           "DoubleValue":   5.24343,
           "ArrayValue": [
               999,
               1000,
               997,
               1002
            ]
       }
     },
     "DataType": 0
 }
 {
     "Successful": true,
     "ErrorMessage
 }