5

我正在使用 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()只返回一个空字符串。

我怎么知道是否有超时?更好的是,优雅地处理 3rd-party api 问题的最佳方法是什么?

4

3 回答 3

13

更好的是,优雅地处理 3rd-party 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

如果你想要更通用的东西,你可以混合这两种方式,希望这会有所帮助

于 2010-11-02T19:18:57.753 回答
6

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

import socket
socket.settimeout(10) # or whatever timeout you want
于 2010-11-02T16:50:32.447 回答
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
于 2017-04-07T20:12:48.267 回答