HTTP 内容类型标头和 JSON

2022-08-30 02:05:27

我一直试图避免使用大多数HTTP协议的属性,因为害怕未知。

但是,我对自己说,我今天要面对恐惧,并开始有目的地使用标题。我一直在尝试将数据发送到浏览器并立即使用它。例如,如果我在就绪状态 4 上有一个 Ajax 处理程序函数,如下所示:json

function ajaxHandler(response){
    alert(response.text);
}

我已经在我的PHP代码中设置了内容类型标头:

header('Content-Type: application/json');
echo json_encode(array('text' => 'omrele'));

为什么我不能直接从处理程序函数访问属性,当浏览器清楚地被告知传入的数据是?application/json


答案 1

标头仅用作应用程序的信息。浏览器不关心它是什么。浏览器只返回来自 AJAX 调用的数据。如果要将其解析为 JSON,则需要自行执行。Content-Type

标头已存在,因此你的应用可以检测返回了哪些数据以及应如何处理这些数据。您需要查看标头,如果是,则将其解析为 JSON。application/json

这实际上是jQuery的工作原理。如果您不告诉它如何处理结果,它将使用 来检测如何处理它。Content-Type


答案 2

Content-Type: application/json只是内容标头。内容标头只是有关返回数据类型的信息,例如::JSON,image(png,jpg等),html。

请记住,JavaScript 中的 JSON 是一个数组或对象。如果要查看所有数据,请使用控制台.log而不是警报:

alert(response.text); // Will alert "[object Object]" string
console.log(response.text); // Will log all data objects

如果要以字符串形式提醒原始 JSON 内容,请添加单引号 ('):

echo "'" . json_encode(array('text' => 'omrele')) . "'";
// alert(response.text) will alert {"text":"omrele"}

不要使用双引号。它会混淆JavaScript,因为JSON在每个值和键上使用双引号:

echo '<script>var returndata=';
echo '"' . json_encode(array('text' => 'omrele')) . '"';
echo ';</script>';

// It will return the wrong JavaScript code:
<script>var returndata="{"text":"omrele"}";</script>