HTTP Content-Type标头和JSON

php*_*_qq 129 javascript php json http

好的,所以我一直在努力避免使用大多数HTTP协议的属性,或者为了害怕未知,你怎么可能请它们调用它们.但是我告诉自己,我今天将面临恐惧并开始有目的地使用标题.我一直试图在这里实现的是将json数据发送到浏览器并立即使用它.例如,如果我在就绪状态4上有一个ajax处理函数,看起来像这样

function ajaxHandler(response){
    alert(response.text);
}
Run Code Online (Sandbox Code Playgroud)

我在我的php中设置了内容类型标题

header('Content-Type: application/json');
echo json_encode(array('text' => 'omrele'));
Run Code Online (Sandbox Code Playgroud)

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

Roc*_*mat 125

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

标题就在那里,以便您的应用可以检测返回的数据以及应如何处理它.您需要查看标题,如果它application/json然后将其解析为JSON.

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

  • 这不完全正确.如果你不使用`header('Content-Type:application/json');`并强制下载'Content-Disposition:attachment; filename = myfile.json`然后你最终得到一个`myfile.json.html`.使用这个json头,你将获得`myfile.json`. (11认同)
  • @RemiGrumeau什么是"不完全正确"?使用浏览器下载文件是完全不同的.浏览器可能默认为期望HTML,因此它假定它接收的任何内容都是HTML,除非另有说明.下载时,它会将".html"附加到文件中,因为这是它默认的内容. (4认同)
  • 我不知道问题的完整背景 - 但是,浏览器(和javascript)有时会关心Content-Type.此标头可以影响浏览器用于显示内容的启发式方法,并且使用内容类型的text/html发送XML和JSON通常会在底层XHR请求中创建微妙的错误(或者您的框架层之上的层) (2认同)

小智 15

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

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


小智 7

Content-Type: application/json只是内容标题,内容标题只是有关返回数据类型的信息,ex :: JSON,图像(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
Run Code Online (Sandbox Code Playgroud)

如果要将原始JSON警告为字符串,则添加单引号('):

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

不要使用双引号,它会混淆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>
Run Code Online (Sandbox Code Playgroud)