本文档演示如何在氚云中书写一个自定义接口,提供给第三方系统调用
1. 新建一个表单用来保存自定义接口
2.在表单设计----》后端代码 插入自定义接口,(默认的代码保持不变,请勿删除)保存成功后,即可使用自定义代码接口了。
//自定义接口代码,代码放在本表单默认的类代码下 //说明:自定义接口类个数无限制,类名可以自定义,但是类名不可重复,且必须继承自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 } } } }
//控制台打印本次请求得到的结果 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 } */ |