如何使用httplib(python 2.6)处理超时?

2024-06-13 16:25:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用httplib通过https访问api,并且需要在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关闭的问题?


Tags: httpscomapi示例responserequesttimeoutxml
3条回答

这就是我发现的正确使用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

urllib和httplib不公开超时。必须包含套接字并在其中设置超时:

import socket
socket.settimeout(10) # or whatever timeout you want

Even better, what's the best way to gracefully handle the problem of a 3rd-party api being down?

什么意思是API坏了,API返回htp404500。。。

或者你的意思是当API无法访问时?

首先,在尝试访问web服务之前,我不认为您可以知道该服务是否已关闭,因此我建议您首先这样做:

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

如果你想要更一般的东西,你可以把这两种方法混合起来,希望这会有帮助

相关问题 更多 >