从Bash调用REST API时随机出现401 Unauthorized问题排查
问题详情
- 服务器环境:搭载IIS的Windows系统
- 业务流程:需对约8000个ID分别执行2次GET、1次PUT共3种REST调用,流程为:先认证获取会话Cookie,后续调用复用该Cookie完成授权,最后执行登出操作
- 异常现象:
- Windows平台用C#实现逻辑完全正常
- Linux Bash/Java实现时,随机出现401 Unauthorized错误,错误与特定ID或调用类型无关,使用相同Cookie的下一次调用可成功
- 已尝试在调用间添加1秒延迟,问题仍未解决
- 排查信息:
- 开启IIS完整追踪及Bash调用verbose模式后发现:出现401错误时,IIS日志中无对应请求记录,但Bash verbose明确显示返回401;若未预先执行认证,所有失败请求均会在IIS日志中显示
附带Bash脚本
#!/bin/bash #--------------------- 登录请求 --------------------- "" > output.txt curl -s -c cookie.txt -X POST "https://www.myapi.si/auth/apphost" -H "Content-Type: application/json" -d '{"authString":"Module=DialogUser;User=userTest;Password=Password123."}' #--------------------- 数据请求 --------------------- objectId=("104569", "105079", "103103", "97267", "106385") for item in "${objectId[@]}"; do #--------------------- 获取精简员工数据 --------------------- echo "$item" echo "$item" >> output.txt myDate=$(date -u +"%H:%M:%S") echo "$myDate" >> output.txt curl -s -b "cookie.txt" -X GET --no-buffer "https://www.myapi.si/api/entities/GetObjectData?where=objectId='$item'&loadType=BulkReadOnly" -H "Accept: application/json" >> output.txt sleep 1 echo "" >> output.txt echo "....................." >> output.txt #--------------------- 验证账户有效性 --------------------- curl -s -b "cookie.txt" -X PUT -H "Content-Type: application/json" --no-buffer "https://www.myapi.si/api/script/IsAccountValid" -d '{"parameters": ["'$item'","2024-9-19"]}' >> output.txt sleep 1 echo "" >> output.txt echo "....................." >> output.txt #--------------------- 获取次要身份信息 --------------------- curl -s -b "cookie.txt" -X GET --no-buffer "https://www.myapi.si/api/entities/GETSecondaryIdentities?where=objectId='$item'&loadType=BulkReadOnly" -H "Accept: application/json" >> output.txt sleep 1 echo "" >> output.txt echo "--------------------- 下一个ID ---------------------" >> output.txt done
内容的提问来源于stack exchange,提问作者JerrySI
相关产品推荐
相关产品推荐

