1

我正在构建一个调用 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
4

2 回答 2

7

您将repr()输出与对象混淆了。

响应对象有一个.status_code属性,对此进行测试:

if r.status_code == 200:
    break

但是,反复敲击服务直到它给你一个 200 响应可能会阻止你的 IP 地址。构建某种指数回退以防止对 API 进行 DOS 攻击。

于 2013-08-08T17:00:35.520 回答
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')
于 2016-12-01T19:17:48.910 回答