Как я могу получить доступ к заголовкам ответа на ошибку, используя urlib2?

1

Я использую API Harvest (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() )
Теги:
urllib2

3 ответа

4
Лучший ответ

Попробуйте следующее:

   logger.debug(err.headers)

Это словарь, поэтому используйте err.headers['Retry-After']

  • 0
    Спасибо, это работает. К сожалению, они на самом деле не отправляют заголовок, который, как говорят документы, они отправят :(
  • 0
    Вы проверили с Wireshark / Firebug для точного ответа? может парсинг питона неисправен или что?
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'}

Вся связанная информация об ответе доступна из исключенного пойма.

0

err.read() возвращает тело, а err.info() возвращает заголовки

Ещё вопросы

Сообщество Overcoder
Наверх
Меню