使用以下wget命令,我可以从希望连接的RESTful接口进行身份验证并获取所需的JSON响应:
wget --auth-no-challenge \
http://myusername:mypasswd@example.com:8090/some/endpoint
问题是当我使用Python 3.6中的请求包进行连接时:
import requests
from requests.auth import HTTPBasicAuth
r = requests.get('http://example.com:8090/some/endpoint', \
auth=HTTPBasicAuth('myusername', 'mypasswd'))
我无法通过身份验证,并获取指示失败的JSON。尝试使用firefox或我的Python脚本进行连接时,使用wireshark跟踪数据包,可以看到未发送授权,并且使用firefox进行连接时,弹出以下对话框:
You are about to log into the site example.com with the username
"myusername" but the website does not require authentication. Do
you wish to continue?
问题似乎与here中描述的情况类似,其中Jenkins服务器未发送401错误,因此无法重试身份验证。还尝试了类似here但没有运气的事情。
那么,有人知道如何使用--auth-no-challenge从wget转换为python3的请求吗?使用urllib的较低级别的内容也可以做到这一点。
编辑:我可以确认以下身份验证并正确返回JSON:
from http.client import HTTPConnection
from base64 import b64encode
c = HTTPConnection("example.com:8090")
headers = { 'Authorization' : 'Basic %s' % userAndPass }
userAndPass = b64encode(b"myusername:mypasswd").decode("ascii")
c.request('GET', '/some/endpoint', headers=headers)
res = c.getresponse()
data = res.read()
因此,使用requests模块将其翻译为某些内容也可以完成这项工作。