insomnia请求钩子用于动态修改请求参数、注入认证凭证及响应驱动的数据更新。需启用js插件,在request hooks中编写导出函数,通过context访问并修改request、environment等对象,支持header注入、token提取、url重写与加密签名生成。

如果您在Insomnia中需要在请求发出前动态修改参数、注入认证凭证或根据响应结果自动更新后续请求数据,则必须借助请求钩子(request hooks)机制实现。以下是具体实施步骤:
一、理解请求钩子的执行时机与作用域
Insomnia的requestHooks在HTTP请求被序列化并发送至网络栈之前触发,运行于Node.js沙箱环境,可访问当前请求对象(包括method、url、headers、body等)、环境变量及工作区上下文。该钩子不改变UI界面状态,仅影响实际发出的请求载荷。
1、打开Insomnia主界面,进入目标工作区;
2、点击左下角Settings图标,选择Plugins选项卡;
3、确认已启用支持JavaScript钩子的插件(如insomnia-plugin-js-hook或内置脚本引擎);
4、在请求编辑页右侧切换至Request Hooks面板。
二、编写基础请求钩子函数
钩子函数需导出为模块方法,接收context对象作为唯一参数,其中包含request、environment、workspace等属性。函数必须返回修改后的request对象,否则原请求保持不变。
1、在Request Hooks面板中点击+ Add Hook;
2、选择JavaScript语言类型;
3、输入以下代码:
module.exports = async (context) => { const { request } = context; request.headers['X-Request-ID'] = Date.now().toString(); return request; };
4、保存后发送请求,可在DevTools Network面板中验证X-Request-ID头是否注入成功。
三、从登录响应中提取Token并注入后续请求
该方法利用上一个请求的响应体解析token,并将其写入当前请求的Authorization头,适用于OAuth2或JWT认证流。依赖Insomnia内置的response.body解析能力与环境变量持久化机制。
1、确保登录请求已配置并能成功返回含access_token字段的JSON响应;
2、在登录请求的Response Hooks中添加如下脚本:
module.exports = async (context) => { const { response, environment } = context; if (response.status === 200) { const data = JSON.parse(response.body); insomnia.setEnvironmentVariable('auth_token', data.access_token); } };
3、在后续受保护请求的Request Hooks中添加:
module.exports = async (context) => { const { request, environment } = context; const token = environment.auth_token; if (token) { request.headers.Authorization = `Bearer ${token}`; } return request; };
四、使用模板标签结合钩子实现动态路径拼接
当请求URL需基于前序响应中的ID字段动态构造时,单纯依赖环境变量可能引发竞态问题。钩子可直接读取响应缓存并实时重写URL,绕过变量同步延迟。
1、在前置请求(如获取用户列表)的Response Hooks中保存原始响应体到内存:
module.exports = async (context) => { const { response } = context; if (response.status === 200) { const data = JSON.parse(response.body); insomnia.setMemoryVariable('lastUserList', data); } };
2、在后续请求(如获取某用户详情)的Request Hooks中读取并重构URL:
module.exports = async (context) => { const { request, environment } = context; const list = insomnia.getMemoryVariable('lastUserList'); if (list && list.users && list.users.length > 0) { const userId = list.users[0].id; request.url = request.url.replace('{user_id}', userId); } return request; };
五、注入加密签名头防止请求篡改
针对需服务端校验签名的API,钩子可在发送前调用Node.js内置crypto模块生成HMAC-SHA256摘要,并将结果注入请求头。密钥通过Insomnia安全保险库(Local Vault)加载,避免明文暴露。
1、在Insomnia设置中启用Local Vault并存储密钥变量api_secret;
2、在目标请求的Request Hooks中插入以下代码:
const crypto = require('crypto'); module.exports = async (context) => { const { request, environment } = context; const secret = environment.api_secret; const timestamp = Math.floor(Date.now() / 1000).toString(); const bodyStr = request.body || ''; const message = `${request.method}\n${request.url}\n${timestamp}\n${bodyStr}`; const signature = crypto.createHmac('sha256', secret).update(message).digest('hex'); request.headers['X-Timestamp'] = timestamp; request.headers['X-Signature'] = signature; return request; };











