请求响应总是 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。
我试图了解当我使用请求模块发出 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。