【问题标题】:how to write 'If response body is JSON()-able'如何编写“如果响应正文是 JSON()-able”
【发布时间】:2020-02-11 21:29:20
【问题描述】:

所以我一直在研究这个问题,但想不出办法。

我需要一种方法来知道响应正文是否可以在不触发回溯的情况下转换为字典。

import requests
import json

session = requests.Session()

url = "www.something.com"
response = session.get(url=url)

if response.json():
    # et cetera

我可能会收到一个纯文本/文本响应正文,其中仅显示“OK”或其他字符串,并且需要一种方法来识别差异。

谢谢!

【问题讨论】:

  • 为什么不检查响应的内容类型标头?
  • 这也是个好办法。你的意思是这样吗?如果 response.header 中有“application/json”:
  • response.headers["Content-Type"].startswith("application/json")̀ 应该没问题。当然,这只适用于正确实现的 API - 相当多的应用程序可以返回完整的垃圾(不正确的内容类型、糟糕的 WP 插件无条件地在 all 响应的末尾添加 HTML 内容等),所以除非您确定您请求的 API 是干净的,否则您仍然需要使用 try/except 块。你当然要先检查响应状态码 ;-)

标签: json python-2.7 dictionary python-requests


【解决方案1】:

我认为这是 try/except 块的完美用例:

try/except 允许你“尝试”一些东西,如果它抛出异常,在 except 命令之后指定的类型,它不会停止你的程序,而是默默地继续 except 块的内容。

见:https://docs.python.org/2/tutorial/errors.html

import requests
import json

session = requests.Session()

url = "http://www.something.com"
response = session.get(url=url)

try:
    content = response.json()
except ValueError:
    # do whatever you want in case response can't be JSON()-able
    content = response.text

print(content)

【讨论】:

  • 但是如果响应是文本,这不会抛出异常吗?
  • @Meeky333 不,它只会以文本而不是 json 的形式返回响应的内容,现在它只是向您展示一种返回响应的方法,无论它是 json 还是纯文本, 但你可以在 except: ValueError 之后做任何你想做的事情
猜你喜欢
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
相关资源
最近更新 更多