专注WEB开发 分享经验,沉淀知识

echo json_encode的几点思考

 作者:chenxing  时间:2017-01-17 20:23  评论:

和朋友讨论问题的时候,偶然谈到了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

发布评论

 提交评论
有人回复时邮件通知我

 评论(0)

站长头像
chenxing(PHP攻城狮)

运营天数

总访问量

文章数量

-

-

-

交流群:157451741

新浪微博:草莽兴

 近期文章

聊聊国产化

 2024-08-24 15:56  97

内网穿透工具frp配置详情

 2024-07-18 22:30  192

mac在终端复制出现乱码00~ *** 01~

 2024-07-16 20:38  43

php html生成图片

 2024-07-08 20:25  82

scp命令使用说明

 2024-07-06 12:14  113

如何在当前目录打开终端

 2024-07-04 14:54  84

 最新评论

 tradeOff: 08月30日 10:19
在某些领域国产化是一个迫不得已的事儿
来源: 聊聊国产化
 sue: 07月03日 10:24
可以
来源: 微信小程序如何获取单个input值
 流年: 07月02日 11:31
不错的尝试
来源: 博客系统如何用markdown编辑器发布文章
 诚心: 09月29日 23:01
学到了
来源: 如何一次性推送百万级别的消息
 Nick: 04月14日 12:26
网上的资料还是太老,都只是取一个元素,解决了一大难题
来源: redis set集合取出一组数据并删除
 skywalker: 11月03日 18:21
简洁明了
来源: mysql 获取某个日期的前一天或后一天