162

出于对未知的恐惧,我一直试图避免使用大多数 HTTP 协议的属性。

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

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

我已经在我的 PHP 代码中设置了 content-type 标头:

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

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

4

5 回答 5

147

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

标头在那里,因此您的应用程序可以检测返回的数据以及应如何处理它。您需要查看标头,如果是,则将其application/json解析为 JSON。

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

于 2013-12-16T20:48:48.940 回答
11

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>
于 2014-07-21T06:06:12.203 回答
3

这很旧,但对我来说 PHP8 如果设置了字符集示例,它就可以工作。

header('Content-Type: application/json; charset=utf-8');
echo json_encode(array('text' => 'eggs'));
于 2022-02-08T14:07:03.807 回答
1

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

我的模板代码

模板文件.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);
    });
于 2016-03-04T21:22:53.930 回答
0

最近遇到了一个问题,当响应标头将内容类型标记为“text/html”时,Chrome 扩展程序破坏了 JSON 流。

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

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

于 2020-09-03T17:22:08.187 回答