首页 > 解决方案 > 为什么我们在 AJAX 调用中不需要 dataType: "json" (有条件地)?

问题描述

dataType: "json"我注意到如果服务器文件已经是格式,我们不需要包含在我们的 AJAX 调用中.json,例如

索引.html

$.ajax({
    url: "ajax/test.json",
    data: "id="+id,
    cache: false,
    type: "POST",
    success: function(response){
        // Some more stuff here...
    }
});

测试.json

{ 
    "fname" : "Aileen", 
    "lname" : "Brown", 
    "email" : "ab@gmail.com", 
    "phone" : "1234567890", 
    "country" : "USA" 
}

但是如果我们必须通过 MySQL 数据库从 PHP 文件中获取上述内容

索引.html

$.ajax({
    url: "ajax/test.php",
    data: "id="+id,
    cache: false,
    type: "POST",
    dataType: "json",
    success: function(response){
        // Some more stuff here...
    }
});

测试.php

<?php
$data = array(
                "fname"     => "Aileen",
                "lname"     => "Brown",
                "email"     => "ab@gmail.com",
                "phone"     => "1234567890",
                "country"   => "USA"
            );

// Convert PHP array into JSON object
echo json_encode($data);
?>

这个服务器 PHP 文件通过 Web 浏览器控制台中的 AJAX 调用的响应以与我的test.json文件相同的 JSON 格式收集。

{"fname":"Aileen","lname":"Brown","email":"ab@gmail.comk","phone":"1234567890","country":"USA"}

dataType: "json"如果来自服务器的数据格式相同,那么任何人都可以正确解释为什么当必须从 PHP 文件而不是 JSON 文件中获取数据时使用是强制性的吗?

标签: phpjson

解决方案


简而言之,这是因为您的 PHP 代码中存在错误。

任何带有正文的 HTTP 请求或响应Content-Type在标头中都有一个匹配项,以描述它是什么类型的数据。

默认情况下,jQuery 会根据Content-Type它附带的 header 来解析它得到的响应。dataType导致它忽略该标头(并Accept在请求上设置标头)。

如今,大多数 Web 服务器都是默认配置的,因此具有.json文件扩展名的文件会获得Content-Type: application/json标头。

任何 PHP 程序都会再次默认输出一个Content-Type: text/html标头,除非使用该header函数覆盖。

由于您的 PHP 不包含header("Content-Type: application/json")它,它会告诉 Web 浏览器它正在发送 HTML,并且 jQuery 会尝试解析 JSON,就好像它是 HTML 一样。


推荐阅读