【问题标题】:http request not working - BullionVault APIhttp 请求不起作用 - BullionVault API
【发布时间】:2024-04-11 00:05:02
【问题描述】:

我正在使用 BullionVault API 查看我的订单。

我必须登录才能查看它。
我的问题是,当我尝试使用 HTTP 请求登录时,我的控制台输出是 BUllionVault 登录页面的 HTML DOM。

我使用官方文档中的请求 https://www.bullionvault.com/help/xml_api.html 和 python 语言。

我的登录请求:

payload2 = {'j_username': 'myusername', 'j_password': 'mypassword'}
requests.get("https://or.bullionvault.fr/secure/login.do", params=payload2)

我要求查看我的订单:

requests.get("https://or.bullionvault.fr/secure/view_orders_xml.do")

编辑
感谢@Vikas,我更新了我的代码。

login_page_url = "https://or.bullionvault.fr/secure/login.do"
login_page_url2 = "https://live.bullionvault.com/secure/j_security_check"
payload2 = {'j_username': 'myusername', 'j_password': 'mypassword'}

with requests.Session() as s:

    a = s.get(login_page_url)
    print(s.cookies)
    b = s.get(login_page_url2, params = payload2)
    c = s.get("https://or.bullionvault.fr/secure/view_orders_xml.do")

    print(a)      #output status 200
    print(b)      #output status 200
    print(c)      #output status 200
    print(c.text) #output HTML DOM 

但是我仍然有我的问题:最后一个请求响应是登录页面的 HTML DOM。

解决方案

Bullionvault 已将其 API 更新至 2.0 版。 我的代码中还缺少参数。

login_page_url = "https://or.bullionvault.fr/secure/login.do"
login_page_url2 = "https://live.bullionvault.com/secure/j_security_check"
payload2 = {'j_username': 'myusername', 'j_password': 'mypassword'}
payload3 = {'confirmed': 'true'}
payload4 = {'simple': 'true'}

with requests.Session() as s:
    a = s.get(login_page_url)       
    b = s.post(login_page_url2, data = payload2)
    c = s.get("https://live.bullionvault.com/secure/api/v2/view_orders_xml.do", params = payload3)
    d = s.get("https://live.bullionvault.com/secure/api/v2/view_balance_xml.do", params = payload4)

【问题讨论】:

    标签: python api get httprequest


    【解决方案1】:

    您是否将 JSESSIONID 与后续请求一起传递?在文档中明确提到登录后你会得到一个 JESSIONID

    Please note that our webservers use a session cookie to track your login session (JSESSIONID)

    你应该在标题中传递它们

    headers =  { 'Cookie': 'JSESSIONID=<value>'}
    requests.get("https://or.bullionvault.fr/secure/view_orders_xml.do", headers=headers)
    

    【讨论】:

    • 确实我没有传递任何 JESSIONID。我想我将使用 python 会话对象在会话实例发出的所有请求中保留 cookie。
    • 打印 cookie 时是否看到了 JESSIONID
    • 您也可以对您发送的标头进行print s.request.headers 吗?
    • 我看到一个 JSESSIONID 和 print s.headers 输出 {'User-Agent': 'python-requests/2.9.1', 'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*'}
    • 头部不应该有cookie吗?
    最近更新 更多