Files
fizz-gateway-node/docs/guide/aggregate/configuration.html
2020-11-09 10:11:25 +08:00

307 lines
61 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>服务编排配置 | Fizz Gateway</title>
<meta name="generator" content="VuePress 1.5.2">
<meta name="description" content="">
<link rel="preload" href="/fizz-gateway-community/assets/css/0.styles.233b9b7b.css" as="style"><link rel="preload" href="/fizz-gateway-community/assets/js/app.41e48030.js" as="script"><link rel="preload" href="/fizz-gateway-community/assets/js/2.5b001851.js" as="script"><link rel="preload" href="/fizz-gateway-community/assets/js/9.3d56fa0d.js" as="script"><link rel="prefetch" href="/fizz-gateway-community/assets/js/10.ddbb0d4d.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/11.93c9bc98.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/12.f815cfa2.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/13.e5742833.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/14.993243d3.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/15.c6e43d45.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/16.5d8d970e.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/17.31216161.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/18.1301a626.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/19.501fe444.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/20.94c02b34.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/21.ff5e068c.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/22.1f3d545e.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/23.e4fc3148.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/24.7e82030a.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/25.fc38ae5b.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/26.e097ebfd.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/27.06f8de31.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/28.9b7b0400.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/29.214a2702.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/3.a51774e3.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/30.0222f21c.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/4.7d5f245c.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/5.abc10683.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/6.b5dc0bcc.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/7.c27e364c.js"><link rel="prefetch" href="/fizz-gateway-community/assets/js/8.99888a6b.js">
<link rel="stylesheet" href="/fizz-gateway-community/assets/css/0.styles.233b9b7b.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/fizz-gateway-community/" class="home-link router-link-active"><!----> <span class="site-name">Fizz Gateway</span></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/fizz-gateway-community/" class="nav-link">
首页
</a></div><div class="nav-item"><a href="/fizz-gateway-community/guide/intro/" class="nav-link">
使用文档
</a></div> <a href="https://github.com/wehotel/fizz-gateway-community" target="_blank" rel="noopener noreferrer" class="repo-link">
查看源码
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/fizz-gateway-community/" class="nav-link">
首页
</a></div><div class="nav-item"><a href="/fizz-gateway-community/guide/intro/" class="nav-link">
使用文档
</a></div> <a href="https://github.com/wehotel/fizz-gateway-community" target="_blank" rel="noopener noreferrer" class="repo-link">
查看源码
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Fizz简介</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/fizz-gateway-community/guide/intro/" class="sidebar-link">什么是Fizz网关</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/intro/#什么是fizz网关" class="sidebar-link">什么是Fizz网关</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/intro/#fizz的设计" class="sidebar-link">Fizz的设计</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/intro/#产品特性" class="sidebar-link">产品特性</a></li></ul></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>安装部署</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/fizz-gateway-community/guide/installation/" class="sidebar-link">安装</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/installation/#安装依赖" class="sidebar-link">安装依赖</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/installation/#安装fizz" class="sidebar-link">安装Fizz</a></li></ul></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>路由转发</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/fizz-gateway-community/guide/proxy/" class="sidebar-link">路由转发</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/proxy/#路由转发介绍" class="sidebar-link">路由转发介绍</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/proxy/#接入路由转发" class="sidebar-link">接入路由转发</a></li></ul></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>服务编排</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/fizz-gateway-community/guide/aggregate/" aria-current="page" class="sidebar-link">服务编排介绍</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/aggregate/#什么是服务编排" class="sidebar-link">什么是服务编排</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/aggregate/#举例说明" class="sidebar-link">举例说明</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/aggregate/#服务编排架构" class="sidebar-link">服务编排架构</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/aggregate/#适用场景" class="sidebar-link">适用场景</a></li></ul></li><li><a href="/fizz-gateway-community/guide/aggregate/overview.html" class="sidebar-link">步骤总览</a></li><li><a href="/fizz-gateway-community/guide/aggregate/configuration.html" aria-current="page" class="active sidebar-link">服务编排配置</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/aggregate/configuration.html#创建服务" class="sidebar-link">创建服务</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/aggregate/configuration.html#创建聚合接口" class="sidebar-link">创建聚合接口</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/aggregate/configuration.html#配置输入" class="sidebar-link">配置输入</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/aggregate/configuration.html#配置校验结果" class="sidebar-link">配置校验结果</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/aggregate/configuration.html#配置步骤" class="sidebar-link">配置步骤</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/aggregate/configuration.html#配置输出" class="sidebar-link">配置输出</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/aggregate/configuration.html#脚本-2" class="sidebar-link">脚本</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/aggregate/configuration.html#异常处理" class="sidebar-link">异常处理</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/aggregate/configuration.html#配置路由" class="sidebar-link">配置路由</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/aggregate/configuration.html#在线测试" class="sidebar-link">在线测试</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/aggregate/configuration.html#导入导出" class="sidebar-link">导入导出</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/aggregate/configuration.html#发布-下线和审核" class="sidebar-link">发布|下线和审核</a></li></ul></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>插件机制</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/fizz-gateway-community/guide/plugin/" class="sidebar-link">插件开发</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/plugin/#概述" class="sidebar-link">概述</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/plugin/#gateway开发" class="sidebar-link">gateway开发</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/plugin/#manager配置" class="sidebar-link">manager配置</a></li></ul></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>基准测试</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/fizz-gateway-community/guide/benchmark/" class="sidebar-link">benchmark</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/benchmark/#基准测试结果" class="sidebar-link">基准测试结果</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/benchmark/#基准测试详情" class="sidebar-link">基准测试详情</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/benchmark/#硬件环境" class="sidebar-link">硬件环境</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/benchmark/#压测工具" class="sidebar-link">压测工具</a></li><li class="sidebar-sub-header"><a href="/fizz-gateway-community/guide/benchmark/#压测结果截图" class="sidebar-link">压测结果截图</a></li></ul></li></ul></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>管理后台</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/fizz-gateway-community/guide/manager/manager_overview.html" class="sidebar-link">管理后台简介</a></li><li><a href="/fizz-gateway-community/guide/manager/manager_gateway_group.html" class="sidebar-link">网关分组</a></li><li><a href="/fizz-gateway-community/guide/manager/manager_plugin.html" class="sidebar-link">插件管理</a></li><li><a href="/fizz-gateway-community/guide/manager/manager_app_id.html" class="sidebar-link">appID管理</a></li><li><a href="/fizz-gateway-community/guide/manager/manager_api_auth.html" class="sidebar-link">路由管理</a></li><li><a href="/fizz-gateway-community/guide/manager/manager_service.html" class="sidebar-link">服务管理</a></li><li><a href="/fizz-gateway-community/guide/manager/manager_aggregate.html" class="sidebar-link">接口列表</a></li><li><a href="/fizz-gateway-community/guide/manager/manager_aggregate_op_log.html" class="sidebar-link">操作日志</a></li><li><a href="/fizz-gateway-community/guide/manager/manager_gateway_aggregate_cache.html" class="sidebar-link">网关缓存</a></li><li><a href="/fizz-gateway-community/guide/manager/manager_aggregate_my_apply.html" class="sidebar-link">我的申请</a></li><li><a href="/fizz-gateway-community/guide/manager/manager_aggregate_approve.html" class="sidebar-link">待审核</a></li><li><a href="/fizz-gateway-community/guide/manager/manager_aggregate_approve_op_log.html" class="sidebar-link">审核日志</a></li><li><a href="/fizz-gateway-community/guide/manager/manager_role.html" class="sidebar-link">角色管理</a></li><li><a href="/fizz-gateway-community/guide/manager/manager_user.html" class="sidebar-link">用户管理</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h2 id="创建服务"><a href="#创建服务" class="header-anchor">#</a> 创建服务</h2> <p><img src="/fizz-gateway-community/aggr_newservice.png" alt=""></p> <h2 id="创建聚合接口"><a href="#创建聚合接口" class="header-anchor">#</a> 创建聚合接口</h2> <p><img src="/fizz-gateway-community/aggr_newapi0.png" alt=""> <img src="/fizz-gateway-community/aggr_newapi.png" alt=""></p> <h2 id="配置输入"><a href="#配置输入" class="header-anchor">#</a> 配置输入</h2> <p><img src="/fizz-gateway-community/aggr_config_input.png" alt=""></p> <ul><li>配置输入的定义包括3部分请求头、请求体和Query参数</li> <li>基于JSON Schema规范</li> <li>自带校验规则</li> <li>支持自定义脚本实现复杂的逻辑校验</li></ul> <p>JSON Schema规范详见</p> <p><a href="http://json-schema.org/specification.html" target="_blank" rel="noopener noreferrer">http://json-schema.org/specification.html<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></p> <p><a href="http://json-schema.org/understanding-json-schema/" target="_blank" rel="noopener noreferrer">http://json-schema.org/understanding-json-schema/<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></p> <h2 id="配置校验结果"><a href="#配置校验结果" class="header-anchor">#</a> 配置校验结果</h2> <p><img src="/fizz-gateway-community/aggr_config_input_validate_result.png" alt=""></p> <ul><li>校验不通过时Fizz会把校验失败的原因订单ID不能为空放到上下文的validateMsg字段里</li> <li>可以自定义返回给调用方的报文格式,如 msgCode, message</li> <li>支持自定义响应头</li> <li>支持自定义脚本处理校验结果</li></ul> <h2 id="配置步骤"><a href="#配置步骤" class="header-anchor">#</a> 配置步骤</h2> <h3 id="配置步骤的基础信息"><a href="#配置步骤的基础信息" class="header-anchor">#</a> 配置步骤的基础信息</h3> <p><img src="/fizz-gateway-community/aggr_config_step1.png" alt=""></p> <h3 id="配置步骤的接口入出参"><a href="#配置步骤的接口入出参" class="header-anchor">#</a> 配置步骤的接口入出参</h3> <p><img src="/fizz-gateway-community/aggr_config_step2.png" alt=""></p> <h3 id="步骤说明"><a href="#步骤说明" class="header-anchor">#</a> 步骤说明</h3> <ul><li>一个聚合接口可包含多个步骤</li> <li>一个步骤可包含多个请求(即调用多个接口)</li> <li>步骤间是串联顺序执行</li> <li>一个步骤内的多个请求并行执行</li></ul> <h3 id="数据转换"><a href="#数据转换" class="header-anchor">#</a> 数据转换</h3> <p>支持配置固定值,引用值和脚本</p> <h4 id="固定值"><a href="#固定值" class="header-anchor">#</a> 固定值</h4> <p><img src="/fizz-gateway-community/aggr_config_step_mapping_1.png" alt=""></p> <h4 id="引用值"><a href="#引用值" class="header-anchor">#</a> 引用值</h4> <p><img src="/fizz-gateway-community/aggr_config_step_mapping_2.png" alt=""></p> <h4 id="脚本"><a href="#脚本" class="header-anchor">#</a> 脚本</h4> <p><img src="/fizz-gateway-community/aggr_config_step_mapping_3.png" alt=""></p> <p><img src="/fizz-gateway-community/aggr_config_step_mapping_4.png" alt=""></p> <h4 id="星号"><a href="#星号" class="header-anchor">#</a> 星号 *</h4> <p>星号通配符可以接收一个返回对象类型的引用值,返回对象里的字段会合并到目标对象里</p> <p><img src="/fizz-gateway-community/aggr_config_step_mapping_5.png" alt=""></p> <p>样例userInfo = {&quot;userName&quot;: &quot;Fizz&quot;, &quot;userID&quot;: 1234}</p> <h4 id="优先级与覆盖顺序"><a href="#优先级与覆盖顺序" class="header-anchor">#</a> 优先级与覆盖顺序</h4> <p>固定值 &lt; 引用值 &lt; 脚本 &lt; 星号*</p> <p>当一个字段配置了多种类型的值时按以上顺序覆盖,星号优先级最高</p> <h4 id="引用值规范"><a href="#引用值规范" class="header-anchor">#</a> 引用值规范</h4> <div class="language-properties extra-class"><pre class="language-properties"><code><span class="token comment"># 获取入参请求头aaa的值</span>
input.request.headers.aaa
<span class="token comment"># 获取入参请求体bbb字段的值</span>
input.request.body.bbb
<span class="token comment"># 获取入参URL Query参数fff字段的值</span>
input.request.params.fff
<span class="token comment"># 获取步骤1里request1的请求头ccc的值</span>
step1.request1.request.headers.ccc
<span class="token comment"># 获取步骤1里request1的响应体ddd的值</span>
step1.request1.response.body.ddd
<span class="token comment"># 获取步骤1结果里eee的值</span>
step1.result.eee
</code></pre></div><ul><li>支持单值引用,如:stringint等</li> <li>支持对象类型的引用</li></ul> <p>input: 表示调用方的输入数据如H5页面提交上来的参数</p> <p>stepN.requestN: 表示步骤N里调用接口N的相关参数</p> <p>stepN.result: 表示步骤N的转换结果</p> <h4 id="fallback与预处理条件"><a href="#fallback与预处理条件" class="header-anchor">#</a> Fallback与预处理条件</h4> <p><img src="/fizz-gateway-community/aggr_config_step_fallback.png" alt=""></p> <p>Fallback:</p> <p>当调用接口发生异常如超时、网络或系统异常可配置fallback方案</p> <ul><li>Stop: 终止请求并立即返回</li> <li>Continue: 继续后续的操作且要设置默认的fallback json</li></ul> <p>预处理: 根据条件判断是否要调用接口脚本返回true时才调用接口</p> <h4 id="配置步骤结果处理"><a href="#配置步骤结果处理" class="header-anchor">#</a> 配置步骤结果处理</h4> <p><img src="/fizz-gateway-community/aggr_config_step_result.png" alt=""></p> <ul><li><p>支持对步骤里调用的每一个接口的返回结果做数据转换,如果配置数据转换规则原样返回并存储到上下文里供后续使用</p></li> <li><p>支持对步骤里调用的一个或多个接口的返回结果做处理,并把处理完的结果存储到上下文里供后续使用,不配置则不处理</p></li></ul> <h2 id="配置输出"><a href="#配置输出" class="header-anchor">#</a> 配置输出</h2> <p><img src="/fizz-gateway-community/aggr_config_output.png" alt=""></p> <p>配置返回给调用方的结果</p> <ul><li>支持配置响应头</li> <li>支持配置响应体</li> <li>支持自定脚本处理复杂的业务逻辑</li></ul> <h2 id="脚本-2"><a href="#脚本-2" class="header-anchor">#</a> 脚本</h2> <p>目前支持以下脚本语言:</p> <p>Javascript (推荐) - ECMAScript 5标准</p> <p>JS脚本只支持单函数且函数名不可变在创建脚本时系统会自动生成初始模板模板里包含相关使用说明</p> <p><img src="/fizz-gateway-community/aggr_config_script_1.png" alt=""></p> <p>Groovy</p> <p><img src="/fizz-gateway-community/aggr_config_script_2.png" alt=""></p> <h3 id="common-js-提供了操作context上下文的便捷操作函数"><a href="#common-js-提供了操作context上下文的便捷操作函数" class="header-anchor">#</a> common.js 提供了操作context上下文的便捷操作函数</h3> <div class="language-javascript extra-class"><pre class="language-javascript"><code><span class="token comment">/**
* context 上下文便捷操作函数
*
*/</span>
<span class="token keyword">var</span> common <span class="token operator">=</span> <span class="token punctuation">{</span>
<span class="token comment">/* *********** private function begin *********** */</span>
<span class="token comment">// 获取上下文中客户端请求对象</span>
<span class="token function-variable function">getInputReq</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">ctx</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>ctx <span class="token operator">||</span> <span class="token operator">!</span>ctx<span class="token punctuation">[</span><span class="token string">'input'</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token operator">!</span>ctx<span class="token punctuation">[</span><span class="token string">'input'</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'request'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> ctx<span class="token punctuation">[</span><span class="token string">'input'</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'request'</span><span class="token punctuation">]</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token comment">// 获取上下文步骤中请求接口的请求对象</span>
<span class="token function-variable function">getStepReq</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">ctx<span class="token punctuation">,</span> stepName<span class="token punctuation">,</span> requestName</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>ctx <span class="token operator">||</span> <span class="token operator">!</span>stepName <span class="token operator">||</span> <span class="token operator">!</span>requestName<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>ctx<span class="token punctuation">[</span>stepName<span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token operator">!</span>ctx<span class="token punctuation">[</span>stepName<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'requests'</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token operator">!</span>ctx<span class="token punctuation">[</span>stepName<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'requests'</span><span class="token punctuation">]</span><span class="token punctuation">[</span>requestName<span class="token punctuation">]</span> <span class="token operator">||</span>
<span class="token operator">!</span>ctx<span class="token punctuation">[</span>stepName<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'requests'</span><span class="token punctuation">]</span><span class="token punctuation">[</span>requestName<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'request'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> ctx<span class="token punctuation">[</span>stepName<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'requests'</span><span class="token punctuation">]</span><span class="token punctuation">[</span>requestName<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'request'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token comment">// 获取上下文步骤中请求接口的响应对象</span>
<span class="token function-variable function">getStepResp</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">ctx<span class="token punctuation">,</span> stepName<span class="token punctuation">,</span> requestName</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>ctx <span class="token operator">||</span> <span class="token operator">!</span>stepName <span class="token operator">||</span> <span class="token operator">!</span>requestName<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>ctx<span class="token punctuation">[</span>stepName<span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token operator">!</span>ctx<span class="token punctuation">[</span>stepName<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'requests'</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token operator">!</span>ctx<span class="token punctuation">[</span>stepName<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'requests'</span><span class="token punctuation">]</span><span class="token punctuation">[</span>requestName<span class="token punctuation">]</span> <span class="token operator">||</span>
<span class="token operator">!</span>ctx<span class="token punctuation">[</span>stepName<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'requests'</span><span class="token punctuation">]</span><span class="token punctuation">[</span>requestName<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'response'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> ctx<span class="token punctuation">[</span>stepName<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'requests'</span><span class="token punctuation">]</span><span class="token punctuation">[</span>requestName<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'response'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token comment">/* *********** private function end *********** */</span>
<span class="token comment">/* *********** input begin ************ */</span>
<span class="token comment">/**
* 获取客户端请求头
* @param {*} ctx 上下文 【必填】
* @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头
*/</span>
<span class="token function-variable function">getInputReqHeader</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">ctx<span class="token punctuation">,</span> headerName</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">var</span> req <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getInputReq</span><span class="token punctuation">(</span>ctx<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">var</span> headers <span class="token operator">=</span> req<span class="token punctuation">[</span><span class="token string">'headers'</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> headerName <span class="token operator">?</span> headers<span class="token punctuation">[</span>headerName<span class="token punctuation">]</span> <span class="token operator">:</span> headers<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token comment">/**
* 获取客户端URL请求参数query string
* @param {*} ctx 上下文 【必填】
* @param {*} paramName URL参数名 【选填】,不传时返回所有请求参数
*/</span>
<span class="token function-variable function">getInputReqParam</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">ctx<span class="token punctuation">,</span> paramName</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">var</span> req <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getInputReq</span><span class="token punctuation">(</span>ctx<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">var</span> params <span class="token operator">=</span> req<span class="token punctuation">[</span><span class="token string">'params'</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> paramName <span class="token operator">?</span> params<span class="token punctuation">[</span>paramName<span class="token punctuation">]</span> <span class="token operator">:</span> params<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token comment">/**
* 获取客户端请求体
* @param {*} ctx 上下文 【必填】
* @param {*} field 字段名 【选填】,不传时返回整个请求体
*/</span>
<span class="token function-variable function">getInputReqBody</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">ctx<span class="token punctuation">,</span> field</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">var</span> req <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getInputReq</span><span class="token punctuation">(</span>ctx<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">var</span> body <span class="token operator">=</span> req<span class="token punctuation">[</span><span class="token string">'body'</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> field <span class="token operator">?</span> body<span class="token punctuation">[</span>field<span class="token punctuation">]</span> <span class="token operator">:</span> body<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token comment">/**
* 获取返回给客户端的响应头
* @param {*} ctx 上下文 【必填】
* @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头
*/</span>
<span class="token function-variable function">getInputRespHeader</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">ctx<span class="token punctuation">,</span> headerName</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">var</span> req <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getInputReq</span><span class="token punctuation">(</span>ctx<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">var</span> headers <span class="token operator">=</span> req<span class="token punctuation">[</span><span class="token string">'headers'</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> headerName <span class="token operator">?</span> headers<span class="token punctuation">[</span>headerName<span class="token punctuation">]</span> <span class="token operator">:</span> headers<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token comment">/**
* 获取返回给客户端的响应体
* @param {*} ctx 上下文 【必填】
* @param {*} field 字段名 【选填】,不传时返回整个响应体
*/</span>
<span class="token function-variable function">getInputRespBody</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">ctx<span class="token punctuation">,</span> field</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">var</span> req <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getInputReq</span><span class="token punctuation">(</span>ctx<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">var</span> body <span class="token operator">=</span> req<span class="token punctuation">[</span><span class="token string">'body'</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> field <span class="token operator">?</span> body<span class="token punctuation">[</span>field<span class="token punctuation">]</span> <span class="token operator">:</span> body<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token comment">/* *********** input begin ************ */</span>
<span class="token comment">/* *********** step request begin ************ */</span>
<span class="token comment">/**
* 获取步骤中调用的接口的请求头
* @param {*} ctx 上下文 【必填】
* @param {*} stepName 步骤名【必填】
* @param {*} requestName 请求的接口名 【必填】
* @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头
*/</span>
<span class="token function-variable function">getStepReqHeader</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">ctx<span class="token punctuation">,</span> stepName<span class="token punctuation">,</span> requestName<span class="token punctuation">,</span> headerName</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">var</span> req <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getStepReq</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> stepName<span class="token punctuation">,</span> requestName<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">var</span> headers <span class="token operator">=</span> req<span class="token punctuation">[</span><span class="token string">'headers'</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> headerName <span class="token operator">?</span> headers<span class="token punctuation">[</span>headerName<span class="token punctuation">]</span> <span class="token operator">:</span> headers<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token comment">/**
* 获取步骤中调用的接口的URL参数
* @param {*} ctx 上下文 【必填】
* @param {*} stepName 步骤名【必填】
* @param {*} requestName 请求的接口名 【必填】
* @param {*} paramName URL参数名 【选填】不传时返回所有URL参数
*/</span>
<span class="token function-variable function">getStepReqParam</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">ctx<span class="token punctuation">,</span> stepName<span class="token punctuation">,</span> requestName<span class="token punctuation">,</span> paramName</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">var</span> req <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getStepReq</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> stepName<span class="token punctuation">,</span> requestName<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">var</span> params <span class="token operator">=</span> req<span class="token punctuation">[</span><span class="token string">'params'</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> paramName <span class="token operator">?</span> params<span class="token punctuation">[</span>paramName<span class="token punctuation">]</span> <span class="token operator">:</span> params<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token comment">/**
* 获取步骤中调用的接口的请求体
* @param {*} ctx 上下文 【必填】
* @param {*} stepName 步骤名【必填】
* @param {*} requestName 请求的接口名 【必填】
* @param {*} field 字段名 【选填】,不传时返回整个请求体
*/</span>
<span class="token function-variable function">getStepReqBody</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">ctx<span class="token punctuation">,</span> stepName<span class="token punctuation">,</span> requestName<span class="token punctuation">,</span> field</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">var</span> req <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getStepReq</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> stepName<span class="token punctuation">,</span> requestName<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">var</span> body <span class="token operator">=</span> req<span class="token punctuation">[</span><span class="token string">'body'</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> field <span class="token operator">?</span> body<span class="token punctuation">[</span>field<span class="token punctuation">]</span> <span class="token operator">:</span> body<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token comment">/**
* 获取步骤中调用的接口的响应头
* @param {*} ctx 上下文 【必填】
* @param {*} stepName 步骤名【必填】
* @param {*} requestName 请求的接口名 【必填】
* @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头
*/</span>
<span class="token function-variable function">getStepRespHeader</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">ctx<span class="token punctuation">,</span> stepName<span class="token punctuation">,</span> requestName<span class="token punctuation">,</span> headerName</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">var</span> resp <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getStepResp</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> stepName<span class="token punctuation">,</span> requestName<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">var</span> headers <span class="token operator">=</span> resp<span class="token punctuation">[</span><span class="token string">'headers'</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> headerName <span class="token operator">?</span> headers<span class="token punctuation">[</span>headerName<span class="token punctuation">]</span> <span class="token operator">:</span> headers<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token comment">/**
* 获取步骤中调用的接口的响应头
* @param {*} ctx 上下文 【必填】
* @param {*} stepName 步骤名【必填】
* @param {*} requestName 请求的接口名 【必填】
* @param {*} field 字段名 【选填】,不传时返回整个响应头
*/</span>
<span class="token function-variable function">getStepRespBody</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">ctx<span class="token punctuation">,</span> stepName<span class="token punctuation">,</span> requestName<span class="token punctuation">,</span> field</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">var</span> resp <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getStepResp</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> stepName<span class="token punctuation">,</span> requestName<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">var</span> body <span class="token operator">=</span> resp<span class="token punctuation">[</span><span class="token string">'body'</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> field <span class="token operator">?</span> body<span class="token punctuation">[</span>field<span class="token punctuation">]</span> <span class="token operator">:</span> body<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token comment">/**
* 获取步骤结果
* @param {*} ctx 上下文 【必填】
* @param {*} stepName 步骤名【必填】
* @param {*} field 字段名 【选填】,不传时返回整个步骤结果对象
*/</span>
<span class="token function-variable function">getStepResult</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">ctx<span class="token punctuation">,</span> stepName<span class="token punctuation">,</span> field</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>ctx <span class="token operator">||</span> <span class="token operator">!</span>stepName <span class="token operator">||</span> <span class="token operator">!</span>ctx<span class="token punctuation">[</span>stepName<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">var</span> result <span class="token operator">=</span> ctx<span class="token punctuation">[</span>stepName<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'result'</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> field <span class="token operator">?</span> result<span class="token punctuation">[</span>field<span class="token punctuation">]</span> <span class="token operator">:</span> result<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">/* *********** step request end ************ */</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
</code></pre></div><h3 id="context-js-数据结构"><a href="#context-js-数据结构" class="header-anchor">#</a> context.js 数据结构</h3> <div class="language-javascript extra-class"><pre class="language-javascript"><code>
<span class="token comment">// 上下文,用于保存客户输入输出和每个步骤的输入与输出结果</span>
<span class="token keyword">var</span> context <span class="token operator">=</span> <span class="token punctuation">{</span>
<span class="token comment">// 是否DEBUG模式</span>
debug<span class="token operator">:</span><span class="token boolean">false</span><span class="token punctuation">,</span>
<span class="token comment">// 各个操作的耗时</span>
elapsedTimes<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">{</span>
<span class="token punctuation">[</span>actionName<span class="token punctuation">]</span><span class="token operator">:</span> <span class="token number">123</span><span class="token punctuation">,</span> <span class="token comment">// 操作名称:耗时</span>
<span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token comment">// 客户输入和接口的返回结果</span>
input<span class="token operator">:</span> <span class="token punctuation">{</span>
request<span class="token operator">:</span><span class="token punctuation">{</span>
path<span class="token operator">:</span> <span class="token string">&quot;&quot;</span><span class="token punctuation">,</span>
method<span class="token operator">:</span> <span class="token string">&quot;GET/POST&quot;</span><span class="token punctuation">,</span>
headers<span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span>
body<span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span>
params<span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
response<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token comment">// 聚合接口的响应</span>
headers<span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span>
body<span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token comment">// 步骤</span>
step1<span class="token operator">:</span> <span class="token punctuation">{</span>
requests<span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token comment">// 接口1</span>
request1<span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token comment">// 请求相关参数</span>
request<span class="token operator">:</span><span class="token punctuation">{</span>
url<span class="token operator">:</span> <span class="token string">&quot;&quot;</span><span class="token punctuation">,</span>
method<span class="token operator">:</span> <span class="token string">&quot;GET/POST&quot;</span><span class="token punctuation">,</span>
headers<span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span>
body<span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token comment">// 根据转换规则转换后的接口响应</span>
response<span class="token operator">:</span> <span class="token punctuation">{</span>
headers<span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span>
body<span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token comment">// 接口2</span>
request2<span class="token operator">:</span> <span class="token punctuation">{</span>
request<span class="token operator">:</span><span class="token punctuation">{</span>
url<span class="token operator">:</span> <span class="token string">&quot;&quot;</span><span class="token punctuation">,</span>
method<span class="token operator">:</span> <span class="token string">&quot;GET/POST&quot;</span><span class="token punctuation">,</span>
headers<span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span>
body<span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
response<span class="token operator">:</span> <span class="token punctuation">{</span>
headers<span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span>
body<span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">//...</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token comment">// 步骤结果</span>
result<span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="异常处理"><a href="#异常处理" class="header-anchor">#</a> 异常处理</h2> <p>当要在脚本里中止请求时可以通过以下方式来实现</p> <p><img src="/fizz-gateway-community/aggr_config_exception.png" alt=""></p> <p>返回一个对象且这个对象包含一个_stopAndResponse等于true的属性Fizz会终止后续的操作并把这个对象返回给调用方。</p> <h2 id="配置路由"><a href="#配置路由" class="header-anchor">#</a> 配置路由</h2> <p>至此服务编排的接口配置完成,但此时还不能通过网关访问接口,需要到网关管理-路由管理里配置路由</p> <p><img src="/fizz-gateway-community/aggr_config_route.png" alt=""></p> <h2 id="在线测试"><a href="#在线测试" class="header-anchor">#</a> 在线测试</h2> <p><img src="/fizz-gateway-community/aggr_config_test.png" alt=""></p> <ul><li>支持在线实时测试</li> <li>支持测试接口和正式接口隔离</li> <li>支持返回上下文,可以查看整个执行过程中各个步骤及请求的输入与输出</li> <li>支持保存历史测试记录</li></ul> <p><img src="/fizz-gateway-community/aggr_config_test2.png" alt=""></p> <p>支持调试模式,在测试接口和正式接口均可使用,修改后重新发布可实时生效,在调试模式下会打印请求日志及报文,主要用于排查线上问题</p> <h2 id="导入导出"><a href="#导入导出" class="header-anchor">#</a> 导入导出</h2> <p><img src="/fizz-gateway-community/aggr_config_import_export.png" alt=""></p> <p>导入导出主要用于在各个环境间同步接口配置,在开发环境配置好后导到测试环境中测试,测试完后导到生产环境进行发布</p> <h2 id="发布-下线和审核"><a href="#发布-下线和审核" class="header-anchor">#</a> 发布|下线和审核</h2> <p><img src="/fizz-gateway-community/aggr_release_1.png" alt=""></p> <p><img src="/fizz-gateway-community/aggr_release_2.png" alt=""></p> <p>目前发布|下线申请有以上两个入口。</p> <p><img src="/fizz-gateway-community/aggr_release_rollback1.png" alt=""></p> <p><img src="/fizz-gateway-community/aggr_release_rollback.png" alt=""></p> <ul><li>批量发布:对发布单里的接口进行批量发布</li> <li>批量回滚:对发布单里的接口进行批量回滚</li> <li>发布:实时发布到网关</li> <li>回滚:支持回滚到历史任何一个版本,可在发布历史里指定一个版本进行回滚</li> <li>下线:从网关删除接口,在后台可以通过发布功能再次上线</li></ul> <h3 id="发布流程说明"><a href="#发布流程说明" class="header-anchor">#</a> 发布流程说明</h3> <p>申请发布、审核、发布和下线功能的权限可根据需要灵活分配给不同角色,如:开发人员只能申请发布,上级领导审核,运维或测试人员执行发布、回滚或下线。在开发、测试和预生产环境为了方便开发人员调试也可把申请发布、审核、发布和下线功能都分配给开发人员。</p></div> <footer class="page-edit"><!----> <div class="last-updated"><span class="prefix">上次更新:</span> <span class="time">2020-11-9 9:59</span></div></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/fizz-gateway-community/guide/aggregate/overview.html" class="prev">
步骤总览
</a></span> <span class="next"><a href="/fizz-gateway-community/guide/plugin/">
插件开发
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/fizz-gateway-community/assets/js/app.41e48030.js" defer></script><script src="/fizz-gateway-community/assets/js/2.5b001851.js" defer></script><script src="/fizz-gateway-community/assets/js/9.3d56fa0d.js" defer></script>
</body>
</html>