了解Python HTTP流

Tur*_*ute 4 python streaming http chunked-encoding python-requests

我正在努力使用Python和Requests访问流API.

API说的是:"我们已经启用了一个流端点,用于通过持久的HTTP套接字连接请求报价和交易数据.来自API的流数据包括发出Authenticated 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'])
Run Code Online (Sandbox Code Playgroud)

这里的请求文档显示了两个感兴趣的东西:使用生成器/迭代器与分块数据一起使用,在数据字段中传递.对于流数据,它建议使用如下代码:

for line in r.iter_lines():
    print(line)
Run Code Online (Sandbox Code Playgroud)

似乎没有效果,虽然我不知道在生成器功能中放什么,因为这个例子不清楚.使用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'}

小智 9

正如verbsintransit所述,您需要解决您的身份验证问题,但是您可以使用此示例修复流式传输问题:

s = requests.Session()

def streaming(symbols):
    payload = {'symbols': ','.join(symbols)}
    headers = {'connection': 'keep-alive', 'content-type': 'application/json', 'x-powered-by': 'Express', 'transfer-encoding': 'chunked'}
    req = requests.Request("GET",'https://stream.tradeking.com/v1/market/quotes.json',
                           headers=headers,
                           params=payload).prepare()

    resp = s.send(req, stream=True)

    for line in resp.iter_lines():
        if line:
            yield line


def read_stream():

    for line in streaming(['AAPL', 'GOOG']):
        print line


read_stream()
Run Code Online (Sandbox Code Playgroud)

if line:条件是检查是否line是一个实际的消息,或只是一个连接保持.


小智 3

不确定您是否明白这一点,但 TradeKing 不会在 JSON blob 之间添加换行符。因此,您必须使用 iter_content 逐字节获取它,将该字节附加到缓冲区,尝试解码缓冲区,成功后清除缓冲区并生成结果对象。:(