我使用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_json
或resp.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
。
答案 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")