使用请求我得到 401,但 urllib3 和curl 工作

问题描述 投票:0回答:1

以下 urllib 代码可用于使用 :

连接到
import urllib3
import json

# Initialize a PoolManager instance
http = urllib3.PoolManager()

# Define the URL, headers, and data
url = "https://<url>"
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json; charset=utf-8"
}
data = {
    "name": "some_test"
}

# Encode data to JSON
encoded_data = json.dumps(data).encode('utf-8')

# Send the POST request
response = http.request(
    'POST',
    url,
    body=encoded_data,
    headers=headers
)

# Print the response status and data
print(response.status)
print(response.data.decode('utf-8'))

我还尝试通过这个有效的 CURL 命令进行连接:

curl -X "POST" "https://<url>" \
    -H 'Authorization: Bearer <token>' \
    -H 'Content-Type: application/json; charset=utf-8' \
    -d $'{
  "name": "some_test"
}'

但是使用请求模块,代码会返回 401 消息 -> 未经授权:

import requests


url = "<url>"
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json; charset=utf-8"
}
data = {
    "name": "some_test"
}

response = requests.post(url, headers=headers, json=data)

print(response.status_code)
print(response.text)

我尝试了不同的请求版本,但所有行为都相同。我缺少什么?会不会是另外一个冲突?

python curl python-requests urllib3
1个回答
0
投票

在文档中阅读此内容后,答案很简单(https://docs.python-requests.org/en/latest/user/quickstart/#custom-headers):

使用 headers= 设置的授权标头将被覆盖,如果 凭据在 .netrc 中指定,该凭据又将被覆盖 通过 auth= 参数。请求将在以下位置搜索 netrc 文件 ~/.netrc、~/_netrc 或 NETRC 环境指定的路径 变量。

删除 .netrc 后它就可以工作了。然而,我想知道为什么不能在 .netrc 中定义令牌,但这超出了这个问题的范围。

© www.soinside.com 2019 - 2024. All rights reserved.