Insomnia 是一个开源的跨平台 REST API 客户端,它支持 GraphQL、REST、WebSockets、服务器发送事件(SSE)、gRPC 以及任何其他与 HTTP 兼容的协议。是一个不错的 PostMan 替代品。
比如我们存在如下场景:
- 存在不同环境的 API,比如开放、测试、预发布、正式环境...
- 各个环境的 API 请求路径、参数定义这些都是一致的
- 不同环境需要使用不同的 API 入口、 Token。
本文描述如何借助 Insomnia 的 Environments 配置来实现不同环境间的管理。
1 创建和管理 Global Environments
-
访问 Global Environments:
- 点击左下角的环境选择器
- 选择 "Manage Environments"
- 在弹出的窗口中可以看到 "Global Environments" 选项
-
创建不同的 Global Environment:
sql├── Development Global ├── Testing Global ├── Production Global └── Staging Global
2 为不同环境设置不同的 Globals
比如我们设置如下的环境的全局变量,这里可以根据自身的场景进行设置。
Development Global Environment
json
{
"auth_base_url": "https://dev-auth.example.com",
"api_base_url": "https://dev-api.example.com",
"auth_token": "",
"token_expires_at": "",
"environment_name": "development"
}
Production Global Environment
json
{
"auth_base_url": "https://auth.example.com",
"api_base_url": "https://api.example.com",
"auth_token": "",
"token_expires_at": "",
"environment_name": "production"
}
3 在脚本中根据环境动态设置 Token
登录接口的 Response Script
javascript
const response = insomnia.response.getBody();
const responseData = JSON.parse(response);
// 获取当前环境名称
const currentEnv = insomnia.globals.get('environment_name') || 'unknown';
if (responseData.access_token) {
// 根据环境保存 token
insomnia.globals.set('auth_token', responseData.access_token);
if (responseData.expires_in) {
const expiresAt = Date.now() + (responseData.expires_in * 1000);
insomnia.globals.set('token_expires_at', expiresAt);
}
// 保存用户信息(如果需要)
if (responseData.user) {
insomnia.globals.set('current_user', JSON.stringify(responseData.user));
}
console.log(`Token 已保存到 ${currentEnv} 环境的 Globals`);
console.log('Token:', responseData.access_token.substring(0, 20) + '...');
} else {
console.log(`在 ${currentEnv} 环境中登录失败`);
}
4 环境感知的 Token 验证
Pre-request Script 示例
javascript
// 检查当前环境
const currentEnv = insomnia.globals.get('environment_name');
const baseUrl = insomnia.globals.get('api_base_url');
const token = insomnia.globals.get('auth_token');
const expiresAt = insomnia.globals.get('token_expires_at');
console.log(`当前环境: ${currentEnv}`);
console.log(`API 基础 URL: ${baseUrl}`);
// 验证 token
if (!token) {
throw new Error(`在 ${currentEnv} 环境中未找到 auth token`);
}
// 检查过期时间
if (expiresAt && Date.now() > expiresAt) {
console.log(`${currentEnv} 环境中的 token 已过期`);
throw new Error('Token 已过期,请重新登录');
}
// 动态设置请求 URL(如果需要)
const currentUrl = insomnia.request.getUrl();
if (!currentUrl.startsWith('http')) {
// 如果是相对路径,添加环境对应的基础 URL
insomnia.request.setUrl(baseUrl + currentUrl);
}
console.log(`使用 ${currentEnv} 环境的 token 进行请求`);
5 环境切换的最佳实践
创建环境检查脚本
javascript
// 可以在多个请求中复用的环境检查函数
function validateEnvironment() {
const envName = insomnia.globals.get('environment_name');
const authUrl = insomnia.globals.get('auth_base_url');
const apiUrl = insomnia.globals.get('api_base_url');
if (!envName || !authUrl || !apiUrl) {
throw new Error('Global Environment 配置不完整,请检查环境设置');
}
console.log(`✓ 当前使用 ${envName} 环境`);
console.log(`✓ Auth URL: ${authUrl}`);
console.log(`✓ API URL: ${apiUrl}`);
return {
name: envName,
authUrl,
apiUrl
};
}
function getEnvironmentToken() {
const env = validateEnvironment();
const token = insomnia.globals.get('auth_token');
const expiresAt = insomnia.globals.get('token_expires_at');
if (!token) {
throw new Error(`${env.name} 环境中未找到认证 token`);
}
if (expiresAt && Date.now() > expiresAt) {
throw new Error(`${env.name} 环境中的 token 已过期`);
}
return token;
}
// 使用示例
const token = getEnvironmentToken();
insomnia.request.setHeader('Authorization', `Bearer ${token}`);
6 在请求中使用环境变量
URL 中使用
bash
{{ globals.api_base_url }}/users/profile
Header 中使用
css
Authorization: Bearer {{ globals.auth_token }}
X-Environment: {{ globals.environment_name }}
Request Body 中使用
json
{
"environment": "{{ globals.environment_name }}",
"token": "{{ globals.auth_token }}",
"base_url": "{{ globals.api_base_url }}"
}
7 高级用法:自动环境检测
javascript
// 根据请求 URL 自动检测并切换环境
const currentUrl = insomnia.request.getUrl();
let targetEnv;
if (currentUrl.includes('dev-') || currentUrl.includes('development')) {
targetEnv = 'development';
} else if (currentUrl.includes('test-') || currentUrl.includes('staging')) {
targetEnv = 'testing';
} else if (currentUrl.includes('prod-') || currentUrl.includes('production')) {
targetEnv = 'production';
}
if (targetEnv) {
const currentEnv = insomnia.globals.get('environment_name');
if (currentEnv !== targetEnv) {
console.log(`检测到环境不匹配,当前: ${currentEnv}, 目标: ${targetEnv}`);
console.log('请切换到正确的 Global Environment');
}
}
总结
Global Environments 的优势:
- 环境隔离:不同环境的 token 和配置完全分离
- 快速切换:可以快速在开发/测试/生产环境间切换
- 配置管理:每个环境可以有不同的 API 端点、认证服务器等
- 团队协作:团队成员可以共享环境配置
这样就可以为每个环境维护独立的 token 和配置,避免了不同环境间的数据混淆。