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

curl调用登录API可正常获取token,Python requests调用返回401错误如何解决?

问题解决方法

问题根因

你的报错是请求体格式和服务端要求不匹配导致的:

  • 你使用的curl命令中--data-binary传递的是JSON格式字符串,请求默认Content-Type为application/json
  • 你的Python代码中给requests.post传data=payload时,requests会默认将字典序列化为表单格式(Content-Type: application/x-www-form-urlencoded),服务端无法正确解析登录参数,因此返回鉴权失败。

修复方案

有两种可行修改方式,推荐第一种更简便:

方法1:直接用json参数传递字典(requests 2.4.2+版本支持)

requests提供了专门的json参数,传字典时会自动序列化为JSON字符串,同时自动设置Content-Type: application/json请求头,完全匹配你curl的行为:

import requests

payload = {'login':'spn','password':'password'}
# 把原来的data参数换成json参数即可
response = requests.post('http://你的接口地址/application/login', json=payload)

# 提取token无需额外工具,requests自带JSON解析能力
if response.status_code == 200:
    token = response.json()['token']
    print(f"获取到的TOKEN: {token}")
else:
    print(f"请求失败,状态码: {response.status_code}, 错误信息: {response.text}")

方法2:手动序列化JSON+设置请求头

如果你使用的requests版本较旧,也可以手动完成序列化操作,和curl行为完全对等:

import requests
import json

payload = {'login':'spn','password':'password'}
# 手动把字典转成JSON字符串,设置正确的请求头
headers = {'Content-Type': 'application/json'}
response = requests.post('http://你的接口地址/application/login', data=json.dumps(payload), headers=headers)

# 后续提取token逻辑和上面一致
if response.status_code == 200:
    token = response.json()['token']
    print(f"获取到的TOKEN: {token}")
else:
    print(f"请求失败,状态码: {response.status_code}, 错误信息: {response.text}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:09:04