HTTP 内容类型标头和 JSON

IT技术 javascript php json http
2021-03-15 13:50:00

出于对未知的恐惧,我一直试图避免使用大多数 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个回答

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

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

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

@RemiGrumeau 什么是“不完全正确”?使用浏览器下载文件是完全不同的。浏览器可能会默认接收 HTML,因此除非另有说明,否则它假定接收到的任何内容都是 HTML。下载时,它会附加.html到文件中,因为这是它的默认设置。
2021-04-27 13:50:00
我不知道这里问题的完整背景——但是,浏览器(和 javascript)有时确实关心 Content-Type。此标头可能会影响浏览器用于显示内容的启发式方法,并且发送内容类型为 text/html 的 XML 和 JSON 通常会在底层 XHR 请求(或在这些请求之上的框架层)中创建细微的错误
2021-04-27 13:50:00
当我有生成 JSON 数据的页面时,我放置了这个标题。因为在 Mozilla Firefox 下,例如没有标题,数据没有被格式化,而有标题它被格式化并且非常可读。
2021-05-04 13:50:00
这并不完全正确。如果你不使用header('Content-Type: application/json');并强制下载,Content-Disposition: attachment; filename=myfile.json那么你最终会得到一个myfile.json.html. 使用此 json 标头,您将获得myfile.json.
2021-05-17 13:50:00

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>
永远不要这样做,它会使用单引号破坏任何字符串(并且在许多语言中很常见): 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\"}"
2021-05-12 13:50:00

下面的代码帮助我在前端为 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);
    });

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

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

更改内容类型修复了问题。