如何在Insomnia中实现不同环境变量的快速切换?

Insomnia 是一个开源的跨平台 REST API 客户端,它支持 GraphQL、REST、WebSockets、服务器发送事件(SSE)、gRPC 以及任何其他与 HTTP 兼容的协议。是一个不错的 PostMan 替代品。

比如我们存在如下场景:

  1. 存在不同环境的 API,比如开放、测试、预发布、正式环境...
  2. 各个环境的 API 请求路径、参数定义这些都是一致的
  3. 不同环境需要使用不同的 API 入口、 Token。

本文描述如何借助 Insomnia 的 Environments 配置来实现不同环境间的管理。

1 创建和管理 Global Environments

  1. 访问 Global Environments

    • 点击左下角的环境选择器
    • 选择 "Manage Environments"
    • 在弹出的窗口中可以看到 "Global Environments" 选项
  2. 创建不同的 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 的优势:

  1. 环境隔离:不同环境的 token 和配置完全分离
  2. 快速切换:可以快速在开发/测试/生产环境间切换
  3. 配置管理:每个环境可以有不同的 API 端点、认证服务器等
  4. 团队协作:团队成员可以共享环境配置

这样就可以为每个环境维护独立的 token 和配置,避免了不同环境间的数据混淆。

相关推荐
@ chen5 小时前
Spring Boot 解决跨域问题
java·spring boot·后端
转转技术团队7 小时前
转转上门隐私号系统的演进
java·后端
【本人】7 小时前
Django基础(二)———URL与映射
后端·python·django
Humbunklung7 小时前
Rust 模块系统:控制作用域与私有性
开发语言·后端·rust
WanderInk8 小时前
依赖对齐不再“失联”:破解 feign/BaseBuilder 错误实战
java·后端·架构
LaoZhangAI9 小时前
GPT-4o mini API限制完全指南:令牌配额、访问限制及优化策略【2025最新】
前端·后端
LaoZhangAI9 小时前
FLUX.1 API图像尺寸设置全指南:优化生成效果与成本
前端·后端
Kookoos10 小时前
ABP VNext + EF Core 二级缓存:提升查询性能
后端·.net·二级缓存·ef core·abp vnext
月初,10 小时前
SpringBoot集成Minio存储文件,开发图片上传等接口
java·spring boot·后端
KubeSphere10 小时前
全面升级!WizTelemetry 可观测平台 2.0 深度解析:打造云原生时代的智能可观测平台
后端