请求响应总是 JSON 吗?

Is a request response always JSON?

我试图了解当我使用请求模块发出 POST 请求时我到底得到了什么 — 它总是 JSON 吗?似乎我收到的每条回复都是 JSON,但我不确定。

其中 r 是我的响应对象,当我这样做时:

print r.apparent_encoding

好像总是returnascii

当我尝试 type() 时:

>>>print type(r)
<class 'requests.models.Response'

我将 print r.text 的输出粘贴到 JSON 验证器中,它没有报告任何错误。那么我应该假设 Requests 在这里为我提供 JSON 对象吗?

,POST 请求的响应文本完全取决于网络服务。一个好的 REST API 将始终以 JSON 响应,但您不会总是得到它。

例子

PHP 中的一个常见模式是

<?php

$successful_whatever = false;

if (isset($_POST['whatever'])) {
    # put $_POST['whatever'] in a database
    $successful_whatever = true;
}

echo $twig->render('gallery.twig',
                   array('successful_whatever' => $successful_whatever));

?>

如您所见,响应文本将是呈现的模板 (HTML)。我不是说它好,只是它很普通。

响应可以是任何内容。如果您 post 访问了 REST 端点,它通常会响应 JSON。如果是这样,requests 将检测到它并允许您通过 .json() 方法对其进行解码。

但是您完全有可能 post 进入普通网络 URL,实际上假装是浏览器,除非服务器正在做一些非常聪明的事情,否则它只会响应标准 HTML 它将提供给浏览器。在这种情况下,执行 response.json() 将引发 ValueError。