
# 如何自定义调用服务编排的URL
#### 使用说明
低代码平台支持将已有的接口URL地址再包装成一个新的URL地址，使得URL地址的表达形式更规范，方便让第三方系统进行调用。原来的URL地址也同样可以使用。
#### 场景描述
对某个服务编排的URL进行包装，自定义为新的URL。
#### 操作步骤
1. 参考[登录经典应用设计器](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_5025.html)中操作，登录经典版应用设计器。
2. 在页面左下方，选择"服务"。 
   图1单击服务   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933045172.png)
   
   
3. 在公共接口中，单击"新建"。
4. 设置自定义接口参数。 
   图2新建自定义接口   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933045176.png "点击放大")
   表1新建自定义接口参数说明 
   | 参数        | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   |:---|:---|
   | 标签        | 新建接口的标签。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   | 操作名称      | 新建接口的操作名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | 版本        | URL对应的版本号。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | URL       | 新URL地址，其中"/service"为固定值，其次是"/*App* *名称*/版本号"，剩下部分进行自定义。 自定义的URL需要符合一定规则，规则如下： - 必须以单个"/"开头。  - 可以配置多级路径，两个或者多个"/"之间必须有内容。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
   | 内容类型      | 请求中的body类型。 - application/json  - multipart/form-data  - binary-data   "multipart/form-data"和"binary-data"用于文件上传接口，选择该内容类型，只能调用POST类型的脚本。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   | 分类        | 新建接口所属的分类。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | 描述        | 新建接口的描述信息，建议设置为API的作用。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   | 允许匿名访问    | 是否可匿名访问运行环境中，该API接口。 勾选表示允许匿名访问，通过运行环境子域名访问此接口时，如果无有效的Token认证信息，则以匿名用户身份继续访问此接口，且不需要做CSRF校验。匿名用户的权限为"Anonymous User Profile"，请确保该权限具备访问该接口的业务权限凭证或者相关资源权限。如当该接口有配置业务权限凭证时，给"Anonymous User Profile"权限添加相应业务权限凭证，即可通过运行环境子域名匿名访问该接口。 说明如下： - 需要支持匿名访问自定义接口的账号，必须要设置运行环境子域名。  - 带有合法认证信息来访问允许匿名访问的自定义接口时，优先以合法认证的身份权限来访问。  - 匿名用户身份访问自定义接口，不需要做CSRF校验。  - 不论以什么方式来访问， 认证身份后做的权限校验保持一致。如果配置了业务权限凭证，还会查看用户权限，是否配置了相应的业务权限凭证。   例如：登录业务应用接口"login"的URL为"/service/CNAME__MyApp/1.0.0/login"，运行环境子域名为"test.example.com"，期望可匿名访问该自定义接口，则配置接口时请勾选"允许匿名访问"，且"Anonymous User Profile"权限配置了该接口的业务权限凭证，则匿名用户通过"https://test.example.com/service/CNAME__MyApp/1.0.0/login"，即可访问该接口。 |
   | 类型        | 系统支持以下三种类型。 - 服务编排：表示该定义URL调用的接口类型是服务编排。  - 脚本：表示该定义URL调用的接口类型是脚本。  - 对象：表示该定义URL是操作对象数据，包括对象数据的增删改查。   本示例选择服务编排。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   | 自定义响应     | 是否需要格式化，调用该URL后返回的响应消息。如果勾选，表示对响应消息进行格式化，删除resCode、resMsg、result外层信息，只透传返回的消息。 例如，不勾选"自定义响应"，返回如下响应消息： ``` { "resCode": "0", "resMsg": "成功", "result": [ { "equipments": [ { "createdBy": "aaa", "createdBy.__objectType": "User" }, { "createdBy": "aaa", "createdBy.__objectType": "User" } ], "total": "2" } ] } ``` 勾选"自定义响应"后，只返回如下响应消息： ``` { "equipments": [ { "createdBy": "aaa", "createdBy.__objectType": "User" }, { "createdBy": "aaa", "createdBy.__objectType": "User" } ], "total": "2" } ```                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   | 资源        | 调用的服务编排、脚本或操作的对象名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   | 对象操作      | 请选择具体的操作。当"类型"选择为"对象"时，该参数才会显示。 - Insert Record：新增对象数据。  - Update or Insert Record：更新或者新增对象数据。  - Update By ID：按记录ID更新对象数据。  - Delete By ID：按记录ID删除对象数据。  - Query By ID：按记录ID查询对象数据。  - Update By Condition：按条件更新对象数据。  - Delete By Condition：按条件删除对象数据。  - Query By Condition：按条件查询对象数据。                                                                                                                                           |
   | 方法        | 映射后调用的方法名，如GET（查询）、PUT（增加）、POST（修改）和DELETE（删除）等。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   | 输入参数/输出参数 | 展示服务编排的入参、出参，同时支持修改未受保护资源的参数描述。由于开发人员在开发服务编排过程中，可能未设置或未精确添加参数的描述信息，导出自定义接口的yaml描述文档时对参数的描述就会缺失或模糊。在开放接口二次封装服务编排时，可对参数描述进行编辑补充。 当"类型"选择为"服务编排"时，该参数才会显示。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
      
   
   
5. 设置完成后，单击"保存"。 
   保存后，进入接口详情页。在接口详情页的"基本信息"区域，勾选"是否已废弃"后，可配置是否推荐使用该接口。若不推荐使用，勾选"是否已废弃"，勾选后，在后续使用到该接口时，会显示该接口"已废弃"的提示，但接口仍可被调用。
   
   
6. （可选）开发者配置自定义接口列表的访问权限。 
   ![](https://support.huaweicloud.com/usermanual-astrozero/public_sys-resources/note_3.0-zh-cn.png)
   当开发者需要自定义这些接口的访问权限时，需要执行该步骤。
   1. 参考[脚本开发](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_0044.html)中操作，开发权限脚本，新建脚本时选择"示例权限脚本"模板，在脚本中定义权限逻辑，开发完后并启用脚本。
      例如，"示例权限脚本"模板是开发者需要通过脚本实现根据用户标识查询第三方权限数据，脚本的设计逻辑流程如下。
      1. （可选）设置数据过滤，例如根据第三方系统用户名进行数据过滤。
      
      2. （根据过滤条件）向第三方获取权限数据。
      
      3. （可选）缓存权限数据。
      
      4. 根据当前API标识，检查是否有权限。
       
   
   2. 在自定义接口列表页面，即服务页面上方"自定义访问控制"区域单击"编辑"。
      图3单击编辑按钮   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960284325.png "点击放大") 
   
   3. 在配置页面，选中"与脚本绑定"， 选择"前置处理"脚本和"后置处理"脚本，单击"保存"。
      - 前置处理：一般是授权处理脚本，在访问自定义接口前，需要进行授权处理。
      
      - 后置处理：一般是敏感错误信息或统计日志处理脚本，后置脚本没有返回参数，无论执行成功或失败都不影响自定义接口的请求处理流程。
      
      
      图4绑定权限脚本   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960284313.png "点击放大") 
   
   4. 当开发者不需要使用该权限脚本时，可在页面单击"禁用"按钮。
   
   
   
   
7. （可选）设置访问该自定义接口的用户业务权限。 
   ![](https://support.huaweicloud.com/usermanual-astrozero/public_sys-resources/note_3.0-zh-cn.png)
   当需要配置该接口的用户访问时，需要执行该步骤。若已参照上一步设置了通过脚本控制接口访问权限，则该步骤设置不生效。
   若没有参照上一步通过脚本控制接口访问权限，也没有配置业务权限且内置系统参数"bingo.permission.customapi.check"值为"否"，则只有业务用户可访问该接口，平台用户不可访问。若没有参照上一步通过脚本控制接口访问权限，也没有配置业务权限且内置系统参数"bingo.permission.customapi.check"值为"是"，则业务用户和平台用户都不可访问。若已参照上一步设置了通过脚本控制接口访问权限，则业务权限配置不生效。若没有参照上一步通过脚本控制接口访问权限，而配置了业务权限，则只有拥有该业务权限的用户才可以访问该接口。
   例如，配置只有拥有业务权限"A"的用户，才可访问该接口。
   1. 参考[设置业务权限](https://support.huaweicloud.com/usermanual-astrozero/astrozero_06_0012.html)中操作，在经典版环境配置中选择"用户管理 \> 业务权限凭证"，创建业务权限"A"。
      图5创建业务权限"A"   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960124521.png "点击放大") 
   
   2. 选择"用户管理 \> 权限配置"，编辑权限，在"业务权限凭证"页签配置接入业务权限"A"。
      图6用户权限配置   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932885792.png "点击放大") 
   
   3. 返回经典版应用设计器，单击"服务"，在自定义访问控制接口列表中，单击操作名，进入自定义接口详情页面。
   
   4. 在业务权限凭证中，单击"编辑"，配置业务权限，将左侧业务权限"A"加入到右侧"已选择业务权限凭证列表"中，单击"保存"。
      图7配置业务权限   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932885772.png "点击放大")
      业务用户访问该接口URL前，请参考[如何开发服务编排](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_0601.html)中操作，创建如下服务编排，用于获取token值。其中，赋的值"PL"是一个公式变量，表达式为"PORTALUSERLOGIN("*pu1* ")"，"*pu1*"为业务用户名，配置该服务编排的出参为"token"。
      图8创建服务编排   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933045180.png "点击放大")
      执行服务编排后，在如下输出信息中，获取token值。
      ```
      {
        "interviewId": "002N000000RBLY9scgDY",
        "outputs": {
          "token": "XXXXXXXXXXXXXXXXXX"
        }
      }
      ```
      
    
   
   
8. （可选）创建完自定义接口后，可进行在线测试。 
   1. 在自定义接口列表页面，单击接口所在行的![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932885796.png)。
   
   2. 在弹出的页面中，单击URL后的![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960124509.png)。
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960284297.png "点击放大")
      
   
   3. 单击"测试一下"，如果有输入参数，输入参数后，单击"执行"。 成功响应，表示接口调用成功 。
      
   
   
   
   
 
