使用Curl调用带Bearer Token鉴权的REST API生成文件失败,求排查指导
问题排查与修复方案
存在的明显错误
- 第二个请求Header参数语法错误
你写的"Authorization: aesiv {xxxxxxxxxxx}"前面缺失-H参数前缀,curl每个自定义Header都必须携带-H/--header标识,缺失的话该字段会被识别为无效请求参数导致请求异常。 - Token取值大概率错误
你直接将登录接口的完整响应赋值给了token变量,绝大多数登录接口返回的是JSON结构(比如{"access_token":"实际token值","expires_in":7200}),而非直接返回纯token字符串,此时token变量存储的是完整JSON串,后续鉴权必然失败。 - 符号冗余问题
Header中你给aesiv值、token都套了大括号{},如果接口没有特殊要求要携带大括号,这些符号会被当做参数值的一部分传递,导致鉴权失败;Shell变量引用直接写$token即可,不需要额外加{}(除非有变量名混淆场景)。 - 缺失文件输出配置
curl默认会将响应内容输出到终端,不会自动保存为本地文件,需要加-o 文件名参数指定输出路径才能生成目标文件。 - 重复Accept头冲突
你同时指定了两个Accept头,值分别为encryptionIntVeD和application/json,服务端会优先识别哪一个取决于接口逻辑,如果接口返回的是文件流,错误的Accept头会导致返回内容格式异常。
修正后的示例命令
首先确认本机安装了jq工具(用于解析JSON提取字段),再执行以下命令:
# 第一步:提取登录接口返回的token token=$(curl --header "Content-Type: application/json" --header "aesiv: xxxxxxxx" \ --request POST \ --data '{"login":"username","password":"encrypted_pswd"}' \ https://ssssss/api/login | jq -r '.access_token') # 验证token是否正确提取,可注释掉 echo "获取到的token为: $token"
# 第二步:请求生成报告并保存为本地文件 curl -X GET https://ssssss/api/generate-report \ -H "Accept: application/json" \ # 如果aesiv要求单独作为Header传递,就用下面这行,替换掉Authorization传aesiv的逻辑 # -H "aesiv: xxxxxxxxxxx" \ -H "Authorization: aesiv xxxxxxxxxxx" \ -H "Authorization: Bearer $token" \ # 自定义输出的文件名和后缀 -o report_result.xlsx
进一步排查建议
- 给curl命令加
-v参数,打印完整的请求和响应日志,通过返回的状态码定位问题:401为鉴权失败,重点检查token取值和Header格式;400为参数错误,重点检查传值是否符合接口要求;200但文件损坏则检查Accept头和文件后缀是否匹配。 - 核对接口文档,确认aesiv参数是要单独作为Header传递,还是要放到Authorization头中传递,两种方式不要写错。
内容的提问来源于stack exchange,提问作者Karthick
相关产品推荐
相关产品推荐

