Python请求 - 快速知道响应是否是json可解析的

时间:2017-05-16 22:47:02

标签: python json python-requests

我使用Python的requests库编写了一个特定的API包装器。

当它使用requests.get获得响应时,它会尝试解析为json并获取原始内容(如果它不起作用):

resp = requests.get(url, ...)  

try:
    resp_content = resp.json()
except ValueError:
    resp_content = resp.content

return resp_content

这对我的目的是正确的。问题是当下载的响应是图像文件时需要多长时间,例如,如果它很大,那么在输入try和失败json解析并输入{{}之间需要很长时间。 1}}。

(我不知道except是否需要超长才能发生错误,或者如果错误则需要一段时间才能进入.json()

有没有办法查看except是否是json-parsable而不试图用resp解析它?像.json()这样的东西,所以我可以立即知道要采取哪个分支(resp.is_jsonresp.json()),而不是等待30秒(大文件可能需要几分钟)。

编辑:

如上所述,resp.content json解析不常见这种缓慢。它可能与我收到的数据的性质有关(它来自Salesforce REST API,检索Attachment对象的'Body'字段)。

即使这是一种解决方法,我也会将我的解决方案放在这里以防万一策略可以帮助其他人。我意识到我正在进行调用,我通常知道我是否希望响应是二进制数据,所以我可以将一个关键字参数传递给我的包装器函数,告诉它跳过json解析尝试。

requests

然后当我希望响应是文件的数据而不是lil JSON响应时,我传递def SalesforceWrapper(..., attempt_json=True): resp = requests.get(url, ...) try: if attempt_json: resp_content = resp.json() else: resp_content = resp.content except ValueError: resp_content = resp.content return resp_content

4 个答案:

答案 0 :(得分:9)

根据响应的一致性,您可以检查返回的标头是否包含content-type application / json:

resp.headers.get('content-type')

答案 1 :(得分:0)

我会检查前几个100字节并计算像{":这样的json字符数。或者您可以检查图像签名(JFIF,PNG,GIF89A)..

答案 2 :(得分:0)

您可以检查响应头中的内容类型 application/json 是否:

'application/json' in response.headers.get('Content-Type')

答案 3 :(得分:-1)

如果使用 Session 而不是直接请求。(METHOD)

from requests import Session
from simplejson.errors import JSONDecodeError

class MySession(Session):
    def __init__(self, *args, **kwargs) -> None:
        super().__init__(*args, **kwargs)

    def request(self, *args, **kwargs):
        res = super().request(*args, **kwargs)
        json = res.json
        def wrapper():
            try:
                return json()
            except JSONDecodeError:
                return None
        res.json = wrapper
        return res
        
session = MySession()
res = session.get("https://api64.ipify.org")
if res.json():
    print("ok")