繁体   English   中英

轮询API端点-当没有返回JSON时如何重试?

[英]Polling an API endpoint - how do I retry when no JSON is returned?

我正在使用while循环轮询API端点,该循环检查JSON上的.get()方法是否返回None:

    while requests.get(render_execution_url, headers=headers).json().get('finalized_at') is None:
        status = requests.get(render_execution_url, headers=headers).json().get('status')
        status_detail = requests.get(render_execution_url, headers=headers).json().get('status_detail')
        logger.info("status for {} is {}.  detailed status is {}".format(render_execution_url, status, status_detail))

这里的想法是,我们一直在轮询端点,直到填充“ finalized_at”值为止。

不幸的是,当JSON根本不存在时,我们会定期失败:

 File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
   return _default_decoder.decode(s)
 File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
   obj, end = self.raw_decode(s, idx=_w(s, 0).end())
 File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode
   raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

我尝试在方法上使用重试装饰器(请参见下文以了解装饰器语法),但是在遇到此故障时,它似乎没有执行重试。

@retry(stop_max_attempt_number=7, wait_fixed=10000)

当JSON不存在时,是否存在一种优雅的Python方式来处理这种情况(即,在一段时间内重试)?

您的代码太密集,无法轻松区分出需要处理的不同条件,因此您的错误报告无法清楚说明“当JSON根本不存在时”的含义-服务器是否返回404(页面未找到),还是响应数据为空,还是其他?

这是一个重写,它不会每次访问JSON时都访问URL。 它可能无法完全满足您的需求,但应该可以帮助您入门。

while True:
    resp = requests.get(render_execution_url, headers=headers)
    # I assume response status is always 200 or 204 -
    # Really easy to detect a 404 here if that happens.
    if not resp.data:
        time.sleep(WAIT_TIME)
        continue
    rj = resp.json()
    if rj.get('finalized_at') is not None:
        break
    status = rj.get('status')
    status_detail = rj.get('status_detail')
    logger.info("status for {} is {}.  detailed status is {}"
                .format(render_execution_url, status, status_detail))
    time.sleep(WAIT_TIME)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM