我正在构建一个调用API的网络应用。我目前正在使用的API(它波动)有一个210秒的重生时间(可能不是正确的术语)。
请求中的API调用是:
r = requests.post(url ,headers=headers, auth=auth, data=json.dumps(data))
通话后r
可以等于<Response [404]>
或<Response [200]>
。我想运行此API调用,直到它返回<Response [200]>
。 <Response [200]>
的格式是什么?
我目前的循环如下。有更好的方法吗?
while True:
r = requests.post(url ,headers=headers, auth=auth, data=json.dumps(data))
if (r == '<Response [200]>'): break
答案 0 :(得分:6)
您将repr()
输出与对象混淆。
响应对象有一个.status_code
attribute,对此进行测试:
if r.status_code == 200:
break
但是,要反复敲定服务直到它给出200响应,可能会阻止您的IP地址。构建某种exponential back-off以防止对API进行DOS操作。
答案 1 :(得分:0)
我刚刚在https://stackoverflow.com/a/40918529/2398354分享了一个可能值得重复的解决方案。
您可以尝试使用HTTPAdapter请求。以下内容应该有效:
import time
import httplib
import requests
from requests.adapters import HTTPAdapter
class RetryHTTPAdapter(HTTPAdapter):
SECONDS_BETWEEN_RETRIES = 5
def __init__(self, retry_time=120, *args, **kwargs):
self.retry_time = retry_time
super(RetryHTTPAdapter, self).__init__(*args, **kwargs)
def send(self, *args, **kwargs):
for _ in range(int(self.retry_time / self.SECONDS_BETWEEN_RETRIES)):
response = super(RetryHTTPAdapter, self).send(*args, **kwargs)
if response.status_code == httplib.OK:
break
time.sleep(self.SECONDS_BETWEEN_RETRIES)
return response
s = requests.Session()
s.mount('http://', RetryHTTPAdapter(retry_time=180))
s.mount('https://', RetryHTTPAdapter(retry_time=180))
s.get('http://example.com')