【发布时间】:2013-07-23 05:45:52
【问题描述】:
我正在努力使用 Python 和请求访问流式 API。
API 说明:“我们启用了流式端点,以使用持久的 HTTP 套接字连接来请求报价和交易数据。来自 API 的流式数据包括发出经过身份验证的 HTTP 请求并让 HTTP 套接字对不断接收数据。”
我是如何尝试访问数据的:
s = requests.Session()
def streaming(symbols):
url = 'https://stream.tradeking.com/v1/market/quotes.json'
payload = {'symbols': ','.join(symbols)}
return s.get(url, params=payload, stream=True)
r = streaming(['AAPL', 'GOOG'])
Requests 文档here 展示了两件有趣的事情:使用生成器/迭代器来处理分块数据,并在数据字段中传递。对于流式数据,建议使用如下代码:
for line in r.iter_lines():
print(line)
似乎都不起作用,虽然我不知道在生成器函数中放什么,因为这个例子不清楚。使用 r.iter_lines(),我得到输出:"b'{"status":"connected"}{"status":disconnected"}'"
我可以访问标头,响应为 HTTP 200,但无法获取有效数据,或者找到有关如何在 python 中访问流式 HTTP 数据的明确示例。任何帮助,将不胜感激。 API 建议使用 Jetty for Java 来保持流打开,但我不确定如何在 Python 中执行此操作。
标头:{'connection': 'keep-alive', 'content-type': 'application/json', 'x-powered-by': 'Express', 'transfer-encoding': 'chunked'}
【问题讨论】:
-
将您的网址放入我的浏览器会返回“无效的授权标头”消息。您需要进行身份验证吗?和/或,您是否正确读取 JSON 格式的结果?
-
@verbsintransit 如果 OP 看到
200 OK,那么显然他已经完成了身份验证。 -
API 确实需要身份验证。为简单起见,我省略了 auth 行。我会发布密钥,但它们与我的交易账户相关联。对于非流式请求,我使用 Request 的 .json()。我可能也需要在这里这样做 - 不确定。
-
最初错过了 200 响应,我的错。只是还想说api键的一个好习惯是通过单独的函数从文件中读取它们。这样你就可以不用担心复制/粘贴代码 sn-ps,如果你使用 git,很容易将该文件包含在 .gitignore 中。
标签: python http streaming python-requests chunked-encoding