首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >轮询API端点-没有返回JSON时如何重试?

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

Stack Overflow用户
提问于 2019-03-07 00:47:49
回答 1查看 771关注 0票数 0

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

代码语言:javascript
运行
复制
    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根本不存在时,我们会周期性地收到失败:

代码语言:javascript
运行
复制
 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

我尝试在该方法上使用重试修饰器(参见下面的修饰器语法),但当我遇到此故障时,它似乎没有执行重试。

代码语言:javascript
运行
复制
@retry(stop_max_attempt_number=7, wait_fixed=10000)

当JSON不存在时,有没有一种优雅的、Pythonic式的方法来处理这种情况(即,在一段时间内重试)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-07 01:06:26

您的代码太过密集,无法轻松区分出您需要处理的不同条件,因此您的错误报告没有明确说明“当JSON根本不存在时”到底是什么意思--服务器是否返回404 (Page Not Found),或者响应数据是空的,还是其他什么?

这是一次重写,它不会在每次访问JSON时都访问URL。它可能不能完全满足你的需求,但它应该会给你一个开始。

代码语言:javascript
运行
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55028225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档