使用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
相关产品推荐
相关产品推荐

