我正在使用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问题的最佳方法是什么?
答案 0 :(得分:13)
更好的是,优雅地处理第三方api问题的最佳方法是什么?
什么意思API失效,API返回http 404,500 ...
或者您的意思是什么时候无法访问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
如果你想要更通用的东西,你可以混合两种方式,希望这会有所帮助
答案 1 :(得分:6)
urllib和httplib不会暴露超时。您必须包含套接字并在那里设置超时:
import socket
socket.settimeout(10) # or whatever timeout you want
答案 2 :(得分:0)
这是我发现使用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