PageSourceSearch

https://api-buddy.cn/assets/script-CmXhpAIZ.js

js api-buddy.cn collected 2026-10-03 23:15:11 UTC 36,336 bytes, 85 lines download raw bytes

1import{c as e,f as t,h as n,i as r,l as i,m as a,o,s,t as c}from"./app-0AW3q8hk.js";import"./addLibrary-6EU7Gjv9.js";import"./console-CJzKnOMf.js";var l=JSON.parse(`{"path":"/guide/script.html","title":"脚本","lang":"zh-CN","frontmatter":{"title":"脚本","icon":"code-box-fill","headerDepth":4,"toc":{"levels":[2,6]},"description":"脚本的作用: 开发者可以利用 Groovy 脚本来自定义一些逻辑,从而使得 api 更加灵活,例如对参数进行动态加密签名,放入 header,而不是直接写死。脚本包括前置脚本和后置脚本。 实现技术: Groovy 看到 Groovy 不熟悉请不要慌,语法和 Java 几乎一致(Java 就是香,手动一个狗头) 脚本流程图 前置脚本 在执行请求之前执行,...","head":[["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"脚本\\",\\"image\\":[\\"https://api-buddy.com/img/script.svg\\",\\"https://api-buddy.com/img/script.png\\",\\"https://api-buddy.com/img/2022.2.5/console.png\\",\\"https://api-buddy.com/img/2024.1.5/addLibrary.png\\",\\"https://api-buddy.com/img/2022.2.3/scriptDonate.png\\"],\\"dateModified\\":\\"2026-08-03T12:13:12.000Z\\",\\"author\\":[]}"],["meta",{"property":"og:url","content":"https://api-buddy.com/guide/script.html"}],["meta",{"property":"og:site_name","content":"Fast Request"}],["meta",{"property":"og:title","content":"脚本"}],["meta",{"property":"og:description","content":"脚本的作用: 开发者可以利用 Groovy 脚本来自定义一些逻辑,从而使得 api 更加灵活,例如对参数进行动态加密签名,放入 header,而不是直接写死。脚本包括前置脚本和后置脚本。 实现技术: Groovy 看到 Groovy 不熟悉请不要慌,语法和 Java 几乎一致(Java 就是香,手动一个狗头) 脚本流程图 前置脚本 在执行请求之前执行,..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://api-buddy.com/img/script.svg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2026-08-03T12:13:12.000Z"}],["meta",{"property":"article:modified_time","content":"2026-08-03T12:13:12.000Z"}],["link",{"rel":"alternate","hreflang":"en-us","href":"https://api-buddy.com/en/guide/script.html"}]]},"git":{"createdTime":1785368971000,"updatedTime":1785759192000,"contributors":[{"name":"kings1990","username":"","email":"[email protected]","commits":2},{"name":"kings","username":"","email":"[email protected]","commits":2}]},"readingTime":{"minutes":5.49,"words":1647},"filePathRelative":"guide/script.md","autoDesc":true}`),u={name:`script.md`},d={id:`request`,tabindex:`-1`},f={class:`header-anchor`,href:`#request`},p={id:`response`,tabindex:`-1`},m={class:`header-anchor`,href:`#response`},h={id:`rfr`,tabindex:`-1`},g={class:`header-anchor`,href:`#rfr`},_={id:`rfr-request`,tabindex:`-1`},v={class:`header-anchor`,href:`#rfr-request`},y={id:`rfr-response`,tabindex:`-1`},b={class:`header-anchor`,href:`#rfr-response`},x={id:`rfr-projectheader`,tabindex:`-1`},S={class:`header-anchor`,href:`#rfr-projectheader`},C={id:`rfr-apiheader`,tabindex:`-1`},w={class:`header-anchor`,href:`#rfr-apiheader`},T={id:`rfr-currentprojectname`,tabindex:`-1`},E={class:`header-anchor`,href:`#rfr-currentprojectname`},D={id:`rfr-currentenvname`,tabindex:`-1`},O={class:`header-anchor`,href:`#rfr-currentenvname`},k={id:`rfr-currentdomain`,tabindex:`-1`},A={class:`header-anchor`,href:`#rfr-currentdomain`},j={id:`rfr-currentmodulename`,tabindex:`-1`},M={class:`header-anchor`,href:`#rfr-currentmodulename`},N={id:`rfr-environment`,tabindex:`-1`},P={class:`header-anchor`,href:`#rfr-environment`},F={id:`console`,tabindex:`-1`},I={class:`header-anchor`,href:`#console`},L={id:`_4-直接引用项目中的类`,tabindex:`-1`},R={class:`header-anchor`,href:`#_4-直接引用项目中的类`};function z(c,l,u,z,B,V){let H=a(`Badge`),U=a(`ColorIcon`),W=a(`RouteLink`);return t(),o(`div`,null,[l[23]||=s(`<p><strong>脚本的作用</strong>: 开发者可以利用 Groovy 脚本来自定义一些逻辑,从而使得 api 更加灵活,例如对参数进行动态加密签名,放入 header,而不是直接写死。脚本包括前置脚本和后置脚本。</p><p><strong>实现技术</strong>: <a href="https://groovy-lang.org/" target="_blank" rel="noopener noreferrer">Groovy</a></p><p>看到 Groovy 不熟悉请<mark>不要慌</mark>,语法和 Java 几乎一致(Java 就是香,手动一个狗头)</p><h2 id="脚本流程图" tabindex="-1"><a class="header-anchor" href="#脚本流程图"><span>脚本流程图</span></a></h2><p><img src="/img/script.svg" alt="" loading="lazy"></p><h2 id="前置脚本" tabindex="-1"><a class="header-anchor" href="#前置脚本"><span>前置脚本</span></a></h2><p>在执行请求之前执行,可以在这里对请求的参数进行处理,例如加密、签名、动态修改 header 等等。</p><h2 id="后置脚本" tabindex="-1"><a class="header-anchor" href="#后置脚本"><span>后置脚本</span></a></h2><p>在请求执行完成之后执行,可以在这里对响应的结果进行处理,例如提取 token、动态修改 header 等等。</p><h2 id="执行优先级" tabindex="-1"><a class="header-anchor" href="#执行优先级"><span>执行优先级</span></a></h2><p>项目级别前置脚本 &gt; 单 API 前置脚本 -&gt; 项目级别后置脚本 -&gt; 单 API 后置脚本</p><h2 id="测试项目" tabindex="-1"><a class="header-anchor" href="#测试项目"><span>测试项目</span></a></h2><p><a href="https://github.com/kings1990/fast-request-samples" target="_blank" rel="noopener noreferrer">https://github.com/kings1990/fast-request-samples</a></p><h2 id="内置变量" tabindex="-1"><a class="header-anchor" href="#内置变量"><span>内置变量</span></a></h2><div class="hint-container caution"><p class="hint-container-title">注意</p><p>开发者在自己编辑的脚本中,应该注意内置变量已被声明,而不是再去 new 一个 Request 或者 Response 对象,对象名是 request 或者 response,否则可能会造成不可预期的错误</p></div><p>插件底层采用<a href="https://hutool.cn/" target="_blank" rel="noopener noreferrer">hutool</a>的<code>cn.hutool.http.HttpRequest</code>来实现请求的发送</p>`,16),r(`h3`,d,[r(`a`,f,[r(`span`,null,[l[0]||=e(`request `,-1),i(H,{text:`2022.2.3️`,type:`tip`}),l[1]||=e(),i(H,{text:`废弃️`,type:`danger`})])])]),l[24]||=r(`p`,null,[e(`废弃: `),r(`strong`,null,[e(`使用 `),r(`code`,null,`rfr.request`),e(` 代替`)])],-1),l[25]||=r(`ul`,null,[r(`li`,null,`作用: 包含了请求相关的信息,例如 url、header、body、各种参数`),r(`li`,null,`类型: cn.hutool.http.HttpRequest`)],-1),l[26]||=r(`p`,null,`可以通过修改 request 值来动态调整参数`,-1),r(`h3`,p,[r(`a`,m,[r(`span`,null,[l[2]||=e(`response `,-1),i(H,{text:`2022.2.3️`,type:`tip`}),l[3]||=e(),i(H,{text:`废弃️`,type:`danger`})])])]),l[27]||=r(`p`,null,[e(`废弃: `),r(`strong`,null,[e(`使用 `),r(`code`,null,`rfr.response`),e(` 代替`)])],-1),l[28]||=r(`ul`,null,[r(`li`,null,`作用: 包含了请求响应的信息`),r(`li`,null,`类型: cn.hutool.http.HttpResponse`)],-1),l[29]||=r(`p`,null,`可以通过 response 值来获取响应的结果`,-1),r(`h3`,h,[r(`a`,g,[r(`span`,null,[l[4]||=e(`rfr `,-1),i(H,{text:`2022.2.3️`,type:`tip`})])])]),l[30]||=r(`ul`,null,[r(`li`,null,`作用: 包含了跟插件交互相关的一些属性,用于后期定制`)],-1),r(`h4`,_,[r(`a`,v,[r(`span`,null,[l[5]||=e(`rfr.request `,-1),i(H,{text:`2024.1.7️`,type:`tip`})])])]),l[31]||=r(`ul`,null,[r(`li`,null,`作用: 包含了请求相关的信息,例如 url、header、body、各种参数`),r(`li`,null,`类型: cn.hutool.http.HttpRequest`)],-1),l[32]||=r(`p`,null,`可以通过修改 request 值来动态调整参数`,-1),r(`h4`,y,[r(`a`,b,[r(`span`,null,[l[6]||=e(`rfr.response `,-1),i(H,{text:`2024.1.7️`,type:`tip`})])])]),l[33]||=r(`ul`,null,[r(`li`,null,`作用: 包含了请求响应的信息`),r(`li`,null,`类型: cn.hutool.http.HttpResponse`)],-1),r(`h4`,x,[r(`a`,S,[r(`span`,null,[l[7]||=e(`rfr.projectHeader `,-1),i(H,{text:`2022.2.3️`,type:`tip`})])])]),l[34]||=s(`<div class="language-" data-highlighter="shiki" data-ext="" style="background-color:#282c34;
1color:#abb2bf;"><pre class="shiki one-dark-pro vp-code"><code class="language-"><span class="line"><span>作用: 包含了项目级别头,可以通过修改来动态往UI里面设置值</span></span>
2<span class="line"><span>类型: java.util.LinkedHashMap&lt;String,String&gt;</span></span></code></pre></div>`,1),r(`h4`,C,[r(`a`,w,[r(`span`,null,[l[8]||=e(`rfr.apiHeader `,-1),i(H,{text:`2022.2.3️`,type:`tip`})])])]),l[35]||=s(`<div class="language-" data-highlighter="shiki" data-ext="" style="background-color:#282c34;color:#abb2bf;"><pre class="shiki one-dark-pro vp-code"><code class="language-"><span class="line"><span>作用: 包含了模块级别头,可以通过修改来动态往UI里面设置值</span></span>
3<span class="line"><span>类型: java.util.LinkedHashMap&lt;String,String&gt;</span></span></code></pre></div>`,1),r(`h4`,T,[r(`a`,E,[r(`span`,null,[l[9]||=e(`rfr.currentProjectName `,-1),i(H,{text:`2022.2.5️`,type:`tip`})])])]),l[36]||=s(`<div class="language-" data-highlighter="shiki" data-ext="" style="background-color:#282c34;color:#abb2bf;"><pre class="shiki one-dark-pro vp-code"><code class="language-"><span class="line"><span>作用: 当前下拉框选择的项目名</span></span>
4<span class="line"><span>类型: java.lang.String</span></span></code></pre></div>`,1),r(`h4`,D,[r(`a`,O,[r(`span`,null,[l[10]||=e(`rfr.currentEnvName `,-1),i(H,{text:`2022.2.5️`,type:`tip`})])])]),l[37]||=s(`<div class="language-" data-highlighter="shiki" data-ext="" style="background-color:#282c34;color:#abb2bf;"><pre class="shiki one-dark-pro vp-code"><code class="language-"><span class="line"><span>作用: 当前下拉框选择的环境名称</span></span>
5<span class="line"><span>类型: java.lang.String</span></span></code></pre></div>`,1),r(`h4`,k,[r(`a`,A,[r(`span`,null,[l[11]||=e(`rfr.currentDomain `,-1),i(H,{text:`2022.3.1️`,type:`tip`})])])]),l[38]||=s(`<div class="language-" data-highlighter="shiki" data-ext="" style="background-color:#282c34;color:#abb2bf;"><pre class="shiki one-dark-pro vp-code"><code class="language-"><span class="line"><span>作用: 当前作用的域名</span></span>
6<span class="line"><span>类型: java.lang.String</span></span></code></pre></div>`,1),r(`h4`,j,[r(`a`,M,[r(`span`,null,[l[12]||=e(`rfr.currentModuleName `,-1),i(H,{text:`2023.1.3️`,type:`tip`})])])]),l[39]||=s(`<div class="language-" data-highlighter="shiki" data-ext="" style="background-color:#282c34;color:#abb2bf;"><pre class="shiki one-dark-pro vp-code"><code class="language-"><span class="line"><span>作用: 当前API的模块名</span></span>
7<span class="line"><span>类型: java.lang.String</span></span></code></pre></div>`,1),r(`h4`,N,[r(`a`,P,[r(`span`,null,[l[13]||=e(`rfr.environment `,-1),i(H,{text:`2023.1.8`,type:`tip`})])])]),l[40]||=s(`<div class="language-" data-highlighter="shiki" data-ext="" style="background-color:#282c34;color:#abb2bf;"><pre class="shiki one-dark-pro vp-code"><code class="language-"><span class="line"><span>作用: 当前环境的变量</span></span>
8<span class="line"><span>类型: java.util.LinkedHashMap&lt;String,String&gt;</span></span></code></pre></div><h2 id="引入第三方-jar" tabindex="-1"><a class="header-anchor" href="#引入第三方-jar"><span>引入第三方 Jar</span></a></h2><div class="hint-container tip"><p class="hint-container-title">内置的 Jar</p><div class="language-" data-highlighter="shiki" data-ext="" style="background-color:#282c34;color:#abb2bf;"><pre class="shiki one-dark-pro vp-code"><code class="language-"><span class="line"><span>com.alibaba:fastjson:1.2.78</span></span>
9<span class="line"><span>cn.hutool:hutool-all:5.8.5</span></span>
10<span class="line"><span>com.google.guava:guava:30.1.1-jre</span></span></code></pre></div><p>Jar 的版本会不定期更新,如果发现 bug 请联系作者要求作者升级</p><p>开发者可以利用以上 3 个 Jar 所提供的工具方法,直接在脚本中引用,不需要再依赖第三方的 Jar(hutool 就是香,已经加入许多工具类)</p><p>前往<a href="#demo">Demo</a>查看如何获得<a href="https://www.jetbrains.com/help/idea/auto-completing-code.html" target="_blank" rel="noopener noreferrer">Code completion</a>功能</p></div><ul class="task-list-container"><li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> 引入 jar(maven 形式)</label></li></ul><p>下载 jar 可能会需要花费额外的时间</p><div class="language-groovy" data-highlighter="shiki" data-ext="groovy" style="background-color:#282c34;
10color:#abb2bf;"><pre class="shiki one-dark-pro vp-code"><code class="language-groovy"><span class="line"><span style="color:#C678DD;">@Grab</span><span style="color:#ABB2BF;">(</span><span style="color:#98C379;">&quot;org.apache.commons:commons-lang3:3.12.0&quot;</span><span style="color:#ABB2BF;">)</span></span>
11<span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> org.apache.commons.lang3.StringUtils</span></span>
12<span class="line"></span>
13<span class="line"><span style="color:#C678DD;">String</span><span style="color:#E06C75;"> debug</span><span style="color:#56B6C2;"> =</span><span style="color:#ABB2BF;"> request.</span><span style="color:#61AFEF;">header</span><span style="color:#ABB2BF;">(</span><span style="color:#98C379;">&quot;debug&quot;</span><span style="color:#ABB2BF;">)</span></span>
14<span class="line"><span style="color:#C678DD;">if</span><span style="color:#ABB2BF;">(</span><span style="color:#C678DD;">StringUtils</span><span style="color:#ABB2BF;">.</span><span style="color:#61AFEF;">isNotBlank</span><span style="color:#ABB2BF;">(debug)){</span></span>
15<span class="line"><span style="color:#7F848E;font-style:italic;">    //some logic</span></span>
16<span class="line"><span style="color:#ABB2BF;">}</span></span></code></pre></div><ul class="task-list-container"><li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-1" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-1"> 引入 jar(通过本地 jar)</label></li></ul><div class="language-groovy" data-highlighter="shiki" data-ext="groovy" style="background-color:#282c34;color:#abb2bf;"><pre class="shiki one-dark-pro vp-code"><code class="language-groovy"><span class="line"><span style="color:#7F848E;font-style:italic;">//注意此处的file:前缀</span></span>
17<span class="line"><span style="color:#E5C07B;">this</span><span style="color:#ABB2BF;">.class.classLoader.</span><span style="color:#61AFEF;">addURL</span><span style="color:#ABB2BF;">(</span><span style="color:#C678DD;">new</span><span style="color:#C678DD;"> URL</span><span style="color:#ABB2BF;">(</span><span style="color:#98C379;">&quot;file:/path/to/jar&quot;</span><span style="color:#ABB2BF;">))</span></span>
18<span class="line"><span style="color:#C678DD;">def</span><span style="color:#E06C75;"> StringUtils</span><span style="color:#56B6C2;"> =</span><span style="color:#C678DD;"> Class</span><span style="color:#ABB2BF;">.</span><span style="color:#61AFEF;">forName</span><span style="color:#ABB2BF;">(</span><span style="color:#98C379;">&quot;org.apache.commons.lang3.StringUtils&quot;</span><span style="color:#ABB2BF;">).</span><span style="color:#61AFEF;">getDeclaredConstructor</span><span style="color:#ABB2BF;">().</span><span style="color:#61AFEF;">newInstance</span><span style="color:#ABB2BF;">()</span></span>
19<span class="line"></span>
20<span class="line"><span style="color:#C678DD;">String</span><span style="color:#E06C75;"> debug</span><span style="color:#56B6C2;"> =</span><span style="color:#ABB2BF;"> request.</span><span style="color:#61AFEF;">header</span><span style="color:#ABB2BF;">(</span><span style="color:#98C379;">&quot;debug&quot;</span><span style="color:#ABB2BF;">)</span><span style="color:#7F848E;font-style:italic;">//获取header</span></span>
21<span class="line"><span style="color:#C678DD;">if</span><span style="color:#ABB2BF;">(</span><span style="color:#C678DD;">StringUtils</span><span style="color:#ABB2BF;">.</span><span style="color:#61AFEF;">isNotBlank</span><span style="color:#ABB2BF;">(debug)){</span></span>
22<span class="line"><span style="color:#7F848E;font-style:italic;">    //some logic</span></span>
23<span class="line"><span style="color:#ABB2BF;">}</span></span></code></pre></div><h2 id="作用范围与顺序" tabindex="-1"><a class="header-anchor" href="#作用范围与顺序"><span>作用范围与顺序</span></a></h2>`,9),r(`p`,null,[l[15]||=e(`分为`,-1),l[16]||=r(`code`,null,`项目级别`,-1),l[17]||=e(`和`,-1),l[18]||=r(`code`,null,`单API级别`,-1),l[19]||=e(`,项目全局作用需要点击 `,-1),i(W,{to:`/guide/features/projectValueConfig.html`},{default:n(()=>[i(U,{icon:`quanjucanshu`}),l[14]||=e(` 项目级别全局参数支持`,-1)]),_:1}),l[20]||=e(` 进行配置`,-1)]),l[41]||=r(`p`,null,`项目级别将作用项目中所有的 API,单 API 级别只作用于单个 API。`,-1),l[42]||=r(`p`,null,[e(`执行顺序:`),r(`code`,null,`项目级别`),e(`->`),r(`code`,null,`单API级别`)],-1),l[43]||=r(`p`,null,[r(`img`,{src:`/img/script.png`,alt:`scriptScope`,loading:`lazy`})],-1),r(`h2`,F,[r(`a`,I,[r(`span`,null,[l[21]||=e(`Console `,-1),i(H,{text:`2022.2.5`,type:`tip`})])])]),l[44]||=s(`<p>Console 帮助开发者打印一些你想要的信息</p><div class="language-groovy" data-highlighter="shiki" data-ext="groovy" style="background-color:#282c34;
23color:#abb2bf;"><pre class="shiki one-dark-pro vp-code"><code class="language-groovy"><span class="line"><span style="color:#ABB2BF;">console.</span><span style="color:#61AFEF;">info</span><span style="color:#ABB2BF;">(</span><span style="color:#98C379;">&quot;info&quot;</span><span style="color:#ABB2BF;">)</span></span>
24<span class="line"><span style="color:#ABB2BF;">console.</span><span style="color:#56B6C2;">print</span><span style="color:#ABB2BF;">(</span><span style="color:#98C379;">&quot;print info&quot;</span><span style="color:#ABB2BF;">)</span></span>
25<span class="line"><span style="color:#ABB2BF;">console.</span><span style="color:#61AFEF;">warn</span><span style="color:#ABB2BF;">(</span><span style="color:#98C379;">&quot;warn&quot;</span><span style="color:#ABB2BF;">)</span></span>
26<span class="line"><span style="color:#ABB2BF;">console.</span><span style="color:#61AFEF;">success</span><span style="color:#ABB2BF;">(</span><span style="color:#98C379;">&quot;success&quot;</span><span style="color:#ABB2BF;">)</span></span>
27<span class="line"><span style="color:#ABB2BF;">console.</span><span style="color:#61AFEF;">error</span><span style="color:#ABB2BF;">(</span><span style="color:#98C379;">&quot;error&quot;</span><span style="color:#ABB2BF;">)</span></span></code></pre></div><p><img src="/img/2022.2.5/console.png" alt="console" loading="lazy"></p><h2 id="demo" tabindex="-1"><a class="header-anchor" href="#demo"><span>Demo</span></a></h2><div class="hint-container tip"><p class="hint-container-title">Code completion支持</p><p>在项目中加入如下依赖(如果没有),即可在编辑器脚本中处理针对插件核心类的<a href="https://www.jetbrains.com/help/idea/auto-completing-code.html" target="_blank" rel="noopener noreferrer">Code completion</a>功能(快速导入类(import)、得到方法提示等操作)</p><p><img src="/img/2024.1.5/addLibrary.png" alt="" loading="lazy"></p></div><h3 id="_1-签名参数" tabindex="-1"><a class="header-anchor" href="#_1-签名参数"><span>1. 签名参数</span></a></h3><p>在你的本地新建一个 xxx.groovy 文件,粘贴以下代码,适当修改后,能保证本地可以正常运行,再把代码粘贴到脚本中</p>`,7),r(`ul`,null,[r(`li`,null,[i(H,{text:`注意最终脚本需要删除这行代码`,type:`danger`})])]),l[45]||=s(`<p><s>HttpRequest request = HttpUtil.createPost(&quot;http://localhost:8081/book/add&quot;)</s></p><div class="language-groovy line-numbers-mode" data-highlighter="shiki" data-ext="groovy" style="background-color:#282c34;color:#abb2bf;"><pre class="shiki one-dark-pro vp-code"><code class="language-groovy"><span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> cn.hutool.core.util.CharsetUtil</span></span>
28<span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> cn.hutool.core.util.StrUtil</span></span>
29<span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> cn.hutool.crypto.digest.DigestUtil</span></span>
30<span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> cn.hutool.http.HttpRequest</span></span>
31<span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> cn.hutool.http.HttpUtil</span></span>
32<span class="line"></span>
33<span class="line"><span style="color:#7F848E;font-style:italic;">//脚本逻辑正式开始</span></span>
34<span class="line"><span style="color:#C678DD;">String</span><span style="color:#E06C75;"> body</span><span style="color:#56B6C2;"> =</span><span style="color:#C678DD;"> StrUtil</span><span style="color:#ABB2BF;">.</span><span style="color:#61AFEF;">str</span><span style="color:#ABB2BF;">(request.</span><span style="color:#61AFEF;">bodyBytes</span><span style="color:#ABB2BF;">(), </span><span style="color:#C678DD;">CharsetUtil</span><span style="color:#ABB2BF;">.</span><span style="color:#D19A66;">CHARSET_UTF_8</span><span style="color:#ABB2BF;">)</span></span>
35<span class="line"><span style="color:#ABB2BF;">body </span><span style="color:#56B6C2;">=</span><span style="color:#98C379;"> &quot;xxxx&quot;</span><span style="color:#7F848E;font-style:italic;">//just for test</span></span>
36<span class="line"><span style="color:#C678DD;">String</span><span style="color:#E06C75;"> sign</span><span style="color:#56B6C2;"> =</span><span style="color:#C678DD;"> DigestUtil</span><span style="color:#ABB2BF;">.</span><span style="color:#61AFEF;">md5Hex</span><span style="color:#ABB2BF;">(body)</span></span>
37<span class="line"><span style="color:#ABB2BF;">request.</span><span style="color:#61AFEF;">header</span><span style="color:#ABB2BF;">(</span><span style="color:#98C379;">&quot;sign&quot;</span><span style="color:#ABB2BF;">,sign)</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="_2-利用某一个请求的响应充当请求的-header-参数" tabindex="-1"><a class="header-anchor" href="#_2-利用某一个请求的响应充当请求的-header-参数"><span>2. 利用某一个请求的响应充当请求的 Header 参数</span></a></h3><p>注意获取 token 的逻辑得结合接口返回的数据结构来处理。例如返回</p><div class="language-json" data-highlighter="shiki" data-ext="json" style="background-color:#282c34;
37color:#abb2bf;"><pre class="shiki one-dark-pro vp-code"><code class="language-json"><span class="line"><span style="color:#ABB2BF;">{</span></span>
38<span class="line"><span style="color:#E06C75;">  &quot;success&quot;</span><span style="color:#ABB2BF;">: </span><span style="color:#D19A66;">true</span><span style="color:#ABB2BF;">,</span></span>
39<span class="line"><span style="color:#E06C75;">  &quot;code&quot;</span><span style="color:#ABB2BF;">: </span><span style="color:#D19A66;">200</span><span style="color:#ABB2BF;">,</span></span>
40<span class="line"><span style="color:#E06C75;">  &quot;data&quot;</span><span style="color:#ABB2BF;">: {</span></span>
41<span class="line"><span style="color:#E06C75;">    &quot;token&quot;</span><span style="color:#ABB2BF;">: </span><span style="color:#98C379;">&quot;xxxxx&quot;</span></span>
42<span class="line"><span style="color:#ABB2BF;">  }</span></span>
43<span class="line"><span style="color:#ABB2BF;">}</span></span></code></pre></div><p>则需要这么写 <code>JSON.parseObject(myResponse.body()).getJSONObject(&quot;data&quot;).getString(&quot;token&quot;)</code></p><div class="language-groovy line-numbers-mode" data-highlighter="shiki" data-ext="groovy" style="background-color:#282c34;color:#abb2bf;"><pre class="shiki one-dark-pro vp-code"><code class="language-groovy"><span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> cn.hutool.core.util.CharsetUtil</span></span>
44<span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> cn.hutool.core.util.StrUtil</span></span>
45<span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> cn.hutool.crypto.digest.DigestUtil</span></span>
46<span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> cn.hutool.http.HttpRequest</span></span>
47<span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> cn.hutool.http.HttpResponse</span></span>
48<span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> cn.hutool.http.HttpUtil</span></span>
49<span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> com.alibaba.fastjson.JSON</span></span>
50<span class="line"></span>
51<span class="line"><span style="color:#C678DD;">HttpRequest</span><span style="color:#E06C75;"> myRequest</span><span style="color:#56B6C2;"> =</span><span style="color:#C678DD;"> HttpUtil</span><span style="color:#ABB2BF;">.</span><span style="color:#61AFEF;">createPost</span><span style="color:#ABB2BF;">(</span><span style="color:#98C379;">&quot;http://localhost:8081/api/v1.0/login&quot;</span><span style="color:#ABB2BF;">)</span></span>
52<span class="line"><span style="color:#C678DD;">HttpResponse</span><span style="color:#E06C75;"> myResponse</span><span style="color:#56B6C2;"> =</span><span style="color:#ABB2BF;"> myRequest.</span><span style="color:#61AFEF;">execute</span><span style="color:#ABB2BF;">()</span></span>
53<span class="line"><span style="color:#C678DD;">if</span><span style="color:#ABB2BF;">(myResponse.</span><span style="color:#61AFEF;">isOk</span><span style="color:#ABB2BF;">()){</span></span>
54<span class="line"><span style="color:#C678DD;">    String</span><span style="color:#ABB2BF;"> token </span><span style="color:#56B6C2;">=</span><span style="color:#D19A66;"> JSON</span><span style="color:#ABB2BF;">.</span><span style="color:#61AFEF;">parseObject</span><span style="color:#ABB2BF;">(myResponse.</span><span style="color:#61AFEF;">body</span><span style="color:#ABB2BF;">()).</span><span style="color:#61AFEF;">getString</span><span style="color:#ABB2BF;">(</span><span style="color:#98C379;">&quot;token&quot;</span><span style="color:#ABB2BF;">)</span></span>
55<span class="line"><span style="color:#ABB2BF;">    request.</span><span style="color:#61AFEF;">header</span><span style="color:#ABB2BF;">(</span><span style="color:#98C379;">&quot;token&quot;</span><span style="color:#ABB2BF;">,token)</span></span>
56<span class="line"><span style="color:#ABB2BF;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="_3-设置一个environment变量" tabindex="-1"><a class="header-anchor" href="#_3-设置一个environment变量"><span>3. 设置一个Environment变量</span></a></h3><p>假定响应报文格式</p><div class="language-json" data-highlighter="shiki" data-ext="json" style="background-color:#282c34;
56color:#abb2bf;"><pre class="shiki one-dark-pro vp-code"><code class="language-json"><span class="line"><span style="color:#ABB2BF;">{</span></span>
57<span class="line"><span style="color:#E06C75;">  &quot;success&quot;</span><span style="color:#ABB2BF;">: </span><span style="color:#D19A66;">true</span><span style="color:#ABB2BF;">,</span></span>
58<span class="line"><span style="color:#E06C75;">  &quot;code&quot;</span><span style="color:#ABB2BF;">: </span><span style="color:#D19A66;">200</span><span style="color:#ABB2BF;">,</span></span>
59<span class="line"><span style="color:#E06C75;">  &quot;data&quot;</span><span style="color:#ABB2BF;">: {</span></span>
60<span class="line"><span style="color:#E06C75;">    &quot;token&quot;</span><span style="color:#ABB2BF;">: </span><span style="color:#98C379;">&quot;xxxxx&quot;</span></span>
61<span class="line"><span style="color:#ABB2BF;">  }</span></span>
62<span class="line"><span style="color:#ABB2BF;">}</span></span></code></pre></div><p>在后置脚本中植入以下代码</p><div class="language-groovy line-numbers-mode" data-highlighter="shiki" data-ext="groovy" style="background-color:#282c34;color:#abb2bf;"><pre class="shiki one-dark-pro vp-code"><code class="language-groovy"><span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> cn.hutool.core.util.CharsetUtil</span></span>
63<span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> cn.hutool.core.util.StrUtil</span></span>
64<span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> cn.hutool.crypto.digest.DigestUtil</span></span>
65<span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> cn.hutool.http.HttpRequest</span></span>
66<span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> cn.hutool.http.HttpResponse</span></span>
67<span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> cn.hutool.http.HttpUtil</span></span>
68<span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> com.alibaba.fastjson.JSON</span></span>
69<span class="line"></span>
70<span class="line"><span style="color:#C678DD;">HttpRequest</span><span style="color:#E06C75;"> myRequest</span><span style="color:#56B6C2;"> =</span><span style="color:#C678DD;"> HttpUtil</span><span style="color:#ABB2BF;">.</span><span style="color:#61AFEF;">createPost</span><span style="color:#ABB2BF;">(</span><span style="color:#98C379;">&quot;http://localhost:8081/api/v1.0/login&quot;</span><span style="color:#ABB2BF;">)</span></span>
71<span class="line"><span style="color:#C678DD;">HttpResponse</span><span style="color:#E06C75;"> myResponse</span><span style="color:#56B6C2;"> =</span><span style="color:#ABB2BF;"> myRequest.</span><span style="color:#61AFEF;">execute</span><span style="color:#ABB2BF;">()</span></span>
72<span class="line"><span style="color:#C678DD;">if</span><span style="color:#ABB2BF;">(myResponse.</span><span style="color:#61AFEF;">isOk</span><span style="color:#ABB2BF;">()){</span></span>
73<span class="line"><span style="color:#C678DD;">    String</span><span style="color:#ABB2BF;"> token </span><span style="color:#56B6C2;">=</span><span style="color:#D19A66;"> JSON</span><span style="color:#ABB2BF;">.</span><span style="color:#61AFEF;">parseObject</span><span style="color:#ABB2BF;">(myResponse.</span><span style="color:#61AFEF;">body</span><span style="color:#ABB2BF;">()).</span><span style="color:#61AFEF;">getJSONObject</span><span style="color:#ABB2BF;">(</span><span style="color:#98C379;">&quot;data&quot;</span><span style="color:#ABB2BF;">).</span><span style="color:#61AFEF;">getString</span><span style="color:#ABB2BF;">(</span><span style="color:#98C379;">&quot;token&quot;</span><span style="color:#ABB2BF;">)</span></span>
74<span class="line"><span style="color:#ABB2BF;">    rfr.environment.</span><span style="color:#61AFEF;">put</span><span style="color:#ABB2BF;">(</span><span style="color:#98C379;">&quot;token&quot;</span><span style="color:#ABB2BF;">,token)</span></span>
75<span class="line"><span style="color:#ABB2BF;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>`,12),r(`h3`,L,[r(`a`,R,[r(`span`,null,[l[22]||=e(`4.直接引用项目中的类 `,-1),i(H,{text:`2026.1.1`,type:`info`})])])]),l[46]||=s(`<div class="language-groovy" data-highlighter="shiki" data-ext="groovy" style="background-color:#282c34;
75color:#abb2bf;"><pre class="shiki one-dark-pro vp-code"><code class="language-groovy"><span class="line"><span style="color:#C678DD;">import</span><span style="color:#E5C07B;"> com.example.YourClass</span></span>
76<span class="line"></span>
77<span class="line"><span style="color:#C678DD;">def</span><span style="color:#E06C75;"> value</span><span style="color:#56B6C2;"> =</span><span style="color:#C678DD;"> YourClass</span><span style="color:#ABB2BF;">.</span><span style="color:#61AFEF;">someMethod</span><span style="color:#ABB2BF;">()</span></span>
78<span class="line"><span style="color:#ABB2BF;">console.</span><span style="color:#61AFEF;">info</span><span style="color:#ABB2BF;">(value)</span></span></code></pre></div><p>Script 会自动加载当前 API 所属模块的编译输出和运行时依赖,可以直接导入本地项目类并调用类中的方法。使用前请先编译项目,确保目标类及其依赖已生成,无需手动指定 <code>target/classes</code> 的绝对路径。</p><h2 id="注意点" tabindex="-1"><a class="header-anchor" href="#注意点"><span>注意点</span></a></h2><ul><li>Groovy 脚本对 <mark>;</mark> 不敏感,Java 用;作为语句代码的结束,Groovy 用换行表示一句代码的结束</li><li>内置变量已被申明,例如 Demo2 中需要额外新建一个请求,变量命名需要注意不能与内置变量相同</li></ul><h2 id="脚本投稿" tabindex="-1"><a class="header-anchor" href="#脚本投稿"><span>脚本投稿 🌟</span></a></h2><p>为了将脚本做的更加强大,评论区开放社区脚本投递,欢迎将强大脚本通过<strong>下方留言</strong> 的形式上报,让更多人使用你开发的脚本</p><ul><li>格式</li></ul><div class="language-groovy" data-highlighter="shiki" data-ext="groovy" style="background-color:#282c34;color:#abb2bf;"><pre class="shiki one-dark-pro vp-code"><code class="language-groovy"><span class="line"><span style="color:#7F848E;font-style:italic;">/**</span></span>
79<span class="line"><span style="color:#7F848E;font-style:italic;"> * 作者:Kings</span></span>
80<span class="line"><span style="color:#7F848E;font-style:italic;"> * 主页:https://github.com/kings1990</span></span>
81<span class="line"><span style="color:#7F848E;font-style:italic;"> * 功能:xxxxx</span></span>
82<span class="line"><span style="color:#7F848E;font-style:italic;"> */</span></span>
83<span class="line"></span>
84<span class="line"><span style="color:#7F848E;font-style:italic;">//脚本内容</span></span>
85<span class="line"><span style="color:#ABB2BF;">....</span></span></code></pre></div><p><img src="/img/2022.2.3/scriptDonate.png" alt="scriptDonate" loading="lazy"></p>`,9)])}var B=c(u,[[`render`,z]]);export{l as _pageData,B as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.