当前位置: 首页 > news >正文

Ajax与json在前后端中的细节解惑

ajax请求JSON

Thinkphp中对是否为Ajax的判断,在TP3.2开发手册中有这么一段:“需要注意的是,如果使用的是ThinkAjax或者自己写的Ajax类库的话,需要在表单里面添加一个隐藏域,告诉后台属于ajax方式提交,默认的隐藏 域名称是ajax(可以通过VAR_AJAX_SUBMIT配置),如果是JQUERY类库的话,则无需添加任何隐藏域即可自动判断。

我还没细看它的源代码,搜到的出处在这里

define('IS_AJAX',   (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'
|| !empty($_POST[C('VAR_AJAX_SUBMIT')])
|| !empty($_GET[C('VAR_AJAX_SUBMIT')])) ? true : false);

很明显下面的对POST和GET的验证就是对应上面说的自己写的ajax的提交隐藏域的验证。那么也就是说上面的$_SERVER['HTTP_X_REQUESTED_WITH'] 的判断就是对 Jquery 的ajax提交的判断了,然后用Firebug查看一个ajax请求,可以看到如图

看到请求头信息中的最后一行,有一个 X-Requested-With,值为 XMLHttpRequest。这个就是jQuery的ajax方法中生成的,当然我们自己写的ajax提交方法也可以这样写,详情可以看这篇文章。我这里点到为止,了解了原理即可。

ajax返回JSON格式服务端

原始写法

$data = array('code'=>'0', 'msg'=>'修改成功');
echo json_encode( $data );

这样写前端得到的结果是一个JSON字符串,需要通过 JSON.parse() 方法才能转成JSON对象使用,注意不要使用eval()这个方法。另外IE低版本可能不原生支持JSON,要引用json2.js函数库。

框架写法

有的框架提供了封装好的ajax json格式返回方法,比如Thinkphp提供了 ajaxReturn($data) 。这个方法得到的结果是一个JSON对象,不需要转换,JS就可以直接使用。

改进原始写法

为什么框架中的方法返回的可以是一个JSON对象呢?这就关系到HTTP Header的知识了。Header状态类型有404,200,403等;Header内容类型有html,图片,视频等等。而JSON对象在Header里的设置是内容类型为JSON,PHP中设置Header的方法非常简单。在echo 前加上 header('Content-type:text/json'); 即可。

$data = array('code'=>'0', 'msg'=>'修改成功');
header('Content-type:text/json');
echo json_encode( $data );

相似的,在使用GD库生成图片(如验证码)时,也需要使用header函数设置类型为图像,如 header("Content-type: image/png;");

ajax返回JSON格式浏览器端

$.get(); 和 $.post(); 得到的是服务端返回的原始数据,比如服务端返回的是字符串则是字符串,返回的是JSON对象就是JSON对象;

$.getJSON(); 得到的是JSON对象或者报错,无论服务端返回的是字符串还是JSON对象。如果服务端返回的数据不符合JSON规格则会报错;

相关文章:

  • SQL Server相关书籍
  • 华为第七届无线编码大赛总结(转)
  • deepinmind(转)
  • NSAttributedString
  • aes加密iOS 实现
  • iOS视频录制,裁剪(输出指定大小)
  • KMP,深入讲解next数组的求解(转载)
  • 初步swift语言学习笔记9(OC与Swift杂)
  • Mysql事务处理
  • UVA 11769 All Souls Night 的三维凸包要求的表面面积
  • html: Table合并行和列
  • win10升级提示图标的四种关闭方法
  • window平台下的MySQL快速安装。(不好意思,未完成待续,请飘过)
  • 教您如何检查oracle死锁,决解死锁
  • openlayers限制地图拖动区域
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • [case10]使用RSQL实现端到端的动态查询
  • 【知识碎片】第三方登录弹窗效果
  • Android Studio:GIT提交项目到远程仓库
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Android组件 - 收藏集 - 掘金
  • Angular 响应式表单 基础例子
  • Docker 笔记(2):Dockerfile
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • JavaScript新鲜事·第5期
  • Java基本数据类型之Number
  • Laravel 中的一个后期静态绑定
  • learning koa2.x
  • leetcode388. Longest Absolute File Path
  • mysql innodb 索引使用指南
  • October CMS - 快速入门 9 Images And Galleries
  • Python 基础起步 (十) 什么叫函数?
  • 初识 beanstalkd
  • 关于List、List?、ListObject的区别
  • 解析带emoji和链接的聊天系统消息
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • ​​​​​​​​​​​​​​Γ函数
  • #pragma 指令
  • $ git push -u origin master 推送到远程库出错
  • (12)Linux 常见的三种进程状态
  • (2)STL算法之元素计数
  • (6)STL算法之转换
  • (八)Spring源码解析:Spring MVC
  • (二)springcloud实战之config配置中心
  • (五)网络优化与超参数选择--九五小庞
  • (转)【Hibernate总结系列】使用举例
  • (转)c++ std::pair 与 std::make
  • ../depcomp: line 571: exec: g++: not found
  • .net FrameWork简介,数组,枚举
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .NET企业级应用架构设计系列之技术选型
  • .so文件(linux系统)
  • @ComponentScan比较
  • @JoinTable会自动删除关联表的数据
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘