From 81a5ef3b2f733e2250968e57d65ca00d35d30cca Mon Sep 17 00:00:00 2001 From: Francis Dong Date: Mon, 21 Sep 2020 13:16:41 +0800 Subject: [PATCH] chore: update installation doc --- README.md | 49 ++------ docs/404.html | 6 +- .../js/{10.a7455592.js => 10.ced29be6.js} | 2 +- docs/assets/js/12.20bc746a.js | 1 + .../js/{12.503f3a3d.js => 13.ce1fb161.js} | 2 +- .../js/{13.dbdfec6f.js => 14.a144da4f.js} | 2 +- .../js/{14.910519b5.js => 15.ae9aceb7.js} | 2 +- .../js/{3.804d668d.js => 3.c15b449a.js} | 2 +- .../js/{5.67cd28cb.js => 5.abc10683.js} | 2 +- .../js/{6.af9d3ed2.js => 6.e883523c.js} | 2 +- .../js/{7.4fed6011.js => 7.00dd2642.js} | 2 +- .../js/{8.2ee1850f.js => 8.99888a6b.js} | 2 +- .../js/{9.5f299cef.js => 9.fd57a582.js} | 2 +- .../js/{app.ff845667.js => app.f432ac8d.js} | 4 +- docs/guide/admin/index.html | 6 +- docs/guide/aggregate/configuration.html | 8 +- docs/guide/aggregate/index.html | 6 +- docs/guide/aggregate/overview.html | 6 +- docs/guide/benchmark/index.html | 8 +- docs/guide/index.html | 6 +- docs/guide/installation/index.html | 106 ++++++++++++++++++ docs/guide/intro/index.html | 8 +- docs/guide/plugin/index.html | 8 +- docs/guide/proxy/index.html | 10 +- docs/index.html | 4 +- 25 files changed, 166 insertions(+), 90 deletions(-) rename docs/assets/js/{10.a7455592.js => 10.ced29be6.js} (93%) create mode 100644 docs/assets/js/12.20bc746a.js rename docs/assets/js/{12.503f3a3d.js => 13.ce1fb161.js} (97%) rename docs/assets/js/{13.dbdfec6f.js => 14.a144da4f.js} (99%) rename docs/assets/js/{14.910519b5.js => 15.ae9aceb7.js} (95%) rename docs/assets/js/{3.804d668d.js => 3.c15b449a.js} (87%) rename docs/assets/js/{5.67cd28cb.js => 5.abc10683.js} (79%) rename docs/assets/js/{6.af9d3ed2.js => 6.e883523c.js} (79%) rename docs/assets/js/{7.4fed6011.js => 7.00dd2642.js} (81%) rename docs/assets/js/{8.2ee1850f.js => 8.99888a6b.js} (97%) rename docs/assets/js/{9.5f299cef.js => 9.fd57a582.js} (99%) rename docs/assets/js/{app.ff845667.js => app.f432ac8d.js} (79%) create mode 100644 docs/guide/installation/index.html diff --git a/README.md b/README.md index cd09e79..5eae6b7 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ A Managerment API Gateway in Java . Fizz Gateway 是一个基于 Java开发的 ### Fizz的设计 -![](https://github.com/wehotel/fizz-gateway-community/blob/master/docs/fizz_design.png) + ### 产品特性 @@ -20,45 +20,6 @@ A Managerment API Gateway in Java . Fizz Gateway 是一个基于 Java开发的 - 版本控制:支持操作的发布和多次回滚。 - 管理后台:通过管理后台界面对网关集群进行各项配置。 -### 部署说明 - -#### 安装依赖的软件 - -安装以下依赖软件: - -- Redis 2.8或以上版本 -- MySQL 5.7或以上版本 -- Apollo配置中心 (可选) -- Eureka服务注册中心 - -#### 安装Fizz - -1. 管理后台 - -从release目录下载 fizz-manager-professional 和 fizz-admin-professional 的安装包,根据包里的readme进行安装。 - -2. fizz-gateway-community社区版 - -说明:如果使用apollo配置中心,可把application.yml文件内容迁到配置中心(apollo上应用名为:fizz-gateway);使用不使用apollo可去掉下面启动命令里的apollo参数。 - -脚本启动: - -1. 下载fizz-gateway-community的最新代码,使用maven构建好并把构建好的fizz-gateway-community-1.0.0.jar和boot.sh放同一目录 -2. 修改boot.sh脚本的apollo连接,JVM内存配置 -3. 执行 `./boot.sh start` 命令启动服务,支持 start/stop/restart/status命令 - -IDE启动: - -1. 本地clone仓库上的最新代码 -2. 将项目fizz-gateway导入IDE -3. 导入完成后设置项目启动配置,在VM选项中加入`-Denv=dev -Dapollo.meta=http://localhost:66`(Apollo配置中心地址) - -jar启动: - -1. 本地clone仓库上的最新代码 -2. 在项目根目录fizz-gateway-community下执行Maven命令`mvn clean package -DskipTests=true`打包 -3. 进入target目录,使用命令`java -jar -Denv=DEV -Dapollo.meta=http://localhost:66 fizz-gateway-community-1.0.0.jar`启动服务 - ### 基准测试 我们将Fizz与Spring官方spring-cloud-gateway进行比较,使用相同的环境和条件,测试对象均为单个节点。 @@ -76,6 +37,14 @@ jar启动: + +### 部署说明 + +[部署教程](https://wehotel.github.io/fizz-gateway-community/guide/installation/) + + + + ### 授权说明 1. 网关核心项目fizz-gateway-community社区版本以GNU v3的方式进行的开放,可以免费使用。 diff --git a/docs/404.html b/docs/404.html index e0dfcef..17a3e2c 100644 --- a/docs/404.html +++ b/docs/404.html @@ -7,13 +7,13 @@ - + -

404

How did we get here?
+ - + diff --git a/docs/assets/js/10.a7455592.js b/docs/assets/js/10.ced29be6.js similarity index 93% rename from docs/assets/js/10.a7455592.js rename to docs/assets/js/10.ced29be6.js index 33a02f1..cda32a4 100644 --- a/docs/assets/js/10.a7455592.js +++ b/docs/assets/js/10.ced29be6.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{353:function(t,e,v){"use strict";v.r(e);var n=v(42),r=Object(n.a)({},(function(){var t=this,e=t.$createElement,v=t._self._c||e;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("p",[t._v("1.创建服务")]),t._v(" "),v("p",[t._v("此服务是一个分组的概念,可以包含多个聚合接口,类似于微服务体系里的服务")]),t._v(" "),v("p",[t._v("2.创建服务编排接口")]),t._v(" "),v("p",[t._v("3.开通网关白名单和配置访问策略和插件")]),t._v(" "),v("p",[t._v("4.测试服务编排接口")]),t._v(" "),v("p",[t._v("5.发布接口")]),t._v(" "),v("p",[t._v("界面总览")]),t._v(" "),v("p",[v("img",{attrs:{src:"/fizz-gateway-community/aggr_overview1.png",alt:""}})]),t._v(" "),v("p",[v("img",{attrs:{src:"/fizz-gateway-community/aggr_overview2.png",alt:""}})])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{358:function(t,e,v){"use strict";v.r(e);var n=v(42),r=Object(n.a)({},(function(){var t=this,e=t.$createElement,v=t._self._c||e;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("p",[t._v("1.创建服务")]),t._v(" "),v("p",[t._v("此服务是一个分组的概念,可以包含多个聚合接口,类似于微服务体系里的服务")]),t._v(" "),v("p",[t._v("2.创建服务编排接口")]),t._v(" "),v("p",[t._v("3.开通网关白名单和配置访问策略和插件")]),t._v(" "),v("p",[t._v("4.测试服务编排接口")]),t._v(" "),v("p",[t._v("5.发布接口")]),t._v(" "),v("p",[t._v("界面总览")]),t._v(" "),v("p",[v("img",{attrs:{src:"/fizz-gateway-community/aggr_overview1.png",alt:""}})]),t._v(" "),v("p",[v("img",{attrs:{src:"/fizz-gateway-community/aggr_overview2.png",alt:""}})])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/12.20bc746a.js b/docs/assets/js/12.20bc746a.js new file mode 100644 index 0000000..db16365 --- /dev/null +++ b/docs/assets/js/12.20bc746a.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{357:function(a,t,s){"use strict";s.r(t);var e=s(42),r=Object(e.a)({},(function(){var a=this,t=a.$createElement,s=a._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h2",{attrs:{id:"安装依赖"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装依赖"}},[a._v("#")]),a._v(" 安装依赖")]),a._v(" "),s("p",[a._v("安装以下依赖软件:")]),a._v(" "),s("ul",[s("li",[a._v("Redis 2.8或以上版本")]),a._v(" "),s("li",[a._v("MySQL 5.7或以上版本")]),a._v(" "),s("li",[a._v("Apollo配置中心 (可选)")]),a._v(" "),s("li",[a._v("Eureka服务注册中心")])]),a._v(" "),s("h3",{attrs:{id:"安装mysql"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装mysql"}},[a._v("#")]),a._v(" 安装MySQL")]),a._v(" "),s("ul",[s("li",[a._v("操作系统 CentOS 6.5")]),a._v(" "),s("li",[a._v("MySQL 5.7.30")])]),a._v(" "),s("ol",[s("li",[a._v("下载MySQL")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[a._v("解压")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("tar")]),a._v(" -xvf mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar\n")])])]),s("ol",{attrs:{start:"3"}},[s("li",[a._v("安装")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" yum "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" mysql-community-"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("server,client,common,libs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("-*\n")])])]),s("ol",{attrs:{start:"4"}},[s("li",[a._v("启动")])]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("service")]),a._v(" mysqld start\n")])])]),s("p",[a._v("启动成功会显示以下信息:")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("[root@localhost ~]# sudo service mysqld start\nInitializing MySQL database: [ OK ]\nStarting mysqld: [ OK ]\n")])])]),s("ol",{attrs:{start:"5"}},[s("li",[a._v("初始密码")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("sudo grep 'temporary password' /var/log/mysqld.log\n")])])]),s("ol",{attrs:{start:"6"}},[s("li",[a._v("使用初始密码登录")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("mysql -uroot -p\n")])])]),s("ol",{attrs:{start:"7"}},[s("li",[a._v("修改密码")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';\n")])])]),s("ol",{attrs:{start:"8"}},[s("li",[a._v("退出登录")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("quit\n")])])]),s("h3",{attrs:{id:"安装redis-6-0-8"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装redis-6-0-8"}},[a._v("#")]),a._v(" 安装Redis 6.0.8")]),a._v(" "),s("ol",[s("li",[a._v("下载解压并编译")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("$ wget http://download.redis.io/releases/redis-6.0.8.tar.gz\n$ tar xzf redis-6.0.8.tar.gz\n$ cd redis-6.0.8\n$ make\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[a._v("启动redis")])]),a._v(" "),s("p",[a._v("运行编译后的文件:")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("$ src/redis-server\n")])])]),s("ol",{attrs:{start:"3"}},[s("li",[a._v("客户端连接")])]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v('$ src/redis-cli\nredis> set foo bar\nOK\nredis> get foo\n"bar"\n')])])]),s("h3",{attrs:{id:"安装apollo配置中心"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装apollo配置中心"}},[a._v("#")]),a._v(" 安装Apollo配置中心")]),a._v(" "),s("p",[a._v("说明: apollo是可选组件,如果不使用apollo可使用本地配置文件。")]),a._v(" "),s("p",[a._v("安装步骤详见apollo官方文档: "),s("a",{attrs:{href:"https://github.com/ctripcorp/apollo/wiki/Quick-Start",target:"_blank",rel:"noopener noreferrer"}},[s("OutboundLink")],1)]),a._v(" "),s("h3",{attrs:{id:"安装eureka服务注册中心"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装eureka服务注册中心"}},[a._v("#")]),a._v(" 安装Eureka服务注册中心")]),a._v(" "),s("p",[a._v("环境要求:")]),a._v(" "),s("ul",[s("li",[a._v("JDK 1.8 或以上版本")]),a._v(" "),s("li",[a._v("Tomcat 6.0.10 或以上版本 (如使用spring cloud已内置)")])]),a._v(" "),s("ol",[s("li",[a._v("安装JDK 1.8")])]),a._v(" "),s("p",[a._v("1)下载JDK,如: jdk-8u192-linux-x64.tar.gz")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("tar -zxvf jdk-8u192-linux-x64.tar.gz\nmv jdk1.8.0_192 /usr/local/\n\n")])])]),s("p",[a._v("2)设置JDK环境变量,将下面内容追回到/etc/profile文件后面")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("JAVA_HOME=/usr/local/jdk/jdk1.8.0_192\nJRE_HOME=$JAVA_HOME/jre\nPATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin\nCLASSPATH=:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/dt.jar\nexport JAVA_HOME JRE_HOME PATH CLASSPATH\n\n")])])]),s("p",[a._v("3)执行以下命令全环境变量生效:")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("source /etc/profile\n\n")])])]),s("p",[a._v("4)查看是否安装成功")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("java -version\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[a._v("安装eureka")])]),a._v(" "),s("p",[a._v("1)使用IDE创建一个spring boot项目,如:sc-eureka-server")]),a._v(" "),s("p",[a._v("pom.xml:")]),a._v(" "),s("div",{staticClass:"language-xml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-xml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("<")]),a._v("dependency")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(">")])]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("<")]),a._v("groupId")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(">")])]),a._v("org.springframework.cloud"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("")])]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("<")]),a._v("artifactId")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(">")])]),a._v("spring-cloud-starter-netflix-eureka-server"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("")])]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("")])]),a._v("\n")])])]),s("p",[a._v("在启动类上添加@EnableEurekaServer注解来启用Euerka注册中心功能:")]),a._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[a._v("@SpringBootApplication")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[a._v("@EnableEurekaServer")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("public")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("class")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("ScEurekaServerApplication")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n\n\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("public")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("static")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("void")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("SpringApplication")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("run")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[a._v("ScEurekaServerApplication")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("class")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("application.properties配置文件:")]),a._v(" "),s("div",{staticClass:"language-properties extra-class"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("spring.application.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("sc-eureka-server")]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("server.port")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("8761")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.instance.hostname")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("localhost")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.client.registerWithEureka")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("false")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.client.fetchRegistry")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("false")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.server.enableSelfPreservation")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("false")]),a._v("\n")])])]),s("p",[a._v("2) maven构建并运行sc-eureka-server应用, 启动后访问地址http://localhost:8761/可以看到Eureka注册中心的界面")]),a._v(" "),s("p",[a._v("3)把target/sc-eureka-server-1.0.0.jar传到linux服务器上运行. (仅以单机部署为例)")]),a._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[a._v("nohub java -jar sc-eureka-server-1.0.0.jar "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&")]),a._v(" \n")])])]),s("p",[a._v("4)eureka客户端的注册地址为:http://localhost:8761/eureka/ (替换localhost为服务器的IP)")]),a._v(" "),s("div",{staticClass:"language-properties extra-class"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token attr-name"}},[a._v("eureka.client.serviceUrl.defaultZone")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token attr-value"}},[a._v("http://localhost:8761/eureka/")]),a._v("\n")])])]),s("h2",{attrs:{id:"安装fizz"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装fizz"}},[a._v("#")]),a._v(" 安装Fizz")]),a._v(" "),s("h3",{attrs:{id:"管理后台"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#管理后台"}},[a._v("#")]),a._v(" 管理后台")]),a._v(" "),s("p",[a._v("从github的releases(https://github.com/wehotel/fizz-gateway-community/releases)下载 fizz-manager-professional 和 fizz-admin-professional 的安装包")]),a._v(" "),s("ul",[s("li",[a._v("管理后台服务端(fizz-manager-professional)")])]),a._v(" "),s("ol",[s("li",[a._v("首次安装执行"),s("code",[a._v("fizz-manager-professional-1.0.0-mysql.sql")]),a._v("数据库脚本")]),a._v(" "),s("li",[a._v("将"),s("code",[a._v("application-prod.yml")]),a._v("、"),s("code",[a._v("boot.sh")]),a._v("、"),s("code",[a._v("fizz-manager-professional-1.0.0.jar")]),a._v("拷贝到"),s("code",[a._v("/data/webapps/fizz-manager-professional")]),a._v("目录下")]),a._v(" "),s("li",[a._v("修改"),s("code",[a._v("application-prod.yml")]),a._v("文件,将相关配置修改成部署环境的配置")]),a._v(" "),s("li",[a._v("修改"),s("code",[a._v("boot.sh")]),a._v("文件,将"),s("code",[a._v("RUN_CMD")]),a._v("变量值修改成部署环境的JAVA实际路径")]),a._v(" "),s("li",[a._v("执行 "),s("code",[a._v("chmod +x boot.sh")]),a._v(" 命令给"),s("code",[a._v("boot.sh")]),a._v("增加执行权限")]),a._v(" "),s("li",[a._v("执行 "),s("code",[a._v("./boot.sh start")]),a._v(" 命令启动服务,支持 start/stop/restart/status命令")]),a._v(" "),s("li",[a._v("服务启动后访问 http://IP:8000/fizz-manager (将IP替换成服务部署机器IP地址),使用超级管理员账户"),s("code",[a._v("admin")]),a._v("密码"),s("code",[a._v("Aa123!")]),a._v("登录")])]),a._v(" "),s("ul",[s("li",[a._v("管理后台前端(fizz-admin-professional)")])]),a._v(" "),s("p",[a._v("zip资源包解压后,取文件夹【fizzAdmin】放置于服务器静态数据存放目录 如:/home/data/")]),a._v(" "),s("p",[a._v("nginx配置")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("server {\n listen 9000;\n server_name localhost:9000;\n location / {\n root /home/data/fizzAdmin;\n }\n location ^~ /api {\n rewrite ^/api/(.*) /$1 break;\n proxy_pass http://127.0.0.1:8000;\n }\n}\n\n# 注:root中地址需与资源包存放目录路径一致\n# 注:http://127.0.0.1:8000 为管理后台(fizz-manager-professional)的访问地址\n")])])]),s("p",[a._v("访问地址")]),a._v(" "),s("p",[a._v("【资源部署服务器IP + 端口号】如:http://127.0.0.1:9000/")]),a._v(" "),s("p",[a._v("(端口号与nginx配置端口号一致)")]),a._v(" "),s("h3",{attrs:{id:"fizz-gateway-community社区版"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#fizz-gateway-community社区版"}},[a._v("#")]),a._v(" fizz-gateway-community社区版")]),a._v(" "),s("p",[a._v("说明:如果使用apollo配置中心,可把application.yml文件内容迁到配置中心(apollo上应用名为:fizz-gateway);使用不使用apollo可去掉下面启动命令里的apollo参数。")]),a._v(" "),s("p",[a._v("脚本启动:")]),a._v(" "),s("ol",[s("li",[a._v("下载fizz-gateway-community的最新代码,修改application.yml配置文件里eureka、redis的配置,使用maven构建好并把构建好的fizz-gateway-community-1.0.0.jar和boot.sh放同一目录")]),a._v(" "),s("li",[a._v("修改boot.sh脚本的apollo连接,JVM内存配置,")]),a._v(" "),s("li",[a._v("执行 "),s("code",[a._v("./boot.sh start")]),a._v(" 命令启动服务,支持 start/stop/restart/status命令")])]),a._v(" "),s("p",[a._v("IDE启动:")]),a._v(" "),s("ol",[s("li",[a._v("本地clone仓库上的最新代码")]),a._v(" "),s("li",[a._v("将项目fizz-gateway导入IDE")]),a._v(" "),s("li",[a._v("导入完成后设置项目启动配置及修改application.yml配置文件里eureka、redis的配置,在VM选项中加入"),s("code",[a._v("-Denv=dev -Dapollo.meta=http://localhost:66")]),a._v("(Apollo配置中心地址)")])]),a._v(" "),s("p",[a._v("jar启动:")]),a._v(" "),s("ol",[s("li",[a._v("本地clone仓库上的最新代码,修改application.yml配置文件里eureka、redis的配置")]),a._v(" "),s("li",[a._v("在项目根目录fizz-gateway-community下执行Maven命令"),s("code",[a._v("mvn clean package -DskipTests=true")]),a._v("打包")]),a._v(" "),s("li",[a._v("进入target目录,使用命令"),s("code",[a._v("java -jar -Denv=DEV -Dapollo.meta=http://localhost:66 fizz-gateway-community-1.0.0.jar")]),a._v("启动服务")])]),a._v(" "),s("p",[a._v("网关访问地址格式:")]),a._v(" "),s("p",[a._v("http://127.0.0.1:8600/proxy/[服务名]/[API Path]")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/12.503f3a3d.js b/docs/assets/js/13.ce1fb161.js similarity index 97% rename from docs/assets/js/12.503f3a3d.js rename to docs/assets/js/13.ce1fb161.js index 3f42d30..56a87e7 100644 --- a/docs/assets/js/12.503f3a3d.js +++ b/docs/assets/js/13.ce1fb161.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{352:function(t,a,i){"use strict";i.r(a);var v=i(42),_=Object(v.a)({},(function(){var t=this,a=t.$createElement,i=t._self._c||a;return i("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[i("h2",{attrs:{id:"什么是fizz网关"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#什么是fizz网关"}},[t._v("#")]),t._v(" 什么是Fizz网关")]),t._v(" "),i("p",[t._v("A Managerment API Gateway in Java . Fizz Gateway 是一个基于 Java开发的微服务网关,能够实现热服务编排、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。")]),t._v(" "),i("h2",{attrs:{id:"fizz的设计"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#fizz的设计"}},[t._v("#")]),t._v(" Fizz的设计")]),t._v(" "),i("p",[i("img",{attrs:{src:"/fizz-gateway-community/fizz_design.png",alt:""}})]),t._v(" "),i("h2",{attrs:{id:"产品特性"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#产品特性"}},[t._v("#")]),t._v(" 产品特性")]),t._v(" "),i("ul",[i("li",[t._v("集群管理:Fizz网关节点是无状态的,配置信息自动同步,支持节点水平拓展和多集群部署。")]),t._v(" "),i("li",[t._v("服务编排:支持热服务编排能力,支持前后端编码,随时随地更新API。")]),t._v(" "),i("li",[t._v("负载均衡:支持round-robin负载均衡。")]),t._v(" "),i("li",[t._v("服务发现:支持从Eureka注册中心发现后端服务器。")]),t._v(" "),i("li",[t._v("配置中心:支持接入apollo配置中心。")]),t._v(" "),i("li",[t._v("HTTP反向代理:隐藏真实后端服务,支持 Rest API反向代理。")]),t._v(" "),i("li",[t._v("访问策略:支持不同策略访问不同的API、配置不同的鉴权等。")]),t._v(" "),i("li",[t._v("IP黑白名单:支持配置IP黑白名单。")]),t._v(" "),i("li",[t._v("自定义插件:强大的插件机制支持自由扩展。")]),t._v(" "),i("li",[t._v("可扩展:简单易用的插件机制方便扩展功能。")]),t._v(" "),i("li",[t._v("高性能:性能在众多网关之中表现优异。")]),t._v(" "),i("li",[t._v("版本控制:支持操作的发布和多次回滚。")]),t._v(" "),i("li",[t._v("管理后台:通过管理后台界面对网关集群进行各项配置。")])])])}),[],!1,null,null,null);a.default=_.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{361:function(t,a,i){"use strict";i.r(a);var v=i(42),_=Object(v.a)({},(function(){var t=this,a=t.$createElement,i=t._self._c||a;return i("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[i("h2",{attrs:{id:"什么是fizz网关"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#什么是fizz网关"}},[t._v("#")]),t._v(" 什么是Fizz网关")]),t._v(" "),i("p",[t._v("A Managerment API Gateway in Java . Fizz Gateway 是一个基于 Java开发的微服务网关,能够实现热服务编排、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。")]),t._v(" "),i("h2",{attrs:{id:"fizz的设计"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#fizz的设计"}},[t._v("#")]),t._v(" Fizz的设计")]),t._v(" "),i("p",[i("img",{attrs:{src:"/fizz-gateway-community/fizz_design.png",alt:""}})]),t._v(" "),i("h2",{attrs:{id:"产品特性"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#产品特性"}},[t._v("#")]),t._v(" 产品特性")]),t._v(" "),i("ul",[i("li",[t._v("集群管理:Fizz网关节点是无状态的,配置信息自动同步,支持节点水平拓展和多集群部署。")]),t._v(" "),i("li",[t._v("服务编排:支持热服务编排能力,支持前后端编码,随时随地更新API。")]),t._v(" "),i("li",[t._v("负载均衡:支持round-robin负载均衡。")]),t._v(" "),i("li",[t._v("服务发现:支持从Eureka注册中心发现后端服务器。")]),t._v(" "),i("li",[t._v("配置中心:支持接入apollo配置中心。")]),t._v(" "),i("li",[t._v("HTTP反向代理:隐藏真实后端服务,支持 Rest API反向代理。")]),t._v(" "),i("li",[t._v("访问策略:支持不同策略访问不同的API、配置不同的鉴权等。")]),t._v(" "),i("li",[t._v("IP黑白名单:支持配置IP黑白名单。")]),t._v(" "),i("li",[t._v("自定义插件:强大的插件机制支持自由扩展。")]),t._v(" "),i("li",[t._v("可扩展:简单易用的插件机制方便扩展功能。")]),t._v(" "),i("li",[t._v("高性能:性能在众多网关之中表现优异。")]),t._v(" "),i("li",[t._v("版本控制:支持操作的发布和多次回滚。")]),t._v(" "),i("li",[t._v("管理后台:通过管理后台界面对网关集群进行各项配置。")])])])}),[],!1,null,null,null);a.default=_.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/13.dbdfec6f.js b/docs/assets/js/14.a144da4f.js similarity index 99% rename from docs/assets/js/13.dbdfec6f.js rename to docs/assets/js/14.a144da4f.js index a187788..83ae48e 100644 --- a/docs/assets/js/13.dbdfec6f.js +++ b/docs/assets/js/14.a144da4f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{355:function(t,s,a){"use strict";a.r(s);var n=a(42),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"概述"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[t._v("#")]),t._v(" 概述")]),t._v(" "),a("p",[t._v("当需要在gateway中加入自定义的逻辑时,可通过fizz的插件机制实现,插件:"),a("br"),t._v("\n1、类似spring的WebFilter,是fizz内部的WebFilter,由fizz调度;"),a("br"),t._v("\n2、对不同的请求,可配置不同的上下文参数,可通过manager完成配置;"),a("br"),t._v("\n3、若有多个插件,当前插件可获取前面插件的执行结果。")]),t._v(" "),a("p",[t._v("插件的开发和应用,分gateway开发、manager配置两部分,下面以一个例子,依次介绍。")]),t._v(" "),a("h2",{attrs:{id:"gateway开发"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#gateway开发"}},[t._v("#")]),t._v(" gateway开发")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[t._v(" 实现\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n 即定义了一个插件。\n \n 比如\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Component")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("TEST_PLUGIN_FILTER"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")]),t._v(" log "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LoggerFactory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getLogger")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" TEST_PLUGIN_FILTER "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"testPlugin"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" rid "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRequest")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),t._v(" logReqId "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"logReqId"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 是否记录请求id日志,可通过manager配置")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("logReqId "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" logReqId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRequest")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getURI")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('" 的请求id: "')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" rid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),t._v(" appendFizzRsv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"appendFizzRsv"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("appendFizzRsv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" appendFizzRsv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("appendHeader")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"FIZZ-RSV"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" rid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("transmitSuccessFilterResultAndEmptyMono")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" TEST_PLUGIN_FILTER"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 保存插件执行结果,并返回")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n 这个插件,插件必须是一个spring的"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Component")]),t._v("(或子注解),且要有id,这个插件的id是testPlugin,它实现了两个功能,记录请求id日志,转发请求时添加FIZZ"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("RSV请求头,并且功能是可打开或关闭的。\n \n 另外可通过:\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getPrevFilterResult")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" 获取上一个插件的执行结果,\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getFilterResult")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"plugin.id"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" 获取已执行的任意一个插件的执行结果。\n")])])]),a("h2",{attrs:{id:"manager配置"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#manager配置"}},[t._v("#")]),t._v(" manager配置")]),t._v(" "),a("p",[t._v("1、定义插件")]),t._v(" "),a("div",{staticClass:"language-sql extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[t._v(" 在插件表中,定义上面的插件: \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("INSERT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("INTO")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("tb_plugin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("eng_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("chn_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("order")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("VALUES")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'testPlugin'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'测试插件'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('\'[{\\"field\\":\\"logReqId\\",\\"label\\":\\"打印请求id日志\\",\\"component\\":\\"radio\\",\\"dataType\\":\\"boolean\\",\\"default\\":false,\\"options\\":[{\\"label\\":\\"是\\",\\"value\\":true},{\\"label\\":\\"否\\",\\"value\\":false}]},{\\"field\\":\\"appendFizzRsv\\",\\"label\\":\\"添加fizzRsv请求头\\",\\"component\\":\\"radio\\",\\"dataType\\":\\"boolean\\",\\"default\\":false,\\"options\\":[{\\"label\\":\\"是\\",\\"value\\":true},{\\"label\\":\\"否\\",\\"value\\":false}]}]\'')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[t._v(" eng_name为插件的id,chn_name为插件中文名,order为插件的执行顺序,也是插件在界面上的显示顺序。\n \n config:\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"logReqId"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"打印请求id日志"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radio"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"是"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"否"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"appendFizzRsv"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"添加fizzRsv请求头"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radio"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"是"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"否"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n 前端据此生成插件的配置表单,具体参前端说明。\n")])])]),a("p",[t._v("2、应用插件")]),t._v(" "),a("p",[t._v("如对\n"),a("img",{attrs:{src:"/fizz-gateway-community/xapi.png",alt:""}})]),t._v(" "),a("p",[t._v("接口应用插件:\n"),a("img",{attrs:{src:"/fizz-gateway-community/test-plugin.png",alt:""}})]),t._v(" "),a("p",[t._v('上面配置的"打印请求id日志"、"添加fizzRsv请求头",对应')]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n")])])]),a("p",[t._v("中config的logReqId和appendFizzRsv key。")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{360:function(t,s,a){"use strict";a.r(s);var n=a(42),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"概述"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[t._v("#")]),t._v(" 概述")]),t._v(" "),a("p",[t._v("当需要在gateway中加入自定义的逻辑时,可通过fizz的插件机制实现,插件:"),a("br"),t._v("\n1、类似spring的WebFilter,是fizz内部的WebFilter,由fizz调度;"),a("br"),t._v("\n2、对不同的请求,可配置不同的上下文参数,可通过manager完成配置;"),a("br"),t._v("\n3、若有多个插件,当前插件可获取前面插件的执行结果。")]),t._v(" "),a("p",[t._v("插件的开发和应用,分gateway开发、manager配置两部分,下面以一个例子,依次介绍。")]),t._v(" "),a("h2",{attrs:{id:"gateway开发"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#gateway开发"}},[t._v("#")]),t._v(" gateway开发")]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[t._v(" 实现\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n 即定义了一个插件。\n \n 比如\n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Component")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("TEST_PLUGIN_FILTER"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PluginFilter")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Logger")]),t._v(" log "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LoggerFactory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getLogger")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestPluginFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" TEST_PLUGIN_FILTER "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"testPlugin"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@Override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" rid "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRequest")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),t._v(" logReqId "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"logReqId"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 是否记录请求id日志,可通过manager配置")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("logReqId "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" logReqId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n log"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getRequest")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getURI")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('" 的请求id: "')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" rid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),t._v(" appendFizzRsv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Boolean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"appendFizzRsv"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("appendFizzRsv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" appendFizzRsv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("appendHeader")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"FIZZ-RSV"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" rid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("transmitSuccessFilterResultAndEmptyMono")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" TEST_PLUGIN_FILTER"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 保存插件执行结果,并返回")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n 这个插件,插件必须是一个spring的"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Component")]),t._v("(或子注解),且要有id,这个插件的id是testPlugin,它实现了两个功能,记录请求id日志,转发请求时添加FIZZ"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("RSV请求头,并且功能是可打开或关闭的。\n \n 另外可通过:\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getPrevFilterResult")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" 获取上一个插件的执行结果,\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WebUtils")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getFilterResult")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"plugin.id"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" 获取已执行的任意一个插件的执行结果。\n")])])]),a("h2",{attrs:{id:"manager配置"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#manager配置"}},[t._v("#")]),t._v(" manager配置")]),t._v(" "),a("p",[t._v("1、定义插件")]),t._v(" "),a("div",{staticClass:"language-sql extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[t._v(" 在插件表中,定义上面的插件: \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("INSERT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("INTO")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("tb_plugin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("eng_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("chn_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),t._v("config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("order")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("VALUES")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'testPlugin'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'测试插件'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('\'[{\\"field\\":\\"logReqId\\",\\"label\\":\\"打印请求id日志\\",\\"component\\":\\"radio\\",\\"dataType\\":\\"boolean\\",\\"default\\":false,\\"options\\":[{\\"label\\":\\"是\\",\\"value\\":true},{\\"label\\":\\"否\\",\\"value\\":false}]},{\\"field\\":\\"appendFizzRsv\\",\\"label\\":\\"添加fizzRsv请求头\\",\\"component\\":\\"radio\\",\\"dataType\\":\\"boolean\\",\\"default\\":false,\\"options\\":[{\\"label\\":\\"是\\",\\"value\\":true},{\\"label\\":\\"否\\",\\"value\\":false}]}]\'')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[t._v(" eng_name为插件的id,chn_name为插件中文名,order为插件的执行顺序,也是插件在界面上的显示顺序。\n \n config:\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"logReqId"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"打印请求id日志"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radio"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"是"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"否"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"field"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"appendFizzRsv"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"添加fizzRsv请求头"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"component"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"radio"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"dataType"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"default"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"options"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"是"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"否"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n 前端据此生成插件的配置表单,具体参前端说明。\n")])])]),a("p",[t._v("2、应用插件")]),t._v(" "),a("p",[t._v("如对\n"),a("img",{attrs:{src:"/fizz-gateway-community/xapi.png",alt:""}})]),t._v(" "),a("p",[t._v("接口应用插件:\n"),a("img",{attrs:{src:"/fizz-gateway-community/test-plugin.png",alt:""}})]),t._v(" "),a("p",[t._v('上面配置的"打印请求id日志"、"添加fizzRsv请求头",对应')]),t._v(" "),a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mono")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("doFilter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ServerWebExchange")]),t._v(" exchange"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Map")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Object")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" fixedConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n")])])]),a("p",[t._v("中config的logReqId和appendFizzRsv key。")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/14.910519b5.js b/docs/assets/js/15.ae9aceb7.js similarity index 95% rename from docs/assets/js/14.910519b5.js rename to docs/assets/js/15.ae9aceb7.js index 2f130d5..e82f71a 100644 --- a/docs/assets/js/14.910519b5.js +++ b/docs/assets/js/15.ae9aceb7.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{357:function(t,e,s){"use strict";s.r(e);var a=s(42),r=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"路由转发介绍"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#路由转发介绍"}},[t._v("#")]),t._v(" 路由转发介绍")]),t._v(" "),s("p",[t._v("路由转发也叫反向代理,为内部微服务提供统一的对外入口。支持以下功能:")]),t._v(" "),s("ul",[s("li",[t._v("支持服务注册与发现")]),t._v(" "),s("li",[t._v("支持负载均衡")]),t._v(" "),s("li",[t._v("支持黑白名单机制")]),t._v(" "),s("li",[t._v("支持配置插件")])]),t._v(" "),s("h2",{attrs:{id:"接入路由转发"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接入路由转发"}},[t._v("#")]),t._v(" 接入路由转发")]),t._v(" "),s("ul",[s("li",[t._v("前提条件:接入Eureka注册中心")]),t._v(" "),s("li",[t._v("开通白名单,接入注册中心的服务默认不对公网开放 (白名单在配置文件里配置serviceWhiteList)")]),t._v(" "),s("li",[t._v("配置访问权限 (管理后台-接口代理-API查询)")])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{359:function(t,e,s){"use strict";s.r(e);var a=s(42),r=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"路由转发介绍"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#路由转发介绍"}},[t._v("#")]),t._v(" 路由转发介绍")]),t._v(" "),s("p",[t._v("路由转发也叫反向代理,为内部微服务提供统一的对外入口。支持以下功能:")]),t._v(" "),s("ul",[s("li",[t._v("支持服务注册与发现")]),t._v(" "),s("li",[t._v("支持负载均衡")]),t._v(" "),s("li",[t._v("支持黑白名单机制")]),t._v(" "),s("li",[t._v("支持配置插件")])]),t._v(" "),s("h2",{attrs:{id:"接入路由转发"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#接入路由转发"}},[t._v("#")]),t._v(" 接入路由转发")]),t._v(" "),s("ul",[s("li",[t._v("前提条件:接入Eureka注册中心")]),t._v(" "),s("li",[t._v("开通白名单,接入注册中心的服务默认不对公网开放 (白名单在配置文件里配置serviceWhiteList)")]),t._v(" "),s("li",[t._v("配置访问权限 (管理后台-接口代理-API查询)")])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/3.804d668d.js b/docs/assets/js/3.c15b449a.js similarity index 87% rename from docs/assets/js/3.804d668d.js rename to docs/assets/js/3.c15b449a.js index f90adaa..30cbe80 100644 --- a/docs/assets/js/3.804d668d.js +++ b/docs/assets/js/3.c15b449a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{317:function(t,e,n){},348:function(t,e,n){"use strict";var i=n(317);n.n(i).a},361:function(t,e,n){"use strict";n.r(e);var i={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:function(t,e){var n=e.props,i=e.slots;return t("span",{class:["badge",n.type],style:{verticalAlign:n.vertical}},n.text||i().default)}},r=(n(348),n(42)),a=Object(r.a)(i,void 0,void 0,!1,null,"15b7b770",null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{317:function(t,e,n){},348:function(t,e,n){"use strict";var i=n(317);n.n(i).a},362:function(t,e,n){"use strict";n.r(e);var i={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:function(t,e){var n=e.props,i=e.slots;return t("span",{class:["badge",n.type],style:{verticalAlign:n.vertical}},n.text||i().default)}},r=(n(348),n(42)),a=Object(r.a)(i,void 0,void 0,!1,null,"15b7b770",null);e.default=a.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/5.67cd28cb.js b/docs/assets/js/5.abc10683.js similarity index 79% rename from docs/assets/js/5.67cd28cb.js rename to docs/assets/js/5.abc10683.js index 61a9f68..71e393b 100644 --- a/docs/assets/js/5.67cd28cb.js +++ b/docs/assets/js/5.abc10683.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{359:function(t,e,n){"use strict";n.r(e);var s=n(42),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{351:function(t,e,n){"use strict";n.r(e);var s=n(42),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/6.af9d3ed2.js b/docs/assets/js/6.e883523c.js similarity index 79% rename from docs/assets/js/6.af9d3ed2.js rename to docs/assets/js/6.e883523c.js index 0936647..b633ff3 100644 --- a/docs/assets/js/6.af9d3ed2.js +++ b/docs/assets/js/6.e883523c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{360:function(t,e,n){"use strict";n.r(e);var s=n(42),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{354:function(t,e,n){"use strict";n.r(e);var s=n(42),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/7.4fed6011.js b/docs/assets/js/7.00dd2642.js similarity index 81% rename from docs/assets/js/7.4fed6011.js rename to docs/assets/js/7.00dd2642.js index 0848f53..04bd9a0 100644 --- a/docs/assets/js/7.4fed6011.js +++ b/docs/assets/js/7.00dd2642.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{358:function(t,n,s){"use strict";s.r(n);var e=s(42),o=Object(e.a)({},(function(){var t=this.$createElement,n=this._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[n("p",[this._v("coming soon")])])}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{353:function(t,n,s){"use strict";s.r(n);var e=s(42),o=Object(e.a)({},(function(){var t=this.$createElement,n=this._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[n("p",[this._v("coming soon")])])}),[],!1,null,null,null);n.default=o.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/8.2ee1850f.js b/docs/assets/js/8.99888a6b.js similarity index 97% rename from docs/assets/js/8.2ee1850f.js rename to docs/assets/js/8.99888a6b.js index 4ec22d0..edbab21 100644 --- a/docs/assets/js/8.2ee1850f.js +++ b/docs/assets/js/8.99888a6b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{351:function(t,a,r){"use strict";r.r(a);var s=r(42),e=Object(s.a)({},(function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h2",{attrs:{id:"什么是服务编排"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#什么是服务编排"}},[t._v("#")]),t._v(" 什么是服务编排")]),t._v(" "),r("p",[t._v("服务编排主要基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口。")]),t._v(" "),r("p",[t._v("特点: 在线API设计、在线测试、快速开发")]),t._v(" "),r("h2",{attrs:{id:"举例说明"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#举例说明"}},[t._v("#")]),t._v(" 举例说明")]),t._v(" "),r("p",[t._v("订单详情页面需要展示订单信息、商品信息和用户信息。可通过配置的方式生成一个接口先后调用底层微服务的订单详情接口、商品信息接口和用户信息接口,再从这3个接口的返回结果里提取需要的字段返回给前端页面。")]),t._v(" "),r("h2",{attrs:{id:"服务编排架构"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#服务编排架构"}},[t._v("#")]),t._v(" 服务编排架构")]),t._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/fizz_aggregate.jpg",alt:""}})]),t._v(" "),r("h2",{attrs:{id:"适用场景"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#适用场景"}},[t._v("#")]),t._v(" 适用场景")]),t._v(" "),r("h3",{attrs:{id:"前端"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#前端"}},[t._v("#")]),t._v(" 前端")]),t._v(" "),r("p",[t._v("1、一个页面调用多个接口时,可以编排好返回聚合结果,提高页面数据的加载速度")]),t._v(" "),r("p",[t._v("2、移动设备计算能力有限,可以把数据计算或业务处理逻辑放到服务端完成,加快页面响应")]),t._v(" "),r("h3",{attrs:{id:"后端"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#后端"}},[t._v("#")]),t._v(" 后端")]),t._v(" "),r("p",[t._v("1、替换应用层的聚合接口,减少应用层的胶水代码")]),t._v(" "),r("p",[t._v("2、快速生成透传数据类型的接口")]),t._v(" "),r("p",[t._v("3、数据转换和映射")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{352:function(t,a,r){"use strict";r.r(a);var s=r(42),e=Object(s.a)({},(function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h2",{attrs:{id:"什么是服务编排"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#什么是服务编排"}},[t._v("#")]),t._v(" 什么是服务编排")]),t._v(" "),r("p",[t._v("服务编排主要基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口。")]),t._v(" "),r("p",[t._v("特点: 在线API设计、在线测试、快速开发")]),t._v(" "),r("h2",{attrs:{id:"举例说明"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#举例说明"}},[t._v("#")]),t._v(" 举例说明")]),t._v(" "),r("p",[t._v("订单详情页面需要展示订单信息、商品信息和用户信息。可通过配置的方式生成一个接口先后调用底层微服务的订单详情接口、商品信息接口和用户信息接口,再从这3个接口的返回结果里提取需要的字段返回给前端页面。")]),t._v(" "),r("h2",{attrs:{id:"服务编排架构"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#服务编排架构"}},[t._v("#")]),t._v(" 服务编排架构")]),t._v(" "),r("p",[r("img",{attrs:{src:"/fizz-gateway-community/fizz_aggregate.jpg",alt:""}})]),t._v(" "),r("h2",{attrs:{id:"适用场景"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#适用场景"}},[t._v("#")]),t._v(" 适用场景")]),t._v(" "),r("h3",{attrs:{id:"前端"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#前端"}},[t._v("#")]),t._v(" 前端")]),t._v(" "),r("p",[t._v("1、一个页面调用多个接口时,可以编排好返回聚合结果,提高页面数据的加载速度")]),t._v(" "),r("p",[t._v("2、移动设备计算能力有限,可以把数据计算或业务处理逻辑放到服务端完成,加快页面响应")]),t._v(" "),r("h3",{attrs:{id:"后端"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#后端"}},[t._v("#")]),t._v(" 后端")]),t._v(" "),r("p",[t._v("1、替换应用层的聚合接口,减少应用层的胶水代码")]),t._v(" "),r("p",[t._v("2、快速生成透传数据类型的接口")]),t._v(" "),r("p",[t._v("3、数据转换和映射")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/9.5f299cef.js b/docs/assets/js/9.fd57a582.js similarity index 99% rename from docs/assets/js/9.5f299cef.js rename to docs/assets/js/9.fd57a582.js index 661293a..7362807 100644 --- a/docs/assets/js/9.5f299cef.js +++ b/docs/assets/js/9.fd57a582.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{354:function(t,a,s){"use strict";s.r(a);var n=s(42),e=Object(n.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"创建服务"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#创建服务"}},[t._v("#")]),t._v(" 创建服务")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_newservice.png",alt:""}})]),t._v(" "),s("h2",{attrs:{id:"创建聚合接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#创建聚合接口"}},[t._v("#")]),t._v(" 创建聚合接口")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_newapi0.png",alt:""}}),t._v(" "),s("img",{attrs:{src:"/fizz-gateway-community/aggr_newapi.png",alt:""}})]),t._v(" "),s("h2",{attrs:{id:"配置输入"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输入"}},[t._v("#")]),t._v(" 配置输入")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_input.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("配置输入的定义包括3部分:请求头、请求体和Query参数")]),t._v(" "),s("li",[t._v("基于JSON Schema规范")]),t._v(" "),s("li",[t._v("自带校验规则")]),t._v(" "),s("li",[t._v("支持自定义脚本实现复杂的逻辑校验")])]),t._v(" "),s("p",[t._v("JSON Schema规范,详见:")]),t._v(" "),s("p",[s("a",{attrs:{href:"http://json-schema.org/specification.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://json-schema.org/specification.html"),s("OutboundLink")],1)]),t._v(" "),s("p",[s("a",{attrs:{href:"http://json-schema.org/understanding-json-schema/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://json-schema.org/understanding-json-schema/"),s("OutboundLink")],1)]),t._v(" "),s("h2",{attrs:{id:"配置校验结果"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置校验结果"}},[t._v("#")]),t._v(" 配置校验结果")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_input_validate_result.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("校验不通过时,Fizz会把校验失败的原因(如:订单ID不能为空)放到上下文的validateMsg字段里")]),t._v(" "),s("li",[t._v("可以自定义返回给调用方的报文格式,如 msgCode, message")]),t._v(" "),s("li",[t._v("支持自定义响应头")]),t._v(" "),s("li",[t._v("支持自定义脚本处理校验结果")])]),t._v(" "),s("h2",{attrs:{id:"配置步骤"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤"}},[t._v("#")]),t._v(" 配置步骤")]),t._v(" "),s("h3",{attrs:{id:"配置步骤的基础信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤的基础信息"}},[t._v("#")]),t._v(" 配置步骤的基础信息")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step1.png",alt:""}})]),t._v(" "),s("h3",{attrs:{id:"配置步骤的接口入出参"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤的接口入出参"}},[t._v("#")]),t._v(" 配置步骤的接口入出参")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step2.png",alt:""}})]),t._v(" "),s("h3",{attrs:{id:"步骤说明"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#步骤说明"}},[t._v("#")]),t._v(" 步骤说明")]),t._v(" "),s("ul",[s("li",[t._v("一个聚合接口可包含多个步骤")]),t._v(" "),s("li",[t._v("一个步骤可包含多个请求(即调用多个接口)")]),t._v(" "),s("li",[t._v("步骤间是串联顺序执行")]),t._v(" "),s("li",[t._v("一个步骤内的多个请求并行执行")])]),t._v(" "),s("h3",{attrs:{id:"数据转换"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#数据转换"}},[t._v("#")]),t._v(" 数据转换")]),t._v(" "),s("p",[t._v("支持配置固定值,引用值和脚本")]),t._v(" "),s("h4",{attrs:{id:"固定值"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#固定值"}},[t._v("#")]),t._v(" 固定值")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_1.png",alt:""}})]),t._v(" "),s("h4",{attrs:{id:"引用值"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#引用值"}},[t._v("#")]),t._v(" 引用值")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_2.png",alt:""}})]),t._v(" "),s("h4",{attrs:{id:"脚本"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#脚本"}},[t._v("#")]),t._v(" 脚本")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_3.png",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_4.png",alt:""}})]),t._v(" "),s("h4",{attrs:{id:"星号"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#星号"}},[t._v("#")]),t._v(" 星号 *")]),t._v(" "),s("p",[t._v("星号通配符可以接收一个返回对象类型的引用值,返回对象里的字段会合并到目标对象里")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_5.png",alt:""}})]),t._v(" "),s("p",[t._v('样例:userInfo = {"userName": "Fizz", "userID": 1234}')]),t._v(" "),s("h4",{attrs:{id:"优先级与覆盖顺序"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#优先级与覆盖顺序"}},[t._v("#")]),t._v(" 优先级与覆盖顺序")]),t._v(" "),s("p",[t._v("固定值 < 引用值 < 脚本 < 星号*")]),t._v(" "),s("p",[t._v("当一个字段配置了多种类型的值时按以上顺序覆盖,星号优先级最高")]),t._v(" "),s("h4",{attrs:{id:"引用值规范"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#引用值规范"}},[t._v("#")]),t._v(" 引用值规范")]),t._v(" "),s("div",{staticClass:"language-properties extra-class"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参请求头aaa的值")]),t._v("\ninput.request.headers.aaa\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参请求体bbb字段的值")]),t._v("\ninput.request.body.bbb\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参URL Query参数fff字段的值")]),t._v("\ninput.request.params.fff\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1里request1的请求头ccc的值")]),t._v("\nstep1.request1.request.headers.ccc\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1里request1的响应体ddd的值")]),t._v("\nstep1.request1.response.body.ddd\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1结果里eee的值")]),t._v("\nstep1.result.eee\n\n")])])]),s("ul",[s("li",[t._v("支持单值引用,如:string,int等")]),t._v(" "),s("li",[t._v("支持对象类型的引用")])]),t._v(" "),s("p",[t._v("input: 表示调用方的输入数据,如H5页面提交上来的参数")]),t._v(" "),s("p",[t._v("stepN.requestN: 表示步骤N里调用接口N的相关参数")]),t._v(" "),s("p",[t._v("stepN.result: 表示步骤N的转换结果")]),t._v(" "),s("h4",{attrs:{id:"fallback与预处理条件"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#fallback与预处理条件"}},[t._v("#")]),t._v(" Fallback与预处理条件")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_fallback.png",alt:""}})]),t._v(" "),s("p",[t._v("Fallback:")]),t._v(" "),s("p",[t._v("当调用接口发生异常(如超时、网络或系统异常)可配置fallback方案:")]),t._v(" "),s("ul",[s("li",[t._v("Stop: 终止请求并立即返回")]),t._v(" "),s("li",[t._v("Continue: 继续后续的操作,且要设置默认的fallback json")])]),t._v(" "),s("p",[t._v("预处理: 根据条件判断是否要调用接口,脚本返回true时才调用接口")]),t._v(" "),s("h4",{attrs:{id:"配置步骤结果处理"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤结果处理"}},[t._v("#")]),t._v(" 配置步骤结果处理")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_result.png",alt:""}})]),t._v(" "),s("ul",[s("li",[s("p",[t._v("支持对步骤里调用的每一个接口的返回结果做数据转换,如果配置数据转换规则原样返回并存储到上下文里供后续使用")])]),t._v(" "),s("li",[s("p",[t._v("支持对步骤里调用的一个或多个接口的返回结果做处理,并把处理完的结果存储到上下文里供后续使用,不配置则不处理")])])]),t._v(" "),s("h2",{attrs:{id:"配置输出"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输出"}},[t._v("#")]),t._v(" 配置输出")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_output.png",alt:""}})]),t._v(" "),s("p",[t._v("配置返回给调用方的结果")]),t._v(" "),s("ul",[s("li",[t._v("支持配置响应头")]),t._v(" "),s("li",[t._v("支持配置响应体")]),t._v(" "),s("li",[t._v("支持自定脚本处理复杂的业务逻辑")])]),t._v(" "),s("h2",{attrs:{id:"脚本-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#脚本-2"}},[t._v("#")]),t._v(" 脚本")]),t._v(" "),s("p",[t._v("目前支持以下脚本语言:")]),t._v(" "),s("p",[t._v("Javascript (推荐) - ECMAScript 5标准")]),t._v(" "),s("p",[t._v("JS脚本只支持单函数,且函数名不可变,在创建脚本时系统会自动生成初始模板,模板里包含相关使用说明")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_script_1.png",alt:""}})]),t._v(" "),s("p",[t._v("Groovy")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_script_2.png",alt:""}})]),t._v(" "),s("h3",{attrs:{id:"common-js-提供了操作context上下文的便捷操作函数"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#common-js-提供了操作context上下文的便捷操作函数"}},[t._v("#")]),t._v(" common.js 提供了操作context上下文的便捷操作函数")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * context 上下文便捷操作函数\n *\n */")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" common "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** private function begin *********** */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文中客户端请求对象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文步骤中请求接口的请求对象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文步骤中请求接口的响应对象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepResp")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'response'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'response'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** private function end *********** */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** input begin ************ */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端请求头\n * @param {*} ctx 上下文 【必填】\n * @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端URL请求参数(query string)\n * @param {*} ctx 上下文 【必填】\n * @param {*} paramName URL参数名 【选填】,不传时返回所有请求参数\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqParam")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" paramName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" params "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'params'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" paramName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("paramName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端请求体\n * @param {*} ctx 上下文 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个请求体\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取返回给客户端的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputRespHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取返回给客户端的响应体\n * @param {*} ctx 上下文 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个响应体\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputRespBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** input begin ************ */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** step request begin ************ */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的请求头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的URL参数\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} paramName URL参数名 【选填】,不传时返回所有URL参数\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqParam")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" paramName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" params "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'params'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" paramName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("paramName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的请求体\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个请求体\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepRespHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" resp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepResp")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" resp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个响应头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepRespBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" resp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepResp")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" resp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤结果\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个步骤结果对象\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepResult")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'result'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** step request end ************ */")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),s("h3",{attrs:{id:"context-js-数据结构"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#context-js-数据结构"}},[t._v("#")]),t._v(" context.js 数据结构")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 上下文,用于保存客户输入输出和每个步骤的输入与输出结果")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" context "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 是否DEBUG模式")]),t._v("\n\tdebug"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n\t"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 各个操作的耗时")]),t._v("\n\telapsedTimes"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("actionName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 操作名称:耗时")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 客户输入和接口的返回结果")]),t._v("\n input"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n request"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n path"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n params"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n response"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 聚合接口的响应")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 步骤")]),t._v("\n step1"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n requests"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 接口1")]),t._v("\n request1"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 请求相关参数")]),t._v("\n request"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 根据转换规则转换后的接口响应")]),t._v("\n response"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 接口2")]),t._v("\n request2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n request"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n response"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//...")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 步骤结果")]),t._v("\n result"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),s("h2",{attrs:{id:"异常处理"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#异常处理"}},[t._v("#")]),t._v(" 异常处理")]),t._v(" "),s("p",[t._v("当要在脚本里中止请求时可以通过以下方式来实现")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_exception.png",alt:""}})]),t._v(" "),s("p",[t._v("返回一个对象且这个对象包含一个_stopAndResponse等于true的属性,Fizz会终止后续的操作并把这个对象返回给调用方。")]),t._v(" "),s("h2",{attrs:{id:"在线测试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#在线测试"}},[t._v("#")]),t._v(" 在线测试")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_test.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("支持在线实时测试")]),t._v(" "),s("li",[t._v("支持测试接口和正式接口隔离")]),t._v(" "),s("li",[t._v("支持返回上下文,可以查看整个执行过程中各个步骤及请求的输入与输出")]),t._v(" "),s("li",[t._v("支持保存历史测试记录")])]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_test2.png",alt:""}})]),t._v(" "),s("p",[t._v("支持调试模式,在测试接口和正式接口均可使用,修改后重新发布可实时生效,在调试模式下会打印请求日志及报文,主要用于排查线上问题")]),t._v(" "),s("h2",{attrs:{id:"导入导出"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#导入导出"}},[t._v("#")]),t._v(" 导入导出")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_import_export.png",alt:""}})]),t._v(" "),s("p",[t._v("导入导出主要用于在各个环境间同步接口配置,在开发环境配置好后导到测试环境中测试,测试完后导到生产环境进行发布")]),t._v(" "),s("h2",{attrs:{id:"发布-下线和审核"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#发布-下线和审核"}},[t._v("#")]),t._v(" 发布|下线和审核")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_1.png",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_2.png",alt:""}})]),t._v(" "),s("p",[t._v("目前发布|下线申请有以上两个入口。")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_rollback1.png",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_rollback.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("批量发布:对发布单里的接口进行批量发布")]),t._v(" "),s("li",[t._v("批量回滚:对发布单里的接口进行批量回滚")]),t._v(" "),s("li",[t._v("发布:实时发布到网关")]),t._v(" "),s("li",[t._v("回滚:支持回滚到历史任何一个版本,可在发布历史里指定一个版本进行回滚")]),t._v(" "),s("li",[t._v("下线:从网关删除接口,在后台可以通过发布功能再次上线")])]),t._v(" "),s("h3",{attrs:{id:"发布流程说明"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#发布流程说明"}},[t._v("#")]),t._v(" 发布流程说明")]),t._v(" "),s("p",[t._v("申请发布、审核、发布和下线功能的权限可根据需要灵活分配给不同角色,如:开发人员只能申请发布,上级领导审核,运维或测试人员执行发布、回滚或下线。在开发、测试和预生产环境为了方便开发人员调试也可把申请发布、审核、发布和下线功能都分配给开发人员。")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{355:function(t,a,s){"use strict";s.r(a);var n=s(42),e=Object(n.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"创建服务"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#创建服务"}},[t._v("#")]),t._v(" 创建服务")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_newservice.png",alt:""}})]),t._v(" "),s("h2",{attrs:{id:"创建聚合接口"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#创建聚合接口"}},[t._v("#")]),t._v(" 创建聚合接口")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_newapi0.png",alt:""}}),t._v(" "),s("img",{attrs:{src:"/fizz-gateway-community/aggr_newapi.png",alt:""}})]),t._v(" "),s("h2",{attrs:{id:"配置输入"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输入"}},[t._v("#")]),t._v(" 配置输入")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_input.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("配置输入的定义包括3部分:请求头、请求体和Query参数")]),t._v(" "),s("li",[t._v("基于JSON Schema规范")]),t._v(" "),s("li",[t._v("自带校验规则")]),t._v(" "),s("li",[t._v("支持自定义脚本实现复杂的逻辑校验")])]),t._v(" "),s("p",[t._v("JSON Schema规范,详见:")]),t._v(" "),s("p",[s("a",{attrs:{href:"http://json-schema.org/specification.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://json-schema.org/specification.html"),s("OutboundLink")],1)]),t._v(" "),s("p",[s("a",{attrs:{href:"http://json-schema.org/understanding-json-schema/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://json-schema.org/understanding-json-schema/"),s("OutboundLink")],1)]),t._v(" "),s("h2",{attrs:{id:"配置校验结果"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置校验结果"}},[t._v("#")]),t._v(" 配置校验结果")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_input_validate_result.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("校验不通过时,Fizz会把校验失败的原因(如:订单ID不能为空)放到上下文的validateMsg字段里")]),t._v(" "),s("li",[t._v("可以自定义返回给调用方的报文格式,如 msgCode, message")]),t._v(" "),s("li",[t._v("支持自定义响应头")]),t._v(" "),s("li",[t._v("支持自定义脚本处理校验结果")])]),t._v(" "),s("h2",{attrs:{id:"配置步骤"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤"}},[t._v("#")]),t._v(" 配置步骤")]),t._v(" "),s("h3",{attrs:{id:"配置步骤的基础信息"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤的基础信息"}},[t._v("#")]),t._v(" 配置步骤的基础信息")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step1.png",alt:""}})]),t._v(" "),s("h3",{attrs:{id:"配置步骤的接口入出参"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤的接口入出参"}},[t._v("#")]),t._v(" 配置步骤的接口入出参")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step2.png",alt:""}})]),t._v(" "),s("h3",{attrs:{id:"步骤说明"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#步骤说明"}},[t._v("#")]),t._v(" 步骤说明")]),t._v(" "),s("ul",[s("li",[t._v("一个聚合接口可包含多个步骤")]),t._v(" "),s("li",[t._v("一个步骤可包含多个请求(即调用多个接口)")]),t._v(" "),s("li",[t._v("步骤间是串联顺序执行")]),t._v(" "),s("li",[t._v("一个步骤内的多个请求并行执行")])]),t._v(" "),s("h3",{attrs:{id:"数据转换"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#数据转换"}},[t._v("#")]),t._v(" 数据转换")]),t._v(" "),s("p",[t._v("支持配置固定值,引用值和脚本")]),t._v(" "),s("h4",{attrs:{id:"固定值"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#固定值"}},[t._v("#")]),t._v(" 固定值")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_1.png",alt:""}})]),t._v(" "),s("h4",{attrs:{id:"引用值"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#引用值"}},[t._v("#")]),t._v(" 引用值")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_2.png",alt:""}})]),t._v(" "),s("h4",{attrs:{id:"脚本"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#脚本"}},[t._v("#")]),t._v(" 脚本")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_3.png",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_4.png",alt:""}})]),t._v(" "),s("h4",{attrs:{id:"星号"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#星号"}},[t._v("#")]),t._v(" 星号 *")]),t._v(" "),s("p",[t._v("星号通配符可以接收一个返回对象类型的引用值,返回对象里的字段会合并到目标对象里")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_mapping_5.png",alt:""}})]),t._v(" "),s("p",[t._v('样例:userInfo = {"userName": "Fizz", "userID": 1234}')]),t._v(" "),s("h4",{attrs:{id:"优先级与覆盖顺序"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#优先级与覆盖顺序"}},[t._v("#")]),t._v(" 优先级与覆盖顺序")]),t._v(" "),s("p",[t._v("固定值 < 引用值 < 脚本 < 星号*")]),t._v(" "),s("p",[t._v("当一个字段配置了多种类型的值时按以上顺序覆盖,星号优先级最高")]),t._v(" "),s("h4",{attrs:{id:"引用值规范"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#引用值规范"}},[t._v("#")]),t._v(" 引用值规范")]),t._v(" "),s("div",{staticClass:"language-properties extra-class"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参请求头aaa的值")]),t._v("\ninput.request.headers.aaa\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参请求体bbb字段的值")]),t._v("\ninput.request.body.bbb\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取入参URL Query参数fff字段的值")]),t._v("\ninput.request.params.fff\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1里request1的请求头ccc的值")]),t._v("\nstep1.request1.request.headers.ccc\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1里request1的响应体ddd的值")]),t._v("\nstep1.request1.response.body.ddd\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取步骤1结果里eee的值")]),t._v("\nstep1.result.eee\n\n")])])]),s("ul",[s("li",[t._v("支持单值引用,如:string,int等")]),t._v(" "),s("li",[t._v("支持对象类型的引用")])]),t._v(" "),s("p",[t._v("input: 表示调用方的输入数据,如H5页面提交上来的参数")]),t._v(" "),s("p",[t._v("stepN.requestN: 表示步骤N里调用接口N的相关参数")]),t._v(" "),s("p",[t._v("stepN.result: 表示步骤N的转换结果")]),t._v(" "),s("h4",{attrs:{id:"fallback与预处理条件"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#fallback与预处理条件"}},[t._v("#")]),t._v(" Fallback与预处理条件")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_fallback.png",alt:""}})]),t._v(" "),s("p",[t._v("Fallback:")]),t._v(" "),s("p",[t._v("当调用接口发生异常(如超时、网络或系统异常)可配置fallback方案:")]),t._v(" "),s("ul",[s("li",[t._v("Stop: 终止请求并立即返回")]),t._v(" "),s("li",[t._v("Continue: 继续后续的操作,且要设置默认的fallback json")])]),t._v(" "),s("p",[t._v("预处理: 根据条件判断是否要调用接口,脚本返回true时才调用接口")]),t._v(" "),s("h4",{attrs:{id:"配置步骤结果处理"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置步骤结果处理"}},[t._v("#")]),t._v(" 配置步骤结果处理")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_step_result.png",alt:""}})]),t._v(" "),s("ul",[s("li",[s("p",[t._v("支持对步骤里调用的每一个接口的返回结果做数据转换,如果配置数据转换规则原样返回并存储到上下文里供后续使用")])]),t._v(" "),s("li",[s("p",[t._v("支持对步骤里调用的一个或多个接口的返回结果做处理,并把处理完的结果存储到上下文里供后续使用,不配置则不处理")])])]),t._v(" "),s("h2",{attrs:{id:"配置输出"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#配置输出"}},[t._v("#")]),t._v(" 配置输出")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_output.png",alt:""}})]),t._v(" "),s("p",[t._v("配置返回给调用方的结果")]),t._v(" "),s("ul",[s("li",[t._v("支持配置响应头")]),t._v(" "),s("li",[t._v("支持配置响应体")]),t._v(" "),s("li",[t._v("支持自定脚本处理复杂的业务逻辑")])]),t._v(" "),s("h2",{attrs:{id:"脚本-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#脚本-2"}},[t._v("#")]),t._v(" 脚本")]),t._v(" "),s("p",[t._v("目前支持以下脚本语言:")]),t._v(" "),s("p",[t._v("Javascript (推荐) - ECMAScript 5标准")]),t._v(" "),s("p",[t._v("JS脚本只支持单函数,且函数名不可变,在创建脚本时系统会自动生成初始模板,模板里包含相关使用说明")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_script_1.png",alt:""}})]),t._v(" "),s("p",[t._v("Groovy")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_script_2.png",alt:""}})]),t._v(" "),s("h3",{attrs:{id:"common-js-提供了操作context上下文的便捷操作函数"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#common-js-提供了操作context上下文的便捷操作函数"}},[t._v("#")]),t._v(" common.js 提供了操作context上下文的便捷操作函数")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * context 上下文便捷操作函数\n *\n */")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" common "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** private function begin *********** */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文中客户端请求对象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'input'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文步骤中请求接口的请求对象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'request'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 获取上下文步骤中请求接口的响应对象")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepResp")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'response'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'requests'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'response'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** private function end *********** */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** input begin ************ */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端请求头\n * @param {*} ctx 上下文 【必填】\n * @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端URL请求参数(query string)\n * @param {*} ctx 上下文 【必填】\n * @param {*} paramName URL参数名 【选填】,不传时返回所有请求参数\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqParam")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" paramName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" params "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'params'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" paramName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("paramName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取客户端请求体\n * @param {*} ctx 上下文 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个请求体\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputReqBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取返回给客户端的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputRespHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取返回给客户端的响应体\n * @param {*} ctx 上下文 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个响应体\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getInputRespBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getInputReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** input begin ************ */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** step request begin ************ */")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的请求头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的URL参数\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} paramName URL参数名 【选填】,不传时返回所有URL参数\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqParam")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" paramName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" params "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'params'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" paramName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("paramName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的请求体\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个请求体\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepReqBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" req "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepReq")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepRespHeader")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" headerName")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" resp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepResp")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" resp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'headers'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" headerName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("headerName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤中调用的接口的响应头\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} requestName 请求的接口名 【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个响应头\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepRespBody")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" resp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getStepResp")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" requestName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" body "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" resp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" body"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * 获取步骤结果\n * @param {*} ctx 上下文 【必填】\n * @param {*} stepName 步骤名【必填】\n * @param {*} field 字段名 【选填】,不传时返回整个步骤结果对象\n */")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getStepResult")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" field")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("stepName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" result "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ctx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("stepName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'result'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" field "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("field"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" result"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* *********** step request end ************ */")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),s("h3",{attrs:{id:"context-js-数据结构"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#context-js-数据结构"}},[t._v("#")]),t._v(" context.js 数据结构")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 上下文,用于保存客户输入输出和每个步骤的输入与输出结果")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" context "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 是否DEBUG模式")]),t._v("\n\tdebug"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n\t"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 各个操作的耗时")]),t._v("\n\telapsedTimes"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("actionName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 操作名称:耗时")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 客户输入和接口的返回结果")]),t._v("\n input"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n request"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n path"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n params"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n response"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 聚合接口的响应")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 步骤")]),t._v("\n step1"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n requests"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 接口1")]),t._v("\n request1"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 请求相关参数")]),t._v("\n request"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 根据转换规则转换后的接口响应")]),t._v("\n response"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 接口2")]),t._v("\n request2"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n request"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n method"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET/POST"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n response"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n headers"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//...")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 步骤结果")]),t._v("\n result"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),s("h2",{attrs:{id:"异常处理"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#异常处理"}},[t._v("#")]),t._v(" 异常处理")]),t._v(" "),s("p",[t._v("当要在脚本里中止请求时可以通过以下方式来实现")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_exception.png",alt:""}})]),t._v(" "),s("p",[t._v("返回一个对象且这个对象包含一个_stopAndResponse等于true的属性,Fizz会终止后续的操作并把这个对象返回给调用方。")]),t._v(" "),s("h2",{attrs:{id:"在线测试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#在线测试"}},[t._v("#")]),t._v(" 在线测试")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_test.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("支持在线实时测试")]),t._v(" "),s("li",[t._v("支持测试接口和正式接口隔离")]),t._v(" "),s("li",[t._v("支持返回上下文,可以查看整个执行过程中各个步骤及请求的输入与输出")]),t._v(" "),s("li",[t._v("支持保存历史测试记录")])]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_test2.png",alt:""}})]),t._v(" "),s("p",[t._v("支持调试模式,在测试接口和正式接口均可使用,修改后重新发布可实时生效,在调试模式下会打印请求日志及报文,主要用于排查线上问题")]),t._v(" "),s("h2",{attrs:{id:"导入导出"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#导入导出"}},[t._v("#")]),t._v(" 导入导出")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_config_import_export.png",alt:""}})]),t._v(" "),s("p",[t._v("导入导出主要用于在各个环境间同步接口配置,在开发环境配置好后导到测试环境中测试,测试完后导到生产环境进行发布")]),t._v(" "),s("h2",{attrs:{id:"发布-下线和审核"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#发布-下线和审核"}},[t._v("#")]),t._v(" 发布|下线和审核")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_1.png",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_2.png",alt:""}})]),t._v(" "),s("p",[t._v("目前发布|下线申请有以上两个入口。")]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_rollback1.png",alt:""}})]),t._v(" "),s("p",[s("img",{attrs:{src:"/fizz-gateway-community/aggr_release_rollback.png",alt:""}})]),t._v(" "),s("ul",[s("li",[t._v("批量发布:对发布单里的接口进行批量发布")]),t._v(" "),s("li",[t._v("批量回滚:对发布单里的接口进行批量回滚")]),t._v(" "),s("li",[t._v("发布:实时发布到网关")]),t._v(" "),s("li",[t._v("回滚:支持回滚到历史任何一个版本,可在发布历史里指定一个版本进行回滚")]),t._v(" "),s("li",[t._v("下线:从网关删除接口,在后台可以通过发布功能再次上线")])]),t._v(" "),s("h3",{attrs:{id:"发布流程说明"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#发布流程说明"}},[t._v("#")]),t._v(" 发布流程说明")]),t._v(" "),s("p",[t._v("申请发布、审核、发布和下线功能的权限可根据需要灵活分配给不同角色,如:开发人员只能申请发布,上级领导审核,运维或测试人员执行发布、回滚或下线。在开发、测试和预生产环境为了方便开发人员调试也可把申请发布、审核、发布和下线功能都分配给开发人员。")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/docs/assets/js/app.ff845667.js b/docs/assets/js/app.f432ac8d.js similarity index 79% rename from docs/assets/js/app.ff845667.js rename to docs/assets/js/app.f432ac8d.js index d3be132..fe962cd 100644 --- a/docs/assets/js/app.ff845667.js +++ b/docs/assets/js/app.f432ac8d.js @@ -1,4 +1,4 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,u=e[0],c=e[1],s=e[2],l=0,p=[];l0?o(r(t),9007199254740991):0}},function(t,e){var n=Array.isArray;t.exports=n},function(t,e,n){var r=n(31),o=n(23);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(140),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();t.exports=i},function(t,e,n){var r=n(6),o=n(1),i=n(7),a=Object.defineProperty,u={},c=function(t){throw t};t.exports=function(t,e){if(i(u,t))return u[t];e||(e={});var n=[][t],s=!!i(e,"ACCESSORS")&&e.ACCESSORS,f=i(e,0)?e[0]:c,l=i(e,1)?e[1]:void 0;return u[t]=!!n&&!o((function(){if(s&&!r)return!0;var t={length:-1};s?a(t,1,{enumerable:!0,get:c}):t[1]=1,n.call(t,f,l)}))}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){var r=n(110),o=n(3),i=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t])||i(o[t]):r[t]&&r[t][e]||o[t]&&o[t][e]}},function(t,e){t.exports=!1},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,e,n){var r=n(220),o=n(223);t.exports=function(t,e){var n=o(t,e);return r(n)?n:void 0}},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){"use strict";var r=n(0),o=n(29).filter,i=n(51),a=n(17),u=i("filter"),c=a("filter");r({target:"Array",proto:!0,forced:!u||!c},{filter:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,e,n){var r=n(6),o=n(75),i=n(32),a=n(15),u=n(44),c=n(7),s=n(105),f=Object.getOwnPropertyDescriptor;e.f=r?f:function(t,e){if(t=a(t),e=u(e,!0),s)try{return f(t,e)}catch(t){}if(c(t,e))return i(!o.f.call(t,e),t[e])}},function(t,e){t.exports=function(t){return null!=t&&"object"==typeof t}},function(t,e,n){"use strict";var r=n(128).charAt,o=n(28),i=n(111),a=o.set,u=o.getterFor("String Iterator");i(String,"String",(function(t){a(this,{type:"String Iterator",string:String(t),index:0})}),(function(){var t,e=u(this),n=e.string,o=e.index;return o>=n.length?{value:void 0,done:!0}:(t=r(n,o),e.index+=t.length,{value:t,done:!1})}))},function(t,e,n){var r,o,i,a=n(180),u=n(3),c=n(4),s=n(11),f=n(7),l=n(48),p=n(34),d=u.WeakMap;if(a){var h=new d,v=h.get,y=h.has,g=h.set;r=function(t,e){return g.call(h,t,e),e},o=function(t){return v.call(h,t)||{}},i=function(t){return y.call(h,t)}}else{var m=l("state");p[m]=!0,r=function(t,e){return s(t,m,e),e},o=function(t){return f(t,m)?t[m]:{}},i=function(t){return f(t,m)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!c(e)||(n=o(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){var r=n(50),o=n(31),i=n(12),a=n(13),u=n(127),c=[].push,s=function(t){var e=1==t,n=2==t,s=3==t,f=4==t,l=6==t,p=5==t||l;return function(d,h,v,y){for(var g,m,b=i(d),_=o(b),x=r(h,v,3),w=a(_.length),O=0,S=y||u,j=e?S(d,w):n?S(d,0):void 0;w>O;O++)if((p||O in _)&&(m=x(g=_[O],O,b),t))if(e)j[O]=m;else if(m)switch(t){case 3:return!0;case 5:return g;case 6:return O;case 2:c.call(j,g)}else if(f)return!1;return l?-1:s||f?f:j}};t.exports={forEach:s(0),map:s(1),filter:s(2),some:s(3),every:s(4),find:s(5),findIndex:s(6)}},function(t,e,n){var r=n(39),o=n(205),i=n(206),a=r?r.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":a&&a in Object(t)?o(t):i(t)}},function(t,e,n){var r=n(1),o=n(18),i="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==o(t)?i.call(t,""):Object(t)}:Object},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){var r,o=n(5),i=n(179),a=n(73),u=n(34),c=n(109),s=n(70),f=n(48),l=f("IE_PROTO"),p=function(){},d=function(t){return" +

coming soon

上次更新: 2020-9-8 15:3
+ diff --git a/docs/guide/aggregate/configuration.html b/docs/guide/aggregate/configuration.html index d5c8dd9..50bbfb8 100644 --- a/docs/guide/aggregate/configuration.html +++ b/docs/guide/aggregate/configuration.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档
查看源码 -

# 创建服务

# 创建聚合接口

# 配置输入

  • 配置输入的定义包括3部分:请求头、请求体和Query参数
  • 基于JSON Schema规范
  • 自带校验规则
  • 支持自定义脚本实现复杂的逻辑校验

JSON Schema规范,详见:

http://json-schema.org/specification.html

http://json-schema.org/understanding-json-schema/

# 配置校验结果

  • 校验不通过时,Fizz会把校验失败的原因(如:订单ID不能为空)放到上下文的validateMsg字段里
  • 可以自定义返回给调用方的报文格式,如 msgCode, message
  • 支持自定义响应头
  • 支持自定义脚本处理校验结果

# 配置步骤

# 配置步骤的基础信息

# 配置步骤的接口入出参

# 步骤说明

  • 一个聚合接口可包含多个步骤
  • 一个步骤可包含多个请求(即调用多个接口)
  • 步骤间是串联顺序执行
  • 一个步骤内的多个请求并行执行

# 数据转换

支持配置固定值,引用值和脚本

# 固定值

# 引用值

# 脚本

# 星号 *

星号通配符可以接收一个返回对象类型的引用值,返回对象里的字段会合并到目标对象里

样例:userInfo = {"userName": "Fizz", "userID": 1234}

# 优先级与覆盖顺序

固定值 < 引用值 < 脚本 < 星号*

当一个字段配置了多种类型的值时按以上顺序覆盖,星号优先级最高

# 引用值规范

# 获取入参请求头aaa的值
+        

# 创建服务

# 创建聚合接口

# 配置输入

  • 配置输入的定义包括3部分:请求头、请求体和Query参数
  • 基于JSON Schema规范
  • 自带校验规则
  • 支持自定义脚本实现复杂的逻辑校验

JSON Schema规范,详见:

http://json-schema.org/specification.html

http://json-schema.org/understanding-json-schema/

# 配置校验结果

  • 校验不通过时,Fizz会把校验失败的原因(如:订单ID不能为空)放到上下文的validateMsg字段里
  • 可以自定义返回给调用方的报文格式,如 msgCode, message
  • 支持自定义响应头
  • 支持自定义脚本处理校验结果

# 配置步骤

# 配置步骤的基础信息

# 配置步骤的接口入出参

# 步骤说明

  • 一个聚合接口可包含多个步骤
  • 一个步骤可包含多个请求(即调用多个接口)
  • 步骤间是串联顺序执行
  • 一个步骤内的多个请求并行执行

# 数据转换

支持配置固定值,引用值和脚本

# 固定值

# 引用值

# 脚本

# 星号 *

星号通配符可以接收一个返回对象类型的引用值,返回对象里的字段会合并到目标对象里

样例:userInfo = {"userName": "Fizz", "userID": 1234}

# 优先级与覆盖顺序

固定值 < 引用值 < 脚本 < 星号*

当一个字段配置了多种类型的值时按以上顺序覆盖,星号优先级最高

# 引用值规范

# 获取入参请求头aaa的值
 input.request.headers.aaa
 
 # 获取入参请求体bbb字段的值
@@ -292,7 +292,7 @@ step1.result.eee
   }
 };
 
-

# 异常处理

当要在脚本里中止请求时可以通过以下方式来实现

返回一个对象且这个对象包含一个_stopAndResponse等于true的属性,Fizz会终止后续的操作并把这个对象返回给调用方。

# 在线测试

  • 支持在线实时测试
  • 支持测试接口和正式接口隔离
  • 支持返回上下文,可以查看整个执行过程中各个步骤及请求的输入与输出
  • 支持保存历史测试记录

支持调试模式,在测试接口和正式接口均可使用,修改后重新发布可实时生效,在调试模式下会打印请求日志及报文,主要用于排查线上问题

# 导入导出

导入导出主要用于在各个环境间同步接口配置,在开发环境配置好后导到测试环境中测试,测试完后导到生产环境进行发布

# 发布|下线和审核

目前发布|下线申请有以上两个入口。

  • 批量发布:对发布单里的接口进行批量发布
  • 批量回滚:对发布单里的接口进行批量回滚
  • 发布:实时发布到网关
  • 回滚:支持回滚到历史任何一个版本,可在发布历史里指定一个版本进行回滚
  • 下线:从网关删除接口,在后台可以通过发布功能再次上线

# 发布流程说明

申请发布、审核、发布和下线功能的权限可根据需要灵活分配给不同角色,如:开发人员只能申请发布,上级领导审核,运维或测试人员执行发布、回滚或下线。在开发、测试和预生产环境为了方便开发人员调试也可把申请发布、审核、发布和下线功能都分配给开发人员。

上次更新: 2020-9-8 15:3

# 异常处理

当要在脚本里中止请求时可以通过以下方式来实现

返回一个对象且这个对象包含一个_stopAndResponse等于true的属性,Fizz会终止后续的操作并把这个对象返回给调用方。

# 在线测试

  • 支持在线实时测试
  • 支持测试接口和正式接口隔离
  • 支持返回上下文,可以查看整个执行过程中各个步骤及请求的输入与输出
  • 支持保存历史测试记录

支持调试模式,在测试接口和正式接口均可使用,修改后重新发布可实时生效,在调试模式下会打印请求日志及报文,主要用于排查线上问题

# 导入导出

导入导出主要用于在各个环境间同步接口配置,在开发环境配置好后导到测试环境中测试,测试完后导到生产环境进行发布

# 发布|下线和审核

目前发布|下线申请有以上两个入口。

  • 批量发布:对发布单里的接口进行批量发布
  • 批量回滚:对发布单里的接口进行批量回滚
  • 发布:实时发布到网关
  • 回滚:支持回滚到历史任何一个版本,可在发布历史里指定一个版本进行回滚
  • 下线:从网关删除接口,在后台可以通过发布功能再次上线

# 发布流程说明

申请发布、审核、发布和下线功能的权限可根据需要灵活分配给不同角色,如:开发人员只能申请发布,上级领导审核,运维或测试人员执行发布、回滚或下线。在开发、测试和预生产环境为了方便开发人员调试也可把申请发布、审核、发布和下线功能都分配给开发人员。

上次更新: 2020-9-9 17:26
- + diff --git a/docs/guide/aggregate/index.html b/docs/guide/aggregate/index.html index 1502cef..8feb341 100644 --- a/docs/guide/aggregate/index.html +++ b/docs/guide/aggregate/index.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 什么是服务编排

服务编排主要基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口。

特点: 在线API设计、在线测试、快速开发

# 举例说明

订单详情页面需要展示订单信息、商品信息和用户信息。可通过配置的方式生成一个接口先后调用底层微服务的订单详情接口、商品信息接口和用户信息接口,再从这3个接口的返回结果里提取需要的字段返回给前端页面。

# 服务编排架构

# 适用场景

# 前端

1、一个页面调用多个接口时,可以编排好返回聚合结果,提高页面数据的加载速度

2、移动设备计算能力有限,可以把数据计算或业务处理逻辑放到服务端完成,加快页面响应

# 后端

1、替换应用层的聚合接口,减少应用层的胶水代码

2、快速生成透传数据类型的接口

3、数据转换和映射

上次更新: 2020-9-8 15:3
- + diff --git a/docs/guide/aggregate/overview.html b/docs/guide/aggregate/overview.html index 09e4acd..58b5ea2 100644 --- a/docs/guide/aggregate/overview.html +++ b/docs/guide/aggregate/overview.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

1.创建服务

此服务是一个分组的概念,可以包含多个聚合接口,类似于微服务体系里的服务

2.创建服务编排接口

3.开通网关白名单和配置访问策略和插件

4.测试服务编排接口

5.发布接口

界面总览

上次更新: 2020-9-8 15:3
- + diff --git a/docs/guide/benchmark/index.html b/docs/guide/benchmark/index.html index e592f88..7847dc8 100644 --- a/docs/guide/benchmark/index.html +++ b/docs/guide/benchmark/index.html @@ -7,7 +7,7 @@ - + @@ -23,14 +23,14 @@ 使用文档 查看源码 -

# 基准测试结果

我们将Fizz与Spring官方spring-cloud-gateway进行比较,使用相同的环境和条件,测试对象均为单个节点。

产品 QPS 90% Latency(ms)
直接访问后端服务 9087.46 10.76
fizz-gateway 5927.13 19.86
spring-cloud-gateway 5044.04 22.91

# 基准测试详情

# 硬件环境

后端服务所在服务器:

4核8G内存

Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4

Linux version 3.10.0-327.el7.x86_64

节点所在服务器:

4核8G内存

Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4

Linux version 3.10.0-327.el7.x86_64

压测程序所在服务器:

4核8G内存

Intel(R) Xeon(R) CPU X5675 @ 3.07GHz * 4

Linux version 3.10.0-327.el7.x86_64

# 压测工具

压测软件:wrk

并发连接: 100

# 压测结果截图

上次更新: 2020-9-9 17:26
- + diff --git a/docs/guide/index.html b/docs/guide/index.html index b2c35b3..55c92fc 100644 --- a/docs/guide/index.html +++ b/docs/guide/index.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -
上次更新: 2020-7-31 17:12
- +
上次更新: 2020-7-31 17:12
+ diff --git a/docs/guide/installation/index.html b/docs/guide/installation/index.html new file mode 100644 index 0000000..91c7e60 --- /dev/null +++ b/docs/guide/installation/index.html @@ -0,0 +1,106 @@ + + + + + + 安装 | Fizz Gateway + + + + + + + +

# 安装依赖

安装以下依赖软件:

  • Redis 2.8或以上版本
  • MySQL 5.7或以上版本
  • Apollo配置中心 (可选)
  • Eureka服务注册中心

# 安装MySQL

  • 操作系统 CentOS 6.5
  • MySQL 5.7.30
  1. 下载MySQL
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar
+
  1. 解压
tar -xvf mysql-5.7.30-1.el6.x86_64.rpm-bundle.tar
+
  1. 安装
sudo yum install mysql-community-{server,client,common,libs}-*
+
  1. 启动
sudo service mysqld start
+

启动成功会显示以下信息:

[root@localhost ~]# sudo service mysqld start
+Initializing MySQL database:                               [  OK  ]
+Starting mysqld:                                           [  OK  ]
+
  1. 初始密码
sudo grep 'temporary password' /var/log/mysqld.log
+
  1. 使用初始密码登录
mysql -uroot -p
+
  1. 修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';
+
  1. 退出登录
quit
+

# 安装Redis 6.0.8

  1. 下载解压并编译
$ wget http://download.redis.io/releases/redis-6.0.8.tar.gz
+$ tar xzf redis-6.0.8.tar.gz
+$ cd redis-6.0.8
+$ make
+
  1. 启动redis

运行编译后的文件:

$ src/redis-server
+
  1. 客户端连接
$ src/redis-cli
+redis> set foo bar
+OK
+redis> get foo
+"bar"
+

# 安装Apollo配置中心

说明: apollo是可选组件,如果不使用apollo可使用本地配置文件。

安装步骤详见apollo官方文档:

# 安装Eureka服务注册中心

环境要求:

  • JDK 1.8 或以上版本
  • Tomcat 6.0.10 或以上版本 (如使用spring cloud已内置)
  1. 安装JDK 1.8

1)下载JDK,如: jdk-8u192-linux-x64.tar.gz

tar -zxvf jdk-8u192-linux-x64.tar.gz
+mv jdk1.8.0_192 /usr/local/
+
+

2)设置JDK环境变量,将下面内容追回到/etc/profile文件后面

JAVA_HOME=/usr/local/jdk/jdk1.8.0_192
+JRE_HOME=$JAVA_HOME/jre
+PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
+CLASSPATH=:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/dt.jar
+export JAVA_HOME JRE_HOME PATH CLASSPATH
+
+

3)执行以下命令全环境变量生效:

source /etc/profile
+
+

4)查看是否安装成功

java -version
+
  1. 安装eureka

1)使用IDE创建一个spring boot项目,如:sc-eureka-server

pom.xml:

<dependency>
+    <groupId>org.springframework.cloud</groupId>
+    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
+</dependency>
+

在启动类上添加@EnableEurekaServer注解来启用Euerka注册中心功能:

@SpringBootApplication
+@EnableEurekaServer
+public class ScEurekaServerApplication {
+
+	public static void main(String[] args) {
+		SpringApplication.run(ScEurekaServerApplication.class, args);
+	}
+
+}
+

application.properties配置文件:

spring.application.name=sc-eureka-server
+
+server.port=8761
+eureka.instance.hostname=localhost
+eureka.client.registerWithEureka=false
+eureka.client.fetchRegistry=false
+eureka.server.enableSelfPreservation=false
+

2) maven构建并运行sc-eureka-server应用, 启动后访问地址http://localhost:8761/可以看到Eureka注册中心的界面

3)把target/sc-eureka-server-1.0.0.jar传到linux服务器上运行. (仅以单机部署为例)

nohub java -jar sc-eureka-server-1.0.0.jar & 
+

4)eureka客户端的注册地址为:http://localhost:8761/eureka/ (替换localhost为服务器的IP)

eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/
+

# 安装Fizz

# 管理后台

从github的releases(https://github.com/wehotel/fizz-gateway-community/releases)下载 fizz-manager-professional 和 fizz-admin-professional 的安装包

  • 管理后台服务端(fizz-manager-professional)
  1. 首次安装执行fizz-manager-professional-1.0.0-mysql.sql数据库脚本
  2. application-prod.ymlboot.shfizz-manager-professional-1.0.0.jar拷贝到/data/webapps/fizz-manager-professional目录下
  3. 修改application-prod.yml文件,将相关配置修改成部署环境的配置
  4. 修改boot.sh文件,将RUN_CMD变量值修改成部署环境的JAVA实际路径
  5. 执行 chmod +x boot.sh 命令给boot.sh增加执行权限
  6. 执行 ./boot.sh start 命令启动服务,支持 start/stop/restart/status命令
  7. 服务启动后访问 http://IP:8000/fizz-manager (将IP替换成服务部署机器IP地址),使用超级管理员账户admin密码Aa123!登录
  • 管理后台前端(fizz-admin-professional)

zip资源包解压后,取文件夹【fizzAdmin】放置于服务器静态数据存放目录 如:/home/data/

nginx配置

server {
+  listen 9000;
+  server_name localhost:9000;
+  location / {
+    root /home/data/fizzAdmin;
+  }
+  location ^~ /api {
+    rewrite ^/api/(.*) /$1 break;
+    proxy_pass http://127.0.0.1:8000;
+  }
+}
+
+# 注:root中地址需与资源包存放目录路径一致
+# 注:http://127.0.0.1:8000 为管理后台(fizz-manager-professional)的访问地址
+

访问地址

【资源部署服务器IP + 端口号】如:http://127.0.0.1:9000/

(端口号与nginx配置端口号一致)

# fizz-gateway-community社区版

说明:如果使用apollo配置中心,可把application.yml文件内容迁到配置中心(apollo上应用名为:fizz-gateway);使用不使用apollo可去掉下面启动命令里的apollo参数。

脚本启动:

  1. 下载fizz-gateway-community的最新代码,修改application.yml配置文件里eureka、redis的配置,使用maven构建好并把构建好的fizz-gateway-community-1.0.0.jar和boot.sh放同一目录
  2. 修改boot.sh脚本的apollo连接,JVM内存配置,
  3. 执行 ./boot.sh start 命令启动服务,支持 start/stop/restart/status命令

IDE启动:

  1. 本地clone仓库上的最新代码
  2. 将项目fizz-gateway导入IDE
  3. 导入完成后设置项目启动配置及修改application.yml配置文件里eureka、redis的配置,在VM选项中加入-Denv=dev -Dapollo.meta=http://localhost:66(Apollo配置中心地址)

jar启动:

  1. 本地clone仓库上的最新代码,修改application.yml配置文件里eureka、redis的配置
  2. 在项目根目录fizz-gateway-community下执行Maven命令mvn clean package -DskipTests=true打包
  3. 进入target目录,使用命令java -jar -Denv=DEV -Dapollo.meta=http://localhost:66 fizz-gateway-community-1.0.0.jar启动服务

网关访问地址格式:

http://127.0.0.1:8600/proxy/[服务名]/[API Path]

上次更新: 2020-9-21 13:6
+ + + diff --git a/docs/guide/intro/index.html b/docs/guide/intro/index.html index 96d0cd2..f690b82 100644 --- a/docs/guide/intro/index.html +++ b/docs/guide/intro/index.html @@ -7,7 +7,7 @@ - + @@ -23,11 +23,11 @@ 使用文档 查看源码 -

# 什么是Fizz网关

A Managerment API Gateway in Java . Fizz Gateway 是一个基于 Java开发的微服务网关,能够实现热服务编排、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。

# Fizz的设计

# 产品特性

  • 集群管理:Fizz网关节点是无状态的,配置信息自动同步,支持节点水平拓展和多集群部署。
  • 服务编排:支持热服务编排能力,支持前后端编码,随时随地更新API。
  • 负载均衡:支持round-robin负载均衡。
  • 服务发现:支持从Eureka注册中心发现后端服务器。
  • 配置中心:支持接入apollo配置中心。
  • HTTP反向代理:隐藏真实后端服务,支持 Rest API反向代理。
  • 访问策略:支持不同策略访问不同的API、配置不同的鉴权等。
  • IP黑白名单:支持配置IP黑白名单。
  • 自定义插件:强大的插件机制支持自由扩展。
  • 可扩展:简单易用的插件机制方便扩展功能。
  • 高性能:性能在众多网关之中表现优异。
  • 版本控制:支持操作的发布和多次回滚。
  • 管理后台:通过管理后台界面对网关集群进行各项配置。
上次更新: 2020-9-8 15:3
- + diff --git a/docs/guide/plugin/index.html b/docs/guide/plugin/index.html index 461de8c..f3a4714 100644 --- a/docs/guide/plugin/index.html +++ b/docs/guide/plugin/index.html @@ -7,7 +7,7 @@ - + @@ -23,7 +23,7 @@ 使用文档 查看源码 -

# 概述

当需要在gateway中加入自定义的逻辑时,可通过fizz的插件机制实现,插件:
+

# 概述

当需要在gateway中加入自定义的逻辑时,可通过fizz的插件机制实现,插件:
1、类似spring的WebFilter,是fizz内部的WebFilter,由fizz调度;
2、对不同的请求,可配置不同的上下文参数,可通过manager完成配置;
3、若有多个插件,当前插件可获取前面插件的执行结果。

插件的开发和应用,分gateway开发、manager配置两部分,下面以一个例子,依次介绍。

# gateway开发

    实现
@@ -111,7 +111,7 @@
 

2、应用插件

如对

接口应用插件:

上面配置的"打印请求id日志"、"添加fizzRsv请求头",对应

public Mono<Void> doFilter(ServerWebExchange exchange, Map<String, Object> config, String fixedConfig) 
-

中config的logReqId和appendFizzRsv key。

上次更新: 2020-9-8 15:3

中config的logReqId和appendFizzRsv key。

上次更新: 2020-9-9 17:26
- + diff --git a/docs/guide/proxy/index.html b/docs/guide/proxy/index.html index ae2f52c..c41545d 100644 --- a/docs/guide/proxy/index.html +++ b/docs/guide/proxy/index.html @@ -7,7 +7,7 @@ - + @@ -23,15 +23,15 @@ 使用文档 查看源码 -

# 路由转发介绍

路由转发也叫反向代理,为内部微服务提供统一的对外入口。支持以下功能:

  • 支持服务注册与发现
  • 支持负载均衡
  • 支持黑白名单机制
  • 支持配置插件

# 接入路由转发

  • 前提条件:接入Eureka注册中心
  • 开通白名单,接入注册中心的服务默认不对公网开放 (白名单在配置文件里配置serviceWhiteList)
  • 配置访问权限 (管理后台-接口代理-API查询)
上次更新: 2020-9-8 15:3
- + diff --git a/docs/index.html b/docs/index.html index 7978dae..c489542 100644 --- a/docs/index.html +++ b/docs/index.html @@ -7,7 +7,7 @@ - + @@ -32,6 +32,6 @@

智能路由

支持服务注册与发现,支持负载均衡,支持配置插件和黑白名单。

服务编排

基于现有的业务微服务通过在线配置的方式快速的生成一个聚合接口。减少中间层胶水代码以及降低编码投入

插件机制

强大的插件系统,内置通用常用插件,同时支持自定义插件开发。

- +