我正在尝试开发一个非常简单的概念验证,以便以流方式检索和处理数据。我请求的服务器将以块的形式发送数据,这很好,但我在使用httplib
迭代块时遇到问题。
以下是我正在尝试的内容: 导入httplib
def getData(src):
d = src.read(1024)
while d and len(d) > 0:
yield d
d = src.read(1024)
if __name__ == "__main__":
con = httplib.HTTPSConnection('example.com', port='8443', cert_file='...', key_file='...')
con.putrequest('GET', '/path/to/resource')
response = con.getresponse()
for s in getData(response):
print s
raw_input() # Just to give me a moment to examine each packet
非常简单。只需打开与服务器的HTTPS连接,请求资源,并一次获取1024字节的结果。我肯定是成功建立了HTTPS连接,所以这根本不是问题。
但是,我发现对src.read(1024)
的调用每次都返回相同的内容。它只返回响应的前1024个字节,显然从不跟踪文件中的光标。
那么我应该如何一次接收1024个字节? read()
上的文档非常稀少。我曾考虑使用urllib或urllib2,但似乎都无法建立HTTPS连接。
HTTPS是必需的,而且我在一个相当受限制的公司环境中工作,像Requests这样的软件包有点难以掌握。如果可能的话,我想在Python的标准库中找到一个解决方案。
原来的代码中我只是忘了更新d
变量。我在yield
循环之外的读取初始化它,并且从未在循环中更改它。一旦我将它添加回去,它就能完美地运作。
所以,简而言之,我只是一个大白痴。
答案 0 :(得分:0)
你的con.putrequest()实际上有效吗?使用该方法执行请求还需要您调用一些其他方法,如官方httplib文档中所示:
http://docs.python.org/2/library/httplib.html
作为使用上述request()方法的替代方法,您 也可以使用这四个功能一步一步地发送您的请求 下方。
putrequest()
putheader()
endheaders()
send()
你有没有理由不使用默认的HTTPConnection.request()函数?
这是我的工作版本,使用request()代替:
import httlplib
def getData(src, chunk_size=1024):
d = src.read(chunk_size)
while d:
yield d
d = src.read(chunk_size)
if __name__ == "__main__":
con = httplib.HTTPSConnection('google.com')
con.request('GET', '/')
response = con.getresponse()
for s in getData(response, 8):
print s
raw_input() # Just to give me a moment to examine each packet
答案 1 :(得分:-1)
您可以使用seek命令将光标与读取一起移动。
这是我对这个问题的尝试。如果我在过程中减少pythonic,我道歉。
if __name__ == "__main__":
con = httplib.HTTPSConnection('example.com', port='8443', cert_file='...', key_file='...')
con.putrequest('GET', '/path/to/resource')
response = con.getresponse()
c=0
while True:
response.seek(c*1024,0)
data =d.read(1024)
c+=1
if len(data)==0:
break
print data
raw_input()
我希望它至少有用。