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

