Http接口请求

Http接口定义

语法

  http_method : "接口基准相对路径"
    接口类型 : "接口相对地址" [ ("接口简要说明")
      处理逻辑定义 *
      fields_param: {
        参数列表定义
      }
      fields_cond: {
        条件参数列表定义
      }
      fields_checker: {
        参数值检查验证定义
      }
      fields_filter: {
        参数值检查过滤转义
      }
      常规固定参数名设定列表
      返回值定义说明

接口类型 定义接口的行为类型,由给定类型的字母开头。
可以有基础的由程序自动生成相关代码的 CURLD 创建,更新,读取,列表,删除
可以有自定义处理逻辑的 O,处理逻辑定义一定要有logic 指定函数名
可以在CURLDO后面追加1,2,3数字指定逻辑处理函数额外添加的参数

1: 最前面添加HttpRequest参数,可以通过这个参数直接获取原始的Http请求信息,比如请求的头信息,如果要对请求头做额外处理,可以指定
2: 在1的基础上,在HttpRequest参数后面再追加HttpResponse参数,可以通过这个参数直接对返回的应答做额外处理,比如返回额外的头信息
3. 在2的基础上,在逻辑函数的最后再追加_contentsetted 参数,用于表示是否已经在逻辑处理函数中设置好返回结果,不使用默认的代码生成的返回值

Logic函数的参数列表

参数类型 参数名 含义 出现条件 后缀 逻辑函数
CSHttpRequest Request 原始Http请求信息 CRUDLO 1,2,3 logic,logic_pre,logic_pre2,logic_post
CSHttpResponse Response 原始Http应答信息 CRUDLO 2,3 logic,logic_pre,logic_pre2,logic_post
map<string,string> _data 经过初始验证的请求参数 CRUDLO 必有 logic,logic_pre,logic_pre2,logic_post
map<string,string> _cond 经过初始验证的条件参数 CRUDL 有设置fields_cond logic_pre,logic_pre2,logic_post
Item * item 要处理的对象 RUD logic_post
string _extradata 列表分页信息 L logic_pre,logic_pre2,logic_post
list<Item *> items 要处理的对象列表 L logic_post
string wherePart 筛选数据的SQL条件部分 CRUDL logic_pre2
int nErrorCode 错误代码,正常为0 CRUDLO 必有 logic,logic_pre,logic_pre2,logic_post
string res 返回结果字符串 CRUDLO 必有 logic,logic_pre,logic_pre2,logic_post
string _extra 有列表分页信息 O logic
bool _contentsetted 是否已手工设置好返回结果 CRUDLO 3 logic,logic_pre,logic_pre2,logic_post

处理逻辑定义 定义实际处理接口逻辑的代码函数名,函数名要以 do开头,这边写的名称不需要do

logic: 正常的处理逻辑,一般由自定义接口类型使用
logic_pre: 前置执行,比如检查一下传入的参数值是否合法等
logic_pre2: 前置执行,比如检查一下传入的参数值是否合法等,函数参数上有wherePart指定SQL条件范围,logic_pre2和logic_pre同时设置时,忽略logic_pre的设置
logic_post: 后置执行,比如添加了一个数据后要做一些处理

注: 一般logic为O类型自定义逻辑函数使用,logic_pre,logic_pre2,logic_post为CRULD默认创建的代码逻辑提供在数据操作前后的插入式Hook代码处理。

处理权限验证 定义响应接口所需要的相关权限验证

need_roles: 需要的身份
need_auth: 需要的权限
need_login: 需要用户先登录
need_sign: 参数需要签名处理
need_ips: 限制指定的一些IP可以访问这个接口

默认错误代码 定义一些默认错误代码,在没有到logic处理前由生成代码验证、执行过程碰到的错误

error_db: 数据库存取失败的错误代码
error_noparam: 缺少参数的错误代码,所有参数都为空情况或必要的条件参数组都为空
error_nodataparam: 缺少数据参数的错误代码,比如update更新,没有指定要更新的数据字段

参数的形式

has_extra: 是否有分页信息参数,用于列表数据获取类的接口
param_type: 参数类型  object, list
param_form: 参数传递的方式, json,xml,field
param_class:当为json,xml时,可以设置的对象,如果不设置,则将定义的参数列表封装为json或xml格式

参数列表定义 对参数做定义说明

update_fieldname : 当接口只更新一个字段值时,指定要更新的字段名
update_fieldvalue: 指定要更新的字段值

update_fieldnames : 当接口只更新多个字段值时,指定要更新的字段名列表
update_fieldvalues: 指定要更新的字段值列表,要和前面字段名顺序相同

update_fields: 限定哪些字段名可以用来更新,多个字段之间用逗号分隔,比如 status=0,enabled=1 设置status=0且设置enabled=1

fields_related: 关联字段
fields_show: 获取数据显示类的接口,限定输出的字段名列表,多个之间用逗号分隔
fields_showlist: 前端列表界面要显示的字段列表
fields_cond : 条件参数
fields_condvalues: 固定传入的条件参数和对应的参数值,多个字段之间用逗号分隔,比如 status=0,enabled=1
fields_cond_group: 条件分组,竖线分割各个组,当所有分组都有为空值时,提示err_noparam错误,比如id|mobile,userid表示条件要id不为空或者mobile不为空且userid不为空,否则做error_noparam出错提示
fields_param: 对应数据更新类的接口,可以是要更新值的字段
fields_canempty: 可以输入值为空的字段名列表,多个名称之间用逗号分隔
fields_upload: 用于上传文件的字段名列表,多个名称之间用逗号分隔
   // 参数名   参数类型   参数说明
   name       (string)   ("用户账号名,必须小写字母开头后面可以字母和数字")

常规固定参数名称设置 定义一些可以由系统自动设置值的参数名称,比如用户IP,创建时间等
可以有如下一些字段名称设置,要和参数列表中的名称做对应

  // 用户IP
  field_clientip : ip,
  // 用户浏览器UA
  field_clientua : ua,
  // 当前登录用户名
  field_loginuser: user,
  // 当前登录用户的ID
  field_loginuid: uid,
  field_loginusertype: usertype,
  // 当前时间
  field_now : timestamp,
  // 数据创建时间
  field_createtime: createtime,
  // 数据最后更新时间
  field_lastoperate: lastoperate,
  field_creator : creator,
  field_lastoperator: lastoperator,
  field_creatorid: creatorid,
  field_lastoperatorid: lastoperatorid,
  // 状态字段
  field_status: status,

字段输入值验证

fields_checker : 对输入字段值做验证
fields_filter  : 对输入的字段做预先过滤处理,比如先做转义处理、去除前后的空格等

字段输入值验证

  参数名 : [
    检查函数(检查参数列表) : 检查失败的错误代码 : 失败错误提示信息;
  ]

检查函数为定义文件中指定的validator类的方法,函数名要以check开头,参数值作为字符串类型位置放在检查函数参数列表的最后
比如定义文件中指定检查函数 maxLen(9),则在类中需要有bool checkMax(int val, const string & toCheck);

字段输入值过滤转义

  参数名 : [
    过滤函数(过滤参数列表);
  ]

过滤函数为定义文件中指定的filter类的方法,函数名要以filter开头,参数值作为字符串类型位置放在检查函数参数列表的最后
比如定义文件中指定时间过滤函数 timeField(),将yyyymmdd格式的时间转换为unixtime格式,则在类中需要有string filterTimeField(const string & toFilter);

返回值定义说明,对返回值的类型,范例做定义

   // 返回的类型,可以有object, list等
   return_type : object;
   // 返回的数据形式,可以有json,xml等
   return_form : json;
   // 如果为object,list则指明返回值的类型
   return_class: UserItem;
   return_sample: "返回的结果"

一个接口定义范例

http_method  : "account"
   C : "create"      [ ("创建账号")
    logic_pre      : PreNewAccount,
    fields_param   : {
      name       (string)  "账号名";
      password   (string)  "账号密码";
      desc       (string)  "账号说明";
      ip         (string)  "创建账号的ip";
    },
    fields_checker : {
       name : [
          minLen(4) : LEN_TOO_SHORT : "长度小于4";
          maxLen(9) : LEN_TOO_LONG  : "长度大于9";
          lenBetween(4, 9) : LEN_OUT_RANGE  : "长度不在允许范围内";
       ];
    },
    field_clientip : ip,
    return_sample  : "ok"
   ]