跳至主要內容

脚本


脚本的作用: 开发者可以利用 Groovy 脚本来自定义一些逻辑,从而使得 api 更加灵活,例如对参数进行动态加密签名,放入 header,而不是直接写死

实现技术: Groovyopen in new window

看到 Groovy 不熟悉请不要慌,语法和 Java 几乎一致(Java 就是香,手动一个狗头)

脚本流程图

测试项目

https://github.com/kings1990/fast-request-samplesopen in new window

内置变量

注意

开发者在自己编辑的脚本中,应该注意内置变量已被声明,而不是再去 new 一个 Request 或者 Response 对象,对象名是 request 或者 response,否则可能会造成不可预期的错误

插件底层采用hutoolopen in new windowcn.hutool.http.HttpRequest来实现请求的发送

request 2022.2.3️

  • 作用: 包含了请求相关的信息,例如 url、header、body、各种参数
  • 类型: cn.hutool.http.HttpRequest

可以通过修改 request 值来动态调整参数

response 2022.2.3️

  • 作用: 包含了请求响应的信息
  • 类型: cn.hutool.http.HttpResponse

可以通过 response 值来获取响应的结果

rfr 2022.2.3️

  • 作用: 包含了跟插件交互相关的一些属性,用于后期定制

rfr.projectHeader 2022.2.3️

作用: 包含了项目级别头,可以通过修改来动态往UI里面设置值
类型: java.util.LinkedHashMap<String,String>

rfr.moduleHeader 2022.2.3️

作用: 包含了模块级别头,可以通过修改来动态往UI里面设置值
类型: java.util.LinkedHashMap<String,String>

rfr.currentProjectName 2022.2.5️

作用: 当前下拉框选择的项目名
类型: java.lang.String

rfr.currentEnvName 2022.2.5️

作用: 当前下拉框选择的环境名称
类型: java.lang.String

rfr.currentDomain 2022.3.1️

作用: 当前作用的域名
类型: java.lang.String

rfr.currentModuleName 2023.1.3️

作用: 当前API的模块名
类型: java.lang.String

rfr.environment 2023.1.8

作用: 当前环境的变量
类型: java.util.LinkedHashMap<String,String>

引入第三方 Jar

内置的 Jar

com.alibaba:fastjson:1.2.78
cn.hutool:hutool-all:5.8.5
com.google.guava:guava:30.1.1-jre

Jar 的版本会不定期更新,如果发现 bug 请联系作者要求作者升级

开发者可以利用以上 3 个 Jar 所提供的工具方法,直接在脚本中引用,不需要再依赖第三方的 Jar(hutool 就是香,已经加入许多工具类)

前往Demo查看如何获得Code completionopen in new window功能

下载 jar 可能会需要花费额外的时间

@Grab("org.apache.commons:commons-lang3:3.12.0")
import org.apache.commons.lang3.StringUtils

String debug = request.header("debug")
if(StringUtils.isNotBlank(debug)){
    //some logic
}
//注意此处的file:前缀
this.class.classLoader.addURL(new URL("file:/path/to/jar"))
def StringUtils = Class.forName("org.apache.commons.lang3.StringUtils").getDeclaredConstructor().newInstance()

String debug = request.header("debug")//获取header
if(StringUtils.isNotBlank(debug)){
    //some logic
}

作用范围与顺序

分为项目级别单API级别,项目全局作用需要点击 项目级别全局参数支持 进行配置

项目级别将作用项目中所有的 API,单 API 级别只作用于单个 API。

执行顺序:项目级别->单API级别

scriptScope

Console 2022.2.5

Console 帮助开发者打印一些你想要的信息

console.info("info")
console.print("print info")
console.warn("warn")
console.success("success")
console.error("error")

console

Demo

Code completion支持

在项目中加入如下依赖(如果没有),即可在编辑器脚本中处理针对插件核心类的Code completionopen in new window功能(快速导入类(import)、得到方法提示等操作)

Maven
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-http</artifactId>
        <version>5.8.12</version>
    </dependency>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>30.1.1-jre</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.78</version>
    </dependency>

1. 签名参数

在你的本地新建一个 xxx.groovy 文件,粘贴以下代码,适当修改后,能保证本地可以正常运行,再把代码粘贴到脚本中

  • 注意最终脚本需要删除这行代码

HttpRequest request = HttpUtil.createPost("http://localhost:8081/book/add")

import cn.hutool.core.util.CharsetUtil
import cn.hutool.core.util.StrUtil
import cn.hutool.crypto.digest.DigestUtil
import cn.hutool.http.HttpRequest
import cn.hutool.http.HttpUtil

//注意、注意、注意,脚本中需要删除此行代码
HttpRequest request = HttpUtil.createPost("http://localhost:8081/book/add")

//脚本逻辑正式开始
String body = StrUtil.str(request.bodyBytes(), CharsetUtil.CHARSET_UTF_8)
body = "xxxx"//just for test
String sign = DigestUtil.md5Hex(body)
request.header("sign",sign)

2. 利用某一个请求的响应充当请求的 Header 参数

注意获取 token 的逻辑得结合接口返回的数据结构来处理。例如返回

{
  "success": true,
  "code": 200,
  "data": {
    "token": "xxxxx"
  }
}

则需要这么写 JSON.parseObject(myResponse.body()).getJSONObject("data").getString("token")

import cn.hutool.core.util.CharsetUtil
import cn.hutool.core.util.StrUtil
import cn.hutool.crypto.digest.DigestUtil
import cn.hutool.http.HttpRequest
import cn.hutool.http.HttpResponse
import cn.hutool.http.HttpUtil
import com.alibaba.fastjson.JSON

HttpRequest myRequest = HttpUtil.createPost("http://localhost:8081/api/v1.0/login")
HttpResponse myResponse = myRequest.execute()
if(myResponse.isOk()){
    String token = JSON.parseObject(myResponse.body()).getString("token")
    request.header("token",token)
}

3. 设置一个Environment变量

假定响应报文格式

{
  "success": true,
  "code": 200,
  "data": {
    "token": "xxxxx"
  }
}

在后置脚本中植入以下代码

import cn.hutool.core.util.CharsetUtil
import cn.hutool.core.util.StrUtil
import cn.hutool.crypto.digest.DigestUtil
import cn.hutool.http.HttpRequest
import cn.hutool.http.HttpResponse
import cn.hutool.http.HttpUtil
import com.alibaba.fastjson.JSON

HttpRequest myRequest = HttpUtil.createPost("http://localhost:8081/api/v1.0/login")
HttpResponse myResponse = myRequest.execute()
if(myResponse.isOk()){
    String token = JSON.parseObject(myResponse.body()).getJSONObject("data").getString("token")
    rfr.environment.put("token",token)
}

注意点

  • Groovy 脚本对 ; 不敏感,Java 用;作为语句代码的结束,Groovy 用换行表示一句代码的结束
  • 内置变量已被申明,例如 Demo2 中需要额外新建一个请求,变量命名需要注意不能与内置变量相同

技能点

为了得到程序方法提示,如果需要利用内置变量 request 和 response,可以在脚本上先声明HttpRequest request或者HttpResponse response变量,写完脚本后再删除

脚本投稿 🌟

为了将脚本做的更加强大,评论区开放社区脚本投递,欢迎将强大脚本通过下方留言 的形式上报,让更多人使用你开发的脚本

  • 格式
/**
 * 作者:Kings
 * 主页:https://github.com/kings1990
 * 功能:xxxxx
 */

//脚本内容
....

scriptDonate

上次编辑于: