1

我正在尝试开发一个非常简单的概念验证来以流方式检索和处理数据。我请求的服务器将以块的形式发送数据,这很好,但是我在使用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循环外的读取对其进行了初始化,并且从未在循环中更改过它。一旦我将它添加回那里,它就可以完美运行。

所以,简而言之,我只是一个大白痴。

4

2 回答 2

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
于 2013-07-04T14:15:57.230 回答
-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()

我希望它至少是有帮助的。

于 2013-07-03T18:26:01.310 回答