You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用k6测试Swagger端点时POST请求遇401未授权问题求助

解决k6性能测试中POST接口401未授权问题

你的场景是:类Facebook应用需登录后访问核心功能,用k6测试Swagger可查的POST接口时收到401未授权响应,已尝试通过GET登录接口获取Cookie,但POST请求仍未通过授权,怀疑需要API密钥或Token。以下是具体解决步骤:


1. 先确认登录接口的实际授权输出

首先检查登录GET请求的响应内容,很多现代应用不会仅依赖Cookie做授权,而是会返回Token:

  • 在登录请求后添加console.log(res.body),打印完整响应体,确认是否包含access_token、auth_token这类Token字段。
  • 如果响应是JSON格式,解析后提取Token值,这很可能是后续请求需要的授权凭证。

2. 对比手动请求的授权信息

打开浏览器开发者工具(F12),手动完成「登录→调用目标POST接口」的流程,查看请求头中的授权信息:

  • 若看到Authorization: Bearer <token>,说明需要Bearer Token授权
  • 若看到X-API-Key、X-Auth-Token这类自定义头,说明需要对应密钥或Token
  • 同时确认Cookie的名称和值,检查k6是否自动携带了正确的Cookie(k6默认会管理同域名Cookie,跨域/子域名可能需要手动处理)

3. 修改k6代码适配授权逻辑

情况一:使用登录返回的Bearer Token

如果登录接口返回了Token,在POST请求头中添加授权字段:

import http from 'k6/http';
import { check } from 'k6';

export default async function getTransactions() {
    // 登录请求
    const loginRes = http.get('https://xxxxxx.net/xxxxx/xxxxxx/xxxx/xxxx/action?email=xxxxx&password=xxxxxx');
    check(loginRes, { '登录成功': (r) => r.status == 200 });

    // 从登录响应提取Token(根据实际返回结构调整字段名)
    const loginData = JSON.parse(loginRes.body);
    const authToken = loginData.access_token;

    const url = 'https://xxxxxx/api/jr/txn/session/v1'
    const payload = JSON.stringify({
        "atmId": [4],
        "devtime0": 20231101000000,
        "devtime1": 20231111000000
    });
    const params = {
        headers: {
            'accept': '*/*',
            'content-type': 'application/json',
            'Authorization': `Bearer ${authToken}` // 添加Bearer Token授权头
        },
    };

    const transactionRes = http.post(url, payload, params)
    console.log(transactionRes.body);
    check(transactionRes, {'接口请求成功': (r) => r.status == 200});
}

情况二:使用API密钥(Swagger文档有说明时)

如果Swagger标注需要API密钥,在请求头中添加对应字段:

// 在params的headers中添加
'X-API-Key': '你的API密钥'

情况三:手动携带Cookie

若确认仅需Cookie授权但k6未自动携带,手动提取并添加:

// 登录后提取Cookie
const cookies = loginRes.cookies;
// 拼接Cookie字符串(示例,根据实际Cookie名称调整)
const cookieStr = `${cookies.session_id[0].name}=${cookies.session_id[0].value}`;

// 在POST请求的params.headers中添加
'Cookie': cookieStr

4. 清理无效请求头

你当前代码中的access-control-allow-origin和server是响应头,不需要在请求中发送,直接删除这两个字段,避免干扰服务器的授权验证逻辑。


内容的提问来源于stack exchange,提问作者karthaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:58:40