更新时间:2024-08-01 GMT+08:00
分享

脚本/MyBatis方式生成API

本文将为您介绍如何通过脚本或MyBatis方式生成API。

为了满足高阶用户的个性化查询需求,数据服务提供了自定义SQL的脚本/MyBatis取数方式,允许您自行编写API的查询SQL,并支持多表关联、复杂查询条件以及聚合函数等能力。

  • 脚本方式:仅支持普通SQL语法。
  • MyBatis方式:仅专享版数据服务支持此方式,此方式下脚本支持Mybatis标签语法。Mybatis方式下参数解析格式为#{parameter},支持if、choose、when、foreach和where等标签语法,您可以借助标签语法来灵活实现空值校验、多值遍历、动态查表、动态排序及聚合等复杂查询逻辑。

    MyBatis方式当前在“华南-广州”区域公测,公测结束后会陆续在其他区域上线。

前提条件

已在管理中心 > 数据连接页面,完成数据源的配置。

约束与限制

API生成暂不支持Hive数据源的中文表和中文列场景。

新建API目录

API目录是按一定次序编排记录的API索引,是反映类别、指导使用、检索API的工具,帮助API开发者对API服务进行有效的分类和管理。

  1. 参考访问DataArts Studio实例控制台,登录DataArts Studio管理控制台。
  2. DataArts Studio控制台首页,选择对应工作空间的“数据服务”模块,进入数据服务页面。
  1. 在左侧导航栏选择服务版本(例如:专享版),进入总览页。
  2. 进入开发API > > API目录页面,单击

    输入新建API目录名称,可新建API目录。

  3. 对于已成功创建的API目录,在API目录上右键单击,可选择编辑或删除API目录。

配置API基本信息

  1. DataArts Studio控制台首页,选择对应工作空间的“数据服务”模块,进入数据服务页面。
  1. 在左侧导航选择服务版本(例如:专享版),进入总览页。
  2. 进入API管理页面,单击“新建”,填写API基本信息。
    表1 API基本信息

    配置

    说明

    API名称

    支持中文、英文、数字、下划线,且只能以英文或中文开头,3-64个字符。

    API目录

    一个特定功能或场景的API集合,类似文件夹,指定当前API保存的位置,后续可以在指定的API目录中检索当前API。

    API目录是数据服务中API的最小组织单元。您可以选择新建API目录已创建的目录。

    请求Path

    API访问路径,例如:/getUserInfo。

    请求Path即完整的URL中,域名之后、查询参数之前的部分,如图1中的“/blogs/xxxx”。
    图1 统一资源定位符URL说明

    在请求Path中,可以使用大括号{}标识路径中的参数作为通配符。如“/blogs/{blog_id}”表示/blogs后可以携带任何参数,例如“/blogs/188138”和“/blogs/0”均会匹配至/blogs/{blog_id},由此API统一处理。

    此外,相同域名下,不允许重复的请求路径出现。路径参数作为通配符时,名称不具备唯一性,例如“/blogs/{blog_id}”和“/blogs/{xxxx}”,会被视作相同路径。

    参数协议

    用于传输请求的协议,共享版支持HTTP或HTTPS协议,专享版支持HTTPS协议。

    推荐选择HTTPS协议,HTTP安全性欠佳,可能会存在安全风险。

    • HTTP属于基础的网络传输协议,无状态、无连接、简单、快速、灵活、使用明文传输,在使用上较为便捷,但是安全性欠佳。
    • HTTPS是在HTTP协议上进行了SSL或TLS加密校验的协议,能够有效验证身份以及保护数据完整性。相对的,访问HTTPS的API,需要配置相关的SSL证书或跳过SSL校验,否则将无法访问。

    请求方式

    HTTP请求方式,表示请求什么类型的操作,包含GET、POST等,遵循resultful风格。
    • GET:请求服务器返回指定资源,推荐使用GET请求。
    • POST:请求服务器新增资源或执行特殊操作。POST请求当前不支持body体,而是直接透传。

    描述

    对API进行简要描述。

    标签

    对API设置标签。用于标记当前API的属性,创建后可以通过标签快速检索定位API。单个API最多可设置20个标签。

    审核人

    审核人拥有API的审核权限。可单击“添加”,进入审核中心 > 审核人管理页面,新建审核人。

    安全认证

    创建API时,有如下三种安全认证方式可选。三种方式的区别在于认证方式和调用方法不同,推荐使用安全性更高的APP认证。
    • APP认证:将APP认证方式的API授权给应用后,使用应用的密钥对(AppKey和AppSecret)进行安全认证,支持通过SDK或API调用工具调用,安全级别高,推荐使用。
    • IAM认证:将IAM认证方式的API授权给当前账号或其他账号后,借助从IAM服务获取的用户Token进行安全认证。支持通过API调用工具调用,安全级别中等。
    • 无认证:不需要认证,所有用户均可访问,建议仅在测试接口时使用,不推荐正式使用。使用无认证方式时,无需鉴权认证信息,安全级别低,通过API调用工具或浏览器即可直接调用。

    服务目录可见性

    发布后,所选范围内的用户均可以在服务目录中看到此API。
    • 当前工作空间可见
    • 当前项目可见
    • 当前租户可见

    访问日志

    勾选,则此API的查询结果将会产生记录并被保留7天,可以在“运营管理 > 访问日志”处通过选择“请求日期”的方式查看对应日期的日志。

    最低保留期限

    API发布状态预留的最低期限,单位为小时,0表示不设限制。

    如果需要停用/下线/解除授权,则停用/下线/解除授权时间必须选择在发布后的最低保留期限时间之后。选择时间后,停用/下线/解除授权会通知已授权用户。如果所有已授权用户均完成审核中心通知列表消息处理,或在应用中解绑与API的绑定关系,API就会停用/下线/解除授权;否则会以待停用/待下线/待解除授权状态,等待达到停用/下线/解除授权时间,再强制停用/下线/解除授权。

    例如,最低保留期限设置为24小时,则此API发布后需要停用时,停用时间必须选择在发布24小时后,即发布第二天之后。如果期间内已授权用户已完成审核中心通知列表消息处理或解绑应用与API的绑定关系,则会直接停用;如果未完成,则会以待停用状态等待达到停用时间,强制停用。

    入参定义

    配置调用API需要输入的参数,此处定义后即为配置取数逻辑时的请求参数。

    入参定义主要由参数位置、参数类型、是否必填、允许空值以及默认值等组成。
    • 参数位置主要包括Query、Header、Path、Body四大类,另外还支持Static静态参数。
      • Query是位于URL后的查询参数内容,以“?”开始,通过“&”连接多个参数。
      • Header参数是位于请求消息头中的参数,常用于传递当前信息。例如host,token等。
      • Path是位于请求路径中的请求参数,如果定义了Path参数,则需要在请求Path中也添加此参数,作为请求Path的一部分。
      • Body是位于请求体内的参数,一般使用json格式表示。
      • Static是不随API调用者的传值变化的静态参数,仅当安全认证为APP认证方式时支持。Static参数数值由API授权时确定(如果授权时未配置参数值,则SDK调用时会使用API入参默认值,API工具调用时会导致缺少Static参数值的报错)。
    • 参数类型分为数值型Number与字符型String两大类。Number参数对应数据库中int、double、long等数值数据类型,String参数对应数据库中char、vachar、text等文本数据类型。
    • 是否必填、允许空值以及默认值。
      • 如果设定为必填,则API在访问时,必须传入指定参数。
      • 如果设定为非必填,则在API访问时,未传入的参数会使用默认值进行代替;如果未传入参数,也没有默认值,则允许空值时会使用null替换,不允许空值时忽略该参数条件。
    说明:

    入参定义中,参数大小限制如下:

    • Query+Path,URL最大32KB
    • Header,最大128KB
    • Body, 最大128KB
    实际配置中,需要根据所设计的调用API时请求参数情况来设置入参。例如,在用户表中根据用户ID查询用户信息时,请求Path设置为:/getUserInfo。可按照如下不同场景来配置入参:
    • API调用时请求参数为用户id,需要返回对应id的用户信息。
      1. 单击“添加”,参数名配置为id。
      2. 参数位置选择Query。
      3. 类型设置为Number。
      4. 是否必填选择必填。
      5. 默认值保持默认,无需填写。
    • API调用时请求参数为用户id1和用户id2,需要返回id1-id2范围内的用户信息:
      1. 单击“添加”,参数名配置为id1。
      2. 参数位置选择Query。
      3. 类型设置为Number。
      4. 是否必填选择必填。
      5. 默认值保持默认,无需填写。
      6. 再次单击“添加”,按照id1参数的配置信息再配置id2。
  3. 配置好API基本信息后,单击“下一步”,即可进入API取数逻辑页面。

配置取数逻辑

本例中以脚本方式说明如何配置API取数逻辑。Mybatis方式与之相比差异在于参数解析形式和支持的语法差异,在使用流程上没有区别。

如果使用Mybatis方式生成API,则需要将本章节脚本中的参数解析格式由${parameter}修改为#{parameter}形式,另外Mybatis方式支持的标签语法可在界面中单击脚本编辑处的,查看弹出的Mybatis脚本编辑提示。

“取数方式”选择“脚本方式”“MyBatis方式”
  1. 选择数据源、数据连接、数据库等数据信息。

    数据服务仅支持部分数据源,详情请参见DataArts Studio支持的数据源。您需提前在DataArts Studio管理中心中配置好数据源,按照脚本编辑提示要求输入SQL语句。

  2. 选择分页方式,推荐使用自定义分页方式。
    • 默认分页是指在创建API时输入了SQL,数据服务会自动基于SQL外层包装分页逻辑。
      例如输入的SQL脚本为:
      SELECT * FROM userinfo WHERE id=${userid}

      数据服务在处理调试或者调用时,将自动在用户SQL外层包装分页逻辑,从而变成以下脚本:

      SELECT * FROM (SELECT * FROM userinfo WHERE id=${userid}) LIMIT {limitValue} OFFSET {offsetValue}

      其中limitValue表示读取的数据条数,offsetValue表示跳过的数据条数(即偏移量),系统将默认赋值。

    • 自定义分页是指在创建API时,数据服务将不对SQL进行处理,分页逻辑需要在写SQL时由用户自定义。
      如果已知需要读取的数据条数limitValue和需要跳过的数据条数offsetValue,则分页逻辑可以写成以下脚本:
      SELECT * FROM userinfo WHERE id=${userid} LIMIT {limitValue} OFFSET {offsetValue}

      而在实际使用中,更多的是根据分页后的页面大小pageSize和页码pageNum定义分页逻辑,脚本样式如下:

      SELECT * FROM userinfo WHERE id=${userid} LIMIT {pageSize} OFFSET {pageSize*(pageNum-1)}
      值得注意的是,不同的数据源具有不同的语法风格,分页脚本应按照数据源语法要求调整。例如:
      • DLI数据源不支持“LIMIT {limitValue} OFFSET {offsetValue}”的写法,仅支持“LIMIT {limitValue}” 。
      • HETU数据源分页需要反转,不支持“LIMIT {limitValue} OFFSET {offsetValue}”的写法,仅支持“OFFSET {offsetValue} LIMIT {limitValue}”。
  3. 编写API查询SQL。

    在脚本编辑页面,单击脚本编辑处的,按照脚本编辑提示开发SQL查询语句。单击可将入参添加为SQL语句的API请求参数。另外,专享版数据服务支持返回总条数,开启后可返回取值脚本执行结果数据的总条数。

    例如,需要在用户表中根据用户ID查询用户信息时,取值脚本可写为如下脚本。其中,“id”为userinfo表中的字段,“userid”为API中定义的入参。

    SELECT * FROM userinfo WHERE id=${userid}

    如果分页方式为自定义分页,页面大小pageSize为10、页码pageNum为2时,按照LIMIT {pageSize} OFFSET {pageSize*(pageNum-1)}转换方法,脚本可写为:

    SELECT * FROM userinfo WHERE id=${userid} LIMIT 10 OFFSET 10
    图2 编写API查询SQL

    脚本编辑完成后,单击脚本编辑窗口下方的“测试SQL”,填写入参值,执行验证是否能返回预期结果。如果测试失败,可在“预览SQL”页签下查看实际运行的SQL语句是否符合预期,或者通过“日志”页签查看报错信息。

    图3 测试SQL

    • SELECT查询的字段即为API返回参数,支持通过AS返回别名。
    • WHERE条件中的参数为API请求参数,脚本方式下参数格式为${参数名},MyBatis方式下参数格式为#{参数名}。
    • 专享版数据服务支持返回总条数,开启后可返回取值脚本执行结果数据的总条数。
    • 如果单个参数需要传多个值时,写法如下:
      • 字符串:'a','b','c'
      • 数值:1,2
      • 字段:a,b,c
  4. 添加排序参数。

    在排序参数列表中,单击“新建”可设置排序字段。

    • 字段名称对外不可见,是所选的数据表中的字段,是API调用时实际访问的内容。在API查询SQL语句已编写完成且测试通过的前提下,可在“字段名称”输入框中选择排序字段。
    • 变量可自定义,用于与字段名称关联。在“变量”输入框中输入参数名称(一般填写为参数名称即可),系统会自动修改为变量形式。
    • 是否可选决定了调用API时此排序参数是否必选,勾选则表示此参数可以不传,可以通过排序参数描述pre_order_by的值配置是否参与排序;不勾选则此参数必传,即使排序参数描述pre_order_by的值未配置此参数,依然会参与排序。
    • 排序方式表示了当前参数允许使用的排序形式,分为升序、降序以及自定义。自定义排序参数默认为升序排序,可通过排序参数描述pre_order_by的值进行调整;而升序或降序的排序参数,不支持通过pre_order_by的值调整排序方式,如果pre_order_by的值与此处设置排序方式不符,则会导致配置调试或调用报错。
    • 多个排序参数时,表示当第一个排序参数相等时,再逐一用后续排序参数去排序。与配置方式不同的是,参数的排序顺序与添加排序字段的先后无关,而是需要通过SQL脚本自定义,并且不支持通过排序参数描述pre_order_by的值进行调整。

    注意,脚本/MyBatis API的排序字段必须要使用ORDER BY添加到SQL语句中,才能使该排序参数生效,单击可将排序参数添加到SQL语句。添加ORDER BY参数时,关联字段名即可,多个排序字段的先后顺序由脚本定义,不支持在脚本中通过ASC或DESC设置顺序或降序方式。SQL语句中未添加的排序参数即使在排序参数描述pre_order_by的值中定义,排序也不会生效。

    例如,需要在用户表中根据用户ID查询用户信息,先后通过age和kk两个字段排序,页面大小pageSize为10、页码pageNum为2时,脚本样例如下。

    SELECT * FROM userinfo WHERE id=${userid} order by ${age},${kk} LIMIT 10 OFFSET 10
    图4 添加排序参数

    脚本编辑完成后,单击脚本编辑窗口下方的“测试SQL”,填写入参值和排序参数描述pre_order_by的值,执行验证是否能返回预期结果。

    pre_order_by的默认值已由系统根据已配置的所有排序参数给出,自定义排序默认为升序。排序参数描述pre_order_by的值填写形式为“排序参数参数名:ASC”或“排序参数参数名:DESC”,其中ASC表示升序,DESC表示降序,多个排序参数描述以“英文分号”进行分隔。勾选“是否传值”后,测试结果将按照pre_order_by的值排序。

    对于pre_order_by的值,您可以进行如下修改:
    • 删掉某可选的排序参数,则此排序参数不再参与排序。
    • 修改自定义排序方式的排序参数为升序或降序方式,则此排序参数按照修改后的排序方式排序。
    pre_order_by的值,不支持进行如下修改,否则会修改不生效或导致调用报错。
    • 删掉某必选的排序参数,则此排序参数依然会正常参与排序,删除不生效。
    • 调整排序参数的前后顺序,则排序依然以SQL中的排序参数顺序为准。调整不生效。
    • 修改升序或降序的排序参数为其他排序方式,则会调用失败,不允许修改。

    如果测试失败,可在“预览SQL”页签下查看实际运行的SQL语句是否符合预期,或者通过“日志”页签查看报错信息。

    图5 测试SQL

  5. 单击“下一步”,进行API测试页面。

测试API

  1. 填写入参取值。
    如果单个参数需要传多个值时,写法如下:
    • 字符串:'a','b','c'
    • 数值:1,2
    • 字段:a,b,c
    图6 填写入参取值

  2. (可选)调整排序参数描述pre_order_by的值。

    pre_order_by的默认值已由系统根据已配置的所有排序参数给出,自定义排序默认为升序。排序参数描述pre_order_by的值填写形式为“排序参数参数名:ASC”或“排序参数参数名:DESC”,其中ASC表示升序,DESC表示降序,多个排序参数描述以“英文分号”进行分隔。勾选“是否传值”后,测试结果将按照pre_order_by的值排序。

    对于pre_order_by的值,您可以进行如下修改:
    • 删掉某可选的排序参数,则此排序参数不再参与排序。
    • 修改自定义排序方式的排序参数为升序或降序方式,则此排序参数按照修改后的排序方式排序。
    pre_order_by的值,不支持进行如下修改,否则会修改不生效或导致调用报错。
    • 删掉某必选的排序参数,则此排序参数依然会正常参与排序,删除不生效。
    • 调整排序参数的前后顺序,则排序依然以SQL中的排序参数顺序为准。调整不生效。
    • 修改升序或降序的排序参数为其他排序方式,则会调用失败,不允许修改。
    图7 调整排序参数描述pre_order_by的值

  3. (可选)查看分页参数值。

    采用默认分页方式时,可以查看分页参数情况,其中pageSize表示分页后的页面大小,pageNum表示页码。默认按100的大小分页,返回第1页数据。

    图8 查看分页参数值

  4. 完成API参数的配置并保存后,单击左下角的“开始测试”,可进入API测试环节。
    填写参数值,单击“开始测试”,即可在线发送API请求,在右侧可以看到API请求详情及返回内容。
    • 测试过程中,当数据服务API查询返回值超过默认100秒无结果时,会报超时错误。
    • 如果测试失败,请仔细查看错误提示并做相应的修改重新测试。

完成API测试之后,单击“确定”,即成功生成了一个数据API。

修改API

生成API后,如果您需要修改API内容,可在“开发API > API目录”或“开发API > API管理”处选择对应API,单击“编辑”按钮进行修改API的相关操作。

仅当API处于已创建、已驳回、已下线、已停用的情况下才能进行API修改。

相关文档