HTTP内容类型标头和JSON


144

为了避免未知,我一直试图避免使用大多数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


如果我正确理解,您想text在处理程序中用作javascript变量而不响应?那将是非常奇怪的功能。json_encode还会从您的PHP数组中创建1个对象。因此,当您将此内容导入javascript时,需要将其分配给变量。
Flashin 2013年

4
contentType标头仅是信息。浏览器将尽可能使用它,但是在这种情况下,浏览器只是忽略它,因为它们通常不知道意图是什么。您的Javascript应用程序可以利用它。您假设将显示JSON,因此可以使用对其进行解码JSON.parse()。您可以采取一些不同的措施,或者如果出现错误的contentType则强制执行错误。

1
浏览器不会自动为您解析JSON文本,因此response.text仍然是字符串。
nnnnnn 2013年

1
因此,您的意思是告诉我,设置标头没有什么区别?那么它存在的目的是什么?
php_nub_qq 2013年

2
@php_nub_qq:目的是告诉您服务器返回了什么,以便您的应用程序可以相应地对其进行处理。该浏览器将无法解析JSON为您,您的应用程序需要做到这一点。此标头告诉您它是(或应为JSON)。
火箭Hazmat 2013年

Answers:


136

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

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

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


12
那不是完全正确。如果您不使用header('Content-Type: application/json');并强行下载,Content-Disposition: attachment; filename=myfile.json则最终会出现个myfile.json.html。使用此json标头,您将获得myfile.json
Remi Grumeau

4
@RemiGrumeau什么是“不完全正确”?使用浏览器下载文件是完全不同的。浏览器可能会默认使用HTML,因此除非另有说明,否则它将假定接收到的所有内容均为HTML。下载时,它会追加.html到文件中,因为这是默认设置。
bzeaman

2
我在这里不知道问题的全部内容,但是有时浏览器(和javascript)确实关心Content-Type。此标头可能会影响浏览器用于显示内容的试探法,并且以文本/ html的内容类型发送XML和JSON通常会在基础XHR请求(或框架基础之上)中创建细微的错误
Alan Storm

7

Content-Type: application/json只是内容标题。内容标头只是有关返回数据类型的信息,例如:: JSON,image(png,jpg,..),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>

永远不要这样做,它会在使用单引号引起的任何字符串上中断(并且在许多语言中很常见): echo "'" . json_encode(array('text' => 'it\'s wrong')) . "'"; 会产生以下中断输出:'{"text":"it's wrong"}'。用这个代替:json_encode(json_encode(array('text' => 'it\'s good')))。结果将正确逃脱:"{\"text\":\"it's wrong\"}"
PofMagicfingers

1

以下代码可帮助我在前端为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);
    });
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.