如何将指定Bash Curl请求转为Python代码?请求返回401错误
解决Selectel认证令牌请求401错误的问题
你的Python代码存在两个核心问题,直接导致服务器返回401未授权:
- 请求方法错误:原curl命令通过
-d参数发送数据时,会自动将请求方法切换为POST,但你使用了requests.get()发送GET请求,服务器无法接收到认证所需的请求体数据。 - 参数传递方式错误:你把认证数据放在
params参数中,这会将数据拼接为URL查询字符串,而原curl是将JSON数据放在请求体里发送的,正确做法是使用json参数传递。
另外注意变量名拼写规范:PARAMETRES建议改为PARAMETERS;headers中的Content-type最好改成Content-Type,和原curl的请求头保持一致(虽然多数服务器兼容小写,但规范写法更稳妥)。
修正后的代码:
import requests # 确保以下变量已正确赋值 USER_NAME = "你的用户名" ID_SELECTEL = "你的域名" PASSWORD = "你的密码" PROJECT_NAME = "你的项目名" DATA_URL = "https://api.selvpc.ru/identity/v3/auth/tokens" PARAMETERS = { "auth": { "identity": { "methods": ["password"], "password": { "user": { "name": USER_NAME, "domain": { "name": ID_SELECTEL }, "password": PASSWORD } } }, "scope": { "project": { "name": PROJECT_NAME, "domain": { "name": ID_SELECTEL } } } } } # 改用POST请求,通过json参数传递认证数据 response = requests.post(DATA_URL, json=PARAMETERS) print(response.status_code) # 成功时提取返回的令牌 if response.status_code == 201: token = response.headers.get('X-Subject-Token') print("获取到的认证令牌:", token) else: print("错误详情:", response.text)
补充说明:使用json参数时,requests会自动添加Content-Type: application/json请求头,因此可以省略手动定义的HEADERS。
内容的提问来源于stack exchange,提问作者timaxs com
相关产品推荐
相关产品推荐

