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

echo json_encode的几点思考

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

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

新浪微博:草莽兴

 近期文章

一年时间又回到这里

 2019-07-27 16:54  155

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

 2018-05-05 01:32  201

PHP如何遍历字符串?

 2018-05-04 00:56  1319

api接口常见的安全问题和解决方案

 2018-05-03 23:20  988

 最新评论

 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变量未定义?
 疯了: 10月10日 13:40
你好呀,我使用docker构建的 把整个项目给了777 并把runtime的所有者给了nginx php的运行者还是报错
来源: thinkphp5的mkdir() Permission denied问题探讨
 mesecretme: 09月30日 15:30
有个问题,有没有发现用redis保存session的话,session清空redis的key还没过期,会依然保留的,这是值变成空了
来源: php项目redis实现session共享案例