Как справиться с таймаутами с помощью httplib (python 2.6)? - PullRequest
5 голосов
/ 02 ноября 2010

Я использую httplib для доступа к API через https и мне нужно встроить обработку исключений в случае, если API не работает.

Вот пример подключения:

connection = httplib.HTTPSConnection('non-existent-api.com', timeout=1)
connection.request('POST', '/request.api', xml, headers={'Content-Type': 'text/xml'})
response = connection.getresponse()

Это должно истечь, поэтому я ожидал, что будет сгенерировано исключение, и response.read() просто возвращает пустую строку.

Как я могу узнать, был ли тайм-аут?Еще лучше, как лучше всего изящно справиться с проблемой неработающего API стороннего производителя?

Ответы [ 3 ]

13 голосов
/ 02 ноября 2010

Еще лучше, каков наилучший способ изящно справиться с проблемой неработающего API стороннего производителя?

что значит API не работает, API возвращает http 404, 500 ...

или вы имеете в виду, что API недоступен?

Прежде всего, я не думаю, что вы можете узнать, не работает ли вообще веб-служба, прежде чем пытаться получить к ней доступ,я рекомендую для первого вы можете сделать это следующим образом:

import httplib

conn = httplib.HTTPConnection('www.google.com')  # I used here HTTP not HTTPS for simplify
conn.request('HEAD', '/')  # Just send a HTTP HEAD request 
res = conn.getresponse()

if res.status == 200:
   print "ok"
else:
   print "problem : the query returned %s because %s" % (res.status, res.reason)  

и для проверки, если API недоступен, я думаю, вам будет лучше сделать попытку поймать:

import httplib
import socket

try:
   # I don't think you need the timeout unless you want to also calculate the response time ...
   conn = httplib.HTTPSConnection('www.google.com') 
   conn.connect()
except (httplib.HTTPException, socket.error) as ex:
   print "Error: %s" % ex

Вы можете смешать два способа, если хотите что-то более общее, надеюсь, это поможет

6 голосов
/ 02 ноября 2010

urllib и httplib не предоставляют тайм-аут. Вы должны включить сокет и установить время ожидания там:

import socket
socket.settimeout(10) # or whatever timeout you want
0 голосов
/ 07 апреля 2017

Это то, что я обнаружил, что правильно работает с httplib2. Публикация этого сообщения может помочь кому-то:

    import httplib2, socket

    def check_url(url):
        h = httplib2.Http(timeout=0.1) #100 ms timeout
        try:
            resp = h.request(url, 'HEAD')
        except (httplib2.HttpLib2Error, socket.error) as ex:
            print "Request timed out for ", url
            return False
        return int(resp[0]['status']) < 400
...