php - 为什么我们在 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 文件中获取数据时使用是强制性的吗?
解决方案
简而言之,这是因为您的 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 一样。
推荐阅读
- spring - 如何在 Spring IOC 中使用 @Autowired 将值注入 Null 对象?
- apache-nifi - 使用 JavaScript 在 NiFi 中转换时区
- javascript - 引导下拉菜单卡在展开位置,不响应按钮
- javascript - 是否可以在 json 中进行表达式/计算?
- java - 如何在 EJB-JPA tx 中停止自动提交
- reporting-services - SSRS 2016 - 加入收藏
- pandas - 使用 Seaborn 绘制箱线图后如何删除异常值?
- tabulator - 有没有办法像 jQuery 一样通过选择器获取 Tabulator 对象?
- javascript - babel 7 忽略当前目录之外的文件
- .net - Visual Studio 2012 离线安装 nuget