HTTP 内容类型头和 JSON

我一直试图避免使用 HTTP 协议的大部分属性,以免出现未知的情况。

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

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

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

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

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

1031084 次浏览

Content-Type头只是用作应用程序的信息。浏览器不在乎它是什么。浏览器只返回 AJAX 调用中的数据。如果希望将其解析为 JSON,则需要自己解析。

标题就在那里,所以你的应用程序可以检测什么数据被返回,以及它应该如何处理它。您需要查看头部,如果它是 application/json,则将其解析为 JSON。

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

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

请记住,JavaScript 中的 JSON 是一个数组或对象。如果希望查看所有数据,请使用 console.log 而不是 alert:

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>

下面的代码帮助我在前端为 JavaScript 返回一个 JSON 对象

我的模板代码

Template _ file. json

{
"name": "\{\{name}}"
}

Python 支持的代码

def download_json(request):
print("Downloading JSON")
# Response render a template as JSON object
return HttpResponse(render_to_response("template_file.json",dict(name="Alex Vera")),content_type="application/json")

文件 url.py

url(r'^download_as_json/$', views.download_json, name='download_json-url')

前端的 jQuery 代码

  $.ajax({
url:'{% url 'download_json-url' %}'
}).done(function(data){
console.log('json ', data);
console.log('Name', data.name);
alert('hello ' + data.name);
});

最近遇到了这个问题和一个 Chrome 扩展,当响应头标记为“ text/html”时,损坏了一个 JSON 流。

显然,扩展可以并且将使用响应头在浏览器处理内容之前更改内容。

更改内容类型解决了这个问题。

这是旧的,但对我来说 PHP8它的工作,如果字符集是设置例子。

header('Content-Type: application/json; charset=utf-8');
echo json_encode(array('text' => 'eggs'));