如何在httplib中处理超时(python 2.6)?
我正在使用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宕机的最佳方法是什么?
3 个回答
1
这是我发现使用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
13
更好的是,如何优雅地处理第三方接口(API)出现故障的问题呢?
接口(API)出现故障是什么意思呢?是说接口返回了404、500等错误吗?
还是说接口根本无法访问?
首先,我觉得在你尝试访问一个网络服务之前,是无法知道它是否出现故障的。所以我建议你可以先这样做:
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)
如果你想检查接口是否无法访问,我觉得使用“尝试捕获”的方式会更好:
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
urllib和httplib这两个库没有直接提供设置超时的功能。你需要引入socket库,然后在这里设置超时时间:
import socket
socket.settimeout(10) # or whatever timeout you want