以下 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)
我尝试了不同的请求版本,但所有行为都相同。我缺少什么?会不会是另外一个冲突?
在文档中阅读此内容后,答案很简单(https://docs.python-requests.org/en/latest/user/quickstart/#custom-headers):
使用 headers= 设置的授权标头将被覆盖,如果 凭据在 .netrc 中指定,该凭据又将被覆盖 通过 auth= 参数。请求将在以下位置搜索 netrc 文件 ~/.netrc、~/_netrc 或 NETRC 环境指定的路径 变量。
删除 .netrc 后它就可以工作了。然而,我想知道为什么不能在 .netrc 中定义令牌,但这超出了这个问题的范围。