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

echo json_encode的几点思考

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

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

新浪微博:草莽兴

 近期文章

如何一次性推送百万级别的消息

 2021-02-26 17:57  78

redis set集合取出一组数据并删除

 2021-02-26 12:50  117

一年时间又回到这里

 2019-07-27 16:54  310

PHP字符串转数组的三种场景

 2018-05-05 01:32  336

 最新评论

 Nick: 04月14日 12:26
网上的资料还是太老,都只是取一个元素,解决了一大难题
来源: redis set集合取出一组数据并删除
 skywalker: 11月03日 18:21
简洁明了
来源: mysql 获取某个日期的前一天或后一天
 lisheng: 05月09日 19:26
兴哥牛B加油哈兴哥成功的道路上你又进了一步 哈哈
来源: 一年时间又回到这里
 心态炸裂: 03月24日 10:54
No3.blindcomfirm 多了一个l,望改正!!!
来源: 微信小程序获取input值的总结
 666666: 11月08日 13:49
66666
来源: 一年时间又回到这里
 花花草草: 10月14日 14:58
tp5不是已经提前开了吗
来源: _SESSION变量未定义?