我正在使用requests
调用Aruba的NBAPI来获取移动性主站。他们的文档很少有Python示例。API需要初始身份验证来获取UID,该UID需要在每个get请求中引用。我无法让登录在Python中工作。
我使用的是GET请求,这可能是问题的一部分,但这是我对Aruba提供的curl
示例的理解,使用的是默认的GET
方法。请注意,我也没有验证SSL证书,因为我的最终目标是零接触配置。
下面是他们提供给auth的curl命令
curl --insecure -c "aruba-cookie-jar" -d "username=username&password=password" https://<url-here>:4343/v1/api/login
命令输出:
{"_global_result": {"status":"0", "status_str": "You've logged in successfully.", "UIDARUBA":"<key output here>"}}
我尝试使用‘request’将其转换为python,如下所示
import requests
session = requests.Session()
session.verify = False
r = session.get('https://<url-here>:4343/v1/api/login', auth=('username', 'password'))
当我检查响应(ipython)时,我得到下面的信息
In [6]: r.status_code
Out[6]: 401
In [7]: print(r.text)
{"_global_result": {"status":"1", "status_str": "Unauthorized request, authentication failed"}}
我对这个请求做错了什么?当在Python中使用POST方法时,会产生相同的输出。我认为在我的Python示例中使用的auth
方法是不正确的。
发布于 2019-02-20 03:58:11
您没有提出相同的请求。curl
的-d
开关发送POST数据,而不是authorization标头。从curl
文档中:
-d, --data <data>
( HTTP )将POST请求中的指定数据发送到HTTP服务器,与用户填写HTML表单并按下submit按钮时浏览器执行的方式相同。这将导致curl使用内容类型application/x-www-form-urlencoded将数据传递到服务器。
您使用的是GET请求,而不是POST。在data
参数中发送用户名和密码,您可以在此处使用字典让requests
处理将其编码为application/x-www-form-urlencoded
格式的请求正文:
session = requests.Session()
session.verify = False
login_info = {'username': 'username', 'password': 'password'}
r = session.post('https://<url-here>:4343/v1/api/login', data=login_info)
一般而言,使用curl
命令行示例的应用程序接口文档要求对该工具的熟悉程度较低,因此阅读curl
manpage以了解开关的作用以及对HTTP头等类似内容的了解始终是值得的。
如果有疑问,可以同时使用curl
和requests
将您的请求发送到httpbin.org test site,并比较结果。在这里,结合使用/anything
endpoint和curl
可以实现以下功能:
$ curl --insecure -c "aruba-cookie-jar" -d "username=username&password=password" https://httpbin.org/anything
{
"args": {},
"data": "",
"files": {},
"form": {
"password": "password",
"username": "username"
},
"headers": {
"Accept": "*/*",
"Content-Length": "35",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "curl/7.54.0"
},
"json": null,
"method": "POST",
"origin": "...",
"url": "https://httpbin.org/anything"
}
而您的request
代码输出:
>>> import requests
>>> session.verify = False
>>> r = session.get('https://httpbin.org/anything', auth=('username', 'password'))
/.../lib/python3.8/site-packages/urllib3/connectionpool.py:842: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
warnings.warn((
>>> print(r.text)
{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.21.0"
},
"json": null,
"method": "GET",
"origin": "...",
"url": "https://httpbin.org/anything"
}
希望这能让我们更清楚这里的区别是什么。
https://stackoverflow.com/questions/54773859
复制相似问题