脚本
脚本的作用: 开发者可以利用 Groovy 脚本来自定义一些逻辑,从而使得 api 更加灵活,例如对参数进行动态加密签名,放入 header,而不是直接写死
实现技术: Groovy
看到 Groovy 不熟悉请不要慌,语法和 Java 几乎一致(Java 就是香,手动一个狗头)
脚本流程图
测试项目
https://github.com/kings1990/fast-request-samples
案例
import cn.hutool.core.util.CharsetUtil
import cn.hutool.core.util.StrUtil
import cn.hutool.crypto.digest.DigestUtil
String body = StrUtil.str(request.bodyBytes(), CharsetUtil.CHARSET_UTF_8)
body = "xxx"//just for test
String sign = DigestUtil.md5Hex(body)
request.header("sign",sign)
内置变量
注意
开发者在自己编辑的脚本中,应该注意内置变量已被声明,而不是再去 new 一个 Request 或者 Response 对象,对象名是 request 或者 response,否则可能会造成不可预期的错误
插件底层采用hutool的cn.hutool.http.HttpRequest
来实现请求的发送
2022.2.3️
request- 作用: 包含了请求相关的信息,例如 url、header、body、各种参数
- 类型: cn.hutool.http.HttpRequest
可以通过修改 request 值来动态调整参数
2022.2.3️
response- 作用: 包含了请求响应的信息
- 类型: cn.hutool.http.HttpResponse
可以通过 response 值来获取响应的结果
2022.2.3️
rfr- 作用: 包含了跟插件交互相关的一些属性,用于后期定制
2022.2.3️
rfr.projectHeader作用: 包含了项目级别头,可以通过修改来动态往UI里面设置值
类型: java.util.LinkedHashMap
2022.2.3️
rfr.moduleHeader作用: 包含了模块级别头,可以通过修改来动态往UI里面设置值
类型: java.util.LinkedHashMap
2022.2.5️
rfr.currentProjectName作用: 当前下拉框选择的项目名
类型: java.lang.String
2022.2.5️
rfr.currentEnvName作用: 当前下拉框选择的环境名称
类型: java.lang.String
2022.3.1️
rfr.currentDomain作用: 获取当前作用的域名
类型: java.lang.String
2023.1.3️
rfr.currentModuleName作用: 获取当前API的模块名
类型: java.lang.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 就是香,已经加入许多工具类)
下载 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级别
2022.2.5
ConsoleConsole 帮助开发者打印一些你想要的信息
console.info("info")
console.print("print info")
console.warn("warn")
console.success("success")
console.error("error")
Demo
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)
}
注意点
- Groovy 脚本对 ; 不敏感,Java 用;作为语句代码的结束,Groovy 用换行表示一句代码的结束
- 内置变量已被申明,例如 Demo2 中需要额外新建一个请求,变量命名需要注意不能与内置变量相同
技能点
为了得到程序方法提示,如果需要利用内置变量 request 和 response,可以在脚本上先声明HttpRequest request或者HttpResponse response
变量,写完脚本后再删除
脚本投稿 🌟
为了将脚本做的更加强大,评论区开放社区脚本投递,将强大脚本通过下方留言 的形式上报,让更多人使用你开发的脚本,同时如果使用者觉得社区开发者投递的脚本不错,请给该脚本 点赞,投票高且实用的脚本, 将有机会直接上墙到插件页面,从而让你的主页获得更高的关注度🔥
- 格式
/**
* 作者:Kings
* 主页:https://github.com/kings1990
* 功能:xxxxx
*/
//脚本内容
....