如何通过urlib2访问错误的响应头?

1 投票
3 回答
1854 浏览
提问于 2025-04-16 17:40

我正在使用Harvest的API(http://www.getharvest.com/api)。当一个客户的使用量超过限制时,系统会返回一个503的响应。在这个响应中,有一个叫做“Retry-After”的头部信息,它告诉我需要等多久才能再试一次。

当调用失败时,我该如何访问响应的头部信息呢?我捕获了HTTPError异常,但不知道怎么从中获取头部信息。

我可以通过exception.read()获取响应的主体内容,但那只是主体,没有头部信息。

以下是一些相关的代码:

try:
    request = urllib2.Request( url=self.uri+url, headers=self.headers )
    r = urllib2.urlopen(request)
    xml = r.read()
    return parseString( xml )
except urllib2.HTTPError as err:
    logger.debug("EXCEPTION: %s" % err.read() )

3 个回答

0

err.read() 会返回内容的主体部分,而 err.info() 则会返回头部信息。

1
(Pdb) pp err.__dict__
{'__iter__': <bound method _fileobject.__iter__ of <socket._fileobject object at 0x2b9a8e923950>>,
 'code': 404,
 'fileno': <bound method _fileobject.fileno of <socket._fileobject object at 0x2b9a8e923950>>,
 'fp': <addinfourl at 47942867504160 whose fp = <socket._fileobject object at 0x2b9a8e923950>>,
 'hdrs': <httplib.HTTPMessage instance at 0x2b9a91964a70>,
 'headers': <httplib.HTTPMessage instance at 0x2b9a91964a70>,
 'msg': 'Not Found',
 'next': <bound method _fileobject.next of <socket._fileobject object at 0x2b9a8e923950>>,
 'read': <bound method _fileobject.read of <socket._fileobject object at 0x2b9a8e923950>>,
 'readline': <bound method _fileobject.readline of <socket._fileobject object at 0x2b9a8e923950>>,
 'readlines': <bound method _fileobject.readlines of <socket._fileobject object at 0x2b9a8e923950>>,
 'url': 'http://www.heise.de/fo'}

所有相关的响应信息都可以从捕获到的异常中获取。

6

试试这个:

   logger.debug(err.headers)

这是一个字典,所以可以用 err.headers['Retry-After'] 来获取信息。

撰写回答