我遍历了许多与使用Basic Auth触发GET请求有关的类似帖子(例如:Python, HTTPS GET with basic authentication),但仍然无法解决问题。我不断收到错误 requests.exceptions.HTTPError:401客户端错误:未经授权的网址
使用相同的凭据,邮件头在邮递员中的尝试与预期相同。验证了api_key,password的base64encoded值与邮递员中使用的值完全相同,因此我认为它的编码或资源访问权限没有问题。
python -V
Python 3.6.4 :: Anaconda, Inc.
方法1
api_key = 'some_api_key'
password = 'some_password'
headers = {'accept': 'application/json'}
url = 'https://test.access.com/this/url'
api_key_password = "%s:%s" % (api_key, password)
b64_encoded = b64encode(bytes(api_key_password, 'utf-8')).decode("ascii")
headers['authorization'] = 'Basic %s' % b64_encoded
response = requests.get(url,
headers=headers)
if (response.ok):
json_data = json.loads(response.content)
print (json_data)
else:
print (response)
response.raise_for_status()
方法2
api_key = 'some_api_key'
password = 'some_password'
url = 'https://test.access.com/this/url'
headers = {
'accept': 'application/json',
}
response = requests.get(url, headers=headers, auth=(api_key, password))
print (response.ok)
if (response.ok):
json_data = json.loads(response.content)
print (json_data)
else:
print (response)
response.raise_for_status()
能否请您提供一些提示?
答案 0 :(得分:0)
我有一个类似的问题(尽管在.NET Framework中)。
在我的情况下,原因是我使用的URL末尾没有正斜杠,并且该API显然不支持该URL。
所以https://test.access.com/this/url
未经授权引发401错误
但是
https://test.access.com/this/url/
返回200 OK。
答案 1 :(得分:0)
较早的帖子,但我遇到了类似的问题。邮递员将缓存您的JSESSIONID。确保在测试时清除了该cookie。如果击中需要登录API调用才能建立会话的API,然后再进行后续API调用,则此Postman行为会产生错误的安全感。
在这种情况下,对于Python请求,可以使用类似于我在下面提供的代码来处理它:
import requests,json
loginAPI = "https://myapi.myco.comv/someuri/someuri/users/login"
someHTTPGetAPI = "https://myapi.myco.com/someuri/someuri/someservice"
username = "myuser"
password = "mypass"
headers = {
"Content-Type": "application/json",
"login": username,
"password": password
}
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
verify=False
session = requests.Session()
sessionResponse = session.get(url=loginURL,headers=headers, verify=verify)
if sessionResponse.status_code == 200:
getResponse = session.get(url=someHTTPGetAPI)
if getResponse.status_code == 200:
responseJSON = agentStatus.json()