Skip to content
当前页大纲

接口引擎

简介

  • 接口引擎作为平台的最大亮点之一,主要解决复杂的业务逻辑,统一管理定制接口
  • 接口引擎由表单引擎驱动 在这里插入图片描述

支持所有后端V8函数

支持GetPost请求

  • 无论您是通过get还是post,均能成功请求接口引擎

支持FormJson请求

  • 无论您的请求是form-data还是payload-json,均支持

V8.Param

  • 均能接收和访问到formjsonurl三种参数
javascript
//支持接收3种类型的参数,均使用V8.Param.***访问
var id = V8.Param.Id;

异步执行代码

js
//新开一个线程异步执行V8代码
System.Threading.Tasks.Task.Run(function(){
  //接口引擎目前暂时不支持setTimeout(function, 1000),在Task.Run()内部使用Thread.Sleep(1000)效果一样
  System.Threading.Thread.Sleep(1000);//实现setTimeout(function, 1000)的效果,不加则是setTimeout(function, 0)的异步效果
  V8.FormEngine.UptFormData('diy_test1', {
    Id : '8007f94b-4883-4a0c-8c23-f25aca910722'
    Text45 : '2222',
  });
});

扩展接口引擎

js
using System;
using Dos.Common;
using Microi.Model.Aliyun;
namespace Microi.net
{
    public partial class V8EngineExtend
    {
        /// <summary>
        /// 这种方式支持。测试扩展V8.TestV8Extend3('test')方法
        /// </summary>
        /// <returns></returns>
        public string TestV8Extend3(string testParam)
        {
            return "TestV8Extend3:" + testParam;
        }
        /// <summary>
        /// 新增V8.Alipay对象。
        /// 这种方式支持V8.Alipay.Test22('test'),也支持V8.Alipay.CreatePay({ AppId : '11' })
        /// </summary>
        public Alipay Alipay
        {
            get { return new Alipay(); }
        }
        /// <summary>
        /// 新增V8.WeChat对象。
        /// </summary>
        public WeChat WeChat
        {
            get { return new WeChat(); }
        }
        public AlipayV3 AlipayV3
        {
            get { return new AlipayV3(); }
        }
        public Alidns Alidns
        {
            get { return new Alidns(); }
        }
    }
}

返回数据

  • 将数据返回给前端,可以是JSON、字符串、Html、文件等
javascript
//当指定了Code值为1时,平台会自动提交事务,无需手动执行V8.DbTrans.Commit()
return { Code : 1, Data : [1, 2, 3], Msg : '事务已提交!' };

//若代码出现return,并且未指定Code的值、或Code值不等于1时,则会自动回滚事务,无需手动执行V8.DbTrans.Rollback()
return { Code : 0, Msg : '错误信息,事务已回滚!' };

//若代码出现return,并且未指定Code的值,则会自动回滚事务,无需手动执行V8.DbTrans.Rollback()
V8.DbTrans.Commit();//除非在此手动执行[V8.DbTrans.Commit();]提交事务,此时平台才不会自动回滚事务
return { A : 111, B : 222 };

//支持返回JSON
return [{ Id : 1, Name : '张三' }];

return '支持返回字符串';

//支持返回HTML
return `<html>
          <body>
            <h1>支持返回HTML</h1>
          </body>
        </html>`;

//支持直接响应文件,如:图片、Office文档等等
var downResult = V8.Http.GetResponse({
  Url : 'https://static.itdos.com/itdos/img/20230623/WechatIMG21753.png'
});
var imgByte = downResult.RawBytes;
V8.Result = {
  Code : 1,
  Data : {
    FileName : '接口引擎直接返回响应文件.png',
    ContentType : 'image/png',
    FileByteBase64 : System.Convert.ToBase64String(imgByte)
  }
};

//旧版返回方式(仍然支持,但建议弃用这种方式)
//V8.Result = { Code : 1, Data : [] }

接口配置

基础配置

  • 名称(ApiName)随意,如:[移动端]获取商品列表
  • key(ApiEngineKey)随意,如:get-product-list
  • 禁止外部调用(StopHttp),开启后只能通过接口引擎V8代码或服务器端V8事件调用此接口(函数),且自定义接口地址失效

自定义接口地址

  • 自定义接口地址(ApiAddress),建议统一使用/apiengine/开头,如:/apiengine/get-product-list。当然您要自定义为/api111/b2222/c333/d444也可以,使用ApiBase + ApiAddress访问接口

分布式锁

  • 某些场景的接口,必须使用分布式锁,如:订单发货审批通过后扣除库存,防止库存变为负数。(当然也可以使用消息队列,这种方式其它文章讲解)
  • 开启分布式锁可以设定分布式锁Key,这个大有用处。比如说当我们要给商品A进行库存增减时,分布式锁Key就可以设置为商品A的Id,此时不同的商品走不同的分布式锁Key、排不同的队,大大提高并发吞吐量。
  • 若不设置分布式锁Key,那么1000个人同时调用此接口,都得排队

允许匿名调用

  • 接口引擎默认必须传入token才能被调用,否则会报错1001未登录
  • 当开启允许匿名调用时,则无需传入token,但注意在V8引擎中访问V8.CurrentUser为{}

响应文件

测试访问接口引擎地址会直接下载图片:https://api.itdos.com/apiengine/test_response_file?OsClient=iTdos

javascript
var downResult = V8.Http.GetResponse({
  Url : 'https://static.itdos.com/itdos/img/20230623/WechatIMG21753.png'
});
var imgByte = downResult.RawBytes;
return {
  Code : 1,
  Data : {
    FileName : '测试响应文件.png',
    ContentType : 'image/png',
    FileByteBase64 : System.Convert.ToBase64String(imgByte)
  }
};

接口测试

接口引擎表单提供了接口运行测试的功能(由表单引擎驱动)

接口调试

  • 1、定义是否需要向前端输出日志内容:【var isDebugLog = true;】
  • 2、定义需要向前端输出的日志内容:【var debugLog = {};】
  • 3、记录日志:【debugLog.Log1 = list1Result;】。也可以使用【V8.Method.AddSysLog】写MongoDB日志,然后在系统设置 -> 系统日志中查看
  • 4、判断是否向前端输出日志:【DataAppend : { DebugLog : isDebugLog ? debugLog : null }】
js
//【第一步】定义是否需要向前端输出日志内容,需要调试时为true,不需要调试时为false
var isDebugLog = true;//也可以使用系统设置全局变量:var isDebugLog = V8.SysConfig.V8EngineDebugLog;
//【第二步】定义需要向前端输出的日志内容
var debugLog = {};
//获取业务数据
var list1Result = V8.FormEngineGetTableData({
    FormEngineKey: 'test1',
    _Where: [
      ['field1', '=', '1']
    ]
});
//【记录日志】测试记录日志1
debugLog.Log1 = list1Result;
//【记录日志】【写MongoDB日志】
if(isDebugLog){
  V8.Method.AddSysLog({
    Type : '日志类型',
    Title : '日志标题',
    Content: `日志内容:${JSON.stringify(list1Result)}`
  });
}
if(list1Result.Code != 1){
  return list1Result;
}
//处理业务数据
debugLog.Log2 = [];
for(var i = 0; i < list1Result.Data.length; i++){
    var item = list1Result.Data[i];
    if(item.Number < 10){
        item.Number = '0' + item.Number;
        //【记录日志】测试记录日志2
        debugLog.Log2.push(item.Id);
    }
}
return {
    Code : 1, 
    Data : null, 
    DataAppend : {
        DebugLog : isDebugLog ? debugLog : null // 【第三步】判断是否向前端输出日志
    }
};

接口引擎实战

  • 这里我们会发布大量的接口引擎实现复杂的功能实战:接口引擎实战

MIT License.