和朋友讨论问题的时候,偶然谈到了json_encode的输出问题。 很多人会不加任何头部信息直接eho json_encode,反正我也常常这么干。朋友倒是提醒这样做不规范,应该是要加头部的
和朋友讨论问题的时候,偶然谈到了json_encode的输出问题。
很多人会不加任何头部信息直接eho json_encode,反正我也常常这么干。朋友倒是提醒这样做不规范,应该是要加头部的
header('Content-type:application/json');
加上头部是正确的,但不是必须的。既然你要已json类型的形式输出,那么希望客户端能接受到的数据类型也是json形式的。
下面是thinkphp对json_encode 的封装
/**
* Ajax方式返回数据到客户端
* @access protected
* @param mixed $data 要返回的数据
* @param String $type AJAX返回数据格式
* @param int $json_option 传递给json_encode的option参数
* @return void
*/
protected function ajaxReturn($data,$type='',$json_option=0) {
if(empty($type)) $type = C('DEFAULT_AJAX_RETURN');
switch (strtoupper($type)){
case 'JSON' :
// 返回JSON数据格式到客户端 包含状态信息
header('Content-Type:application/json; charset=utf-8');
exit(json_encode($data,$json_option));
case 'XML' :
// 返回xml格式数据
header('Content-Type:text/xml; charset=utf-8');
exit(xml_encode($data));
case 'JSONP':
// 返回JSON数据格式到客户端 包含状态信息
header('Content-Type:application/json; charset=utf-8');
$handler = isset($_GET[C('VAR_JSONP_HANDLER')]) ? $_GET[C('VAR_JSONP_HANDLER')] : C('DEFAULT_JSONP_HANDLER');
exit($handler.'('.json_encode($data,$json_option).');');
case 'EVAL' :
// 返回可执行的js脚本
header('Content-Type:text/html; charset=utf-8');
exit($data);
default :
// 用于扩展其他返回格式数据
Hook::listen('ajax_return',$data);
}
}
不加头部需要注意的是客户端的js在接受echo出来的json数据的时候是按照文本字符串处理的。加了头部接收到是一个json对象。
下面两种ajax请求的情况是比较常见。
//php端头部不加header的ajax请求
$.ajax({
type:'get',
url:'XXX',
dataType:'json',//不加dataType输出是文本
success:function(res){
console.log(res);//输出json,必须加上dataType参数
}
})
//php端加header的ajax请求
$.ajax({
type:'get',
url:'XXX',
success:function(res){
console.log(res);//res是json对象,可不用加dataType参数
}
})
大家对比两个请求的不同之处,加不加头部对客户端处理数据的时候是有影响的。至于php jons_encode返回值的类型本身是没有影响的,不管有没有头部,它都是返回string类型的数据。
其实也很好理解,header头一般是作用在协议层,也就是http协议层上如何处理数据的。二者还是相对比较独立的。
除特别注明外,本站所有文章均为作者原创。 或分享自己的编程经验,或探讨工作中的问题,或聊以人生趣事。 转载请注明出处来自 https://www.qiusuoweb.com/24.html
运营天数
总访问量
文章数量
-
-
-
交流群:157451741
新浪微博:草莽兴
发布评论