add by zhj: 用ajax发送json数据时注意两点,
第一,使用JSON.stringify()函数将data转为json格式的字符串,如下
data: JSON.stringify({
    a: parseInt($('input[name="a"]').val()),  
    b: parseInt($('input[name="b"]').val()),  
    now: new Date().getTime() // 注意不要在此行增加逗号  

})

第二,contentType: "application/json; charset=utf-8"
(注:$.ajax中的参数dataType相当于accept header)
0.前言
    本文解释如何使用Jquery中的ajax方法传递JSON数据包,传递的方法使用POST(当然PUT又有时也是一个不错的选择)。POST JSON数据包相比标准的POST格式可读性更好些,层次结构也更清晰。
    为了说明问题,前端和后端较为简单,重点突出AJAX的应用。
 
    【前端】——add-post-json.html
图1 add页面

【后端】——add-post-json.php

  1. <?php
  2. // 返回JSON格式
  3. header('Content-Type:application/json;charset=utf-8');
  4. $result = array();
  5. // 获得原始输入内容
  6. $json = file_get_contents("php://input");
  7. //var_dump($input_str);
  8. // JSON转换为PHP对象
  9. $obj = json_decode($json);
  10. $a = $obj->a; // var_dump($a);
  11. $b = $obj->b; // var_dump($b);
  12. $result["result"] = $a + $b;
  13. echo json_encode($result, JSON_NUMERIC_CHECK);
  14. ?>
 
    【代码仓库】——test-jquery-ajax

代码仓库位于bitbucket使用Hg(而不是Git),Hg在windows或ubuntu上均有很好用的GUI工具——TortoiseHg,本人愚笨没能熟练掌握Git。

    【TortoiseHg使用说明】——如果没有使用过Hg请参考博文hg clone部分操作即可。   
    【JQuery 中文API
    【相关博文】
 
1.POST JSON数据包
  1. var submit_sync = function() {
  2. $.ajax({
  3. type: "post",
  4. url: 'add-post-json.php',
  5. async: false, // 使用同步方式
  6. // 1 需要使用JSON.stringify 否则格式为 a=2&b=3&now=14...
  7. // 2 需要强制类型转换,否则格式为 {"a":"2","b":"3"}
  8. data: JSON.stringify({
  9. a: parseInt($('input[name="a"]').val()),
  10. b: parseInt($('input[name="b"]').val()),
  11. now: new Date().getTime() // 注意不要在此行增加逗号
  12. }),
  13. contentType: "application/json; charset=utf-8",
  14. dataType: "json",
  15. success: function(data) {
  16. $('#result').text(data.result);
  17. } // 注意不要在此行增加逗号
  18. });
  19. }
 
【HTTP请求部分内容】
POST /test-jquery-ajax/add-post-json.php HTTP/1.1 
Host: 192.168.1.104 
Connection: keep-alive 
Content-Length: 35 
Accept: application/json, text/javascript, */*; q=0.01 
X-Requested-With: XMLHttpRequest 
Content-Type: application/json; charset=UTF-8 
 
{"a":12,"b":34,"now":1403525674676}
 
【HTTP响应部分内容】
HTTP/1.1 200 OK
Content-Length: 13
Content-Type: application/json;charset=utf-8
 
{"result":46}
 
2.重要说明
【1】
需要使用JSON.stringify,它将js的数据类型转为json格式的字符串: '{"a":12,"b":34,"now":1403525674676}'
如果不用JSON.stringify,那POST消息体是普通的字符串: 'a=12&b=34&now=1403525674676'
以下写法并不能达到POST JSON数据包的效果,这是标准的POST格式。
  1. data: {
  2. a: parseInt($('input[name="a"]').val()),
  3. b: parseInt($('input[name="b"]').val()),
  4. now: new Date().getTime() // 注意不要在此行增加逗号
  5. },
【HTTP请求部分内容】
POST /test-jquery-ajax/add-post-json.php HTTP/1.1 
Host: 192.168.1.104 
Content-Length: 27 
X-Requested-With: XMLHttpRequest 
Content-Type: application/json; charset=UTF-8

a=12&b=34&now=1403525989275

 
【2】
需要强制类型转换parseInt(),否则HTTP请求为 {"a":"12","b":"34"}
以下代码并不能达到预期效果
  1. data: JSON.stringify({
  2. a: $('input[name="a"]').val(),
  3. b: $('input[name="b"]').val(),
  4. now: new Date().getTime() // 注意不要在此行增加逗号
  5. }),
【HTTP请求部分内容】
POST /test-jquery-ajax/add-post-json.php HTTP/1.1 
Host: 192.168.1.104 
Content-Length: 39 
X-Requested-With: XMLHttpRequest 
Content-Type: application/json; charset=UTF-8

{"a":"12","b":"34","now":1403526427890}

 
【3】
IE8兼容,IE7和IE6不支持JSON.stringify,使用请慎重。
 

使用Ajax方式POST JSON数据包(转)的更多相关文章

  1. 前端学习——使用Ajax方式POST JSON数据包

    0.前言     本文解释怎样使用Jquery中的ajax方法传递JSON数据包,传递的方法使用POST(当然PUT又有时也是一个不错的选择).POST JSON数据包相比标准的POST格式可读性更好 ...

  2. django 使用Ajax方式POST JSON数据包

    示例1: js: function SaveAction(){ //点击 保存按键 var senddata = {"type":"A", "host ...

  3. 前端ajax用post方式提交json数据给后端时,网络报错 415

    项目框架:spring+springmvc+mybatis 问题描述:前端ajax用post方式提交json数据给后端时,网络报错 415 前端异常信息:Failed to load resource ...

  4. AJAX如何接收JSON数据

    简介 在我们了解如何使用AJAX返回JSON数据的时候要先明白下列几点 1. JSON如何来表示对象的 2. JSON如何来表示数组的 var object = { "labId" ...

  5. J2EE Web开发入门—通过action是以传统方式返回JSON数据

    关键字:maven.m2eclipse.JSON.Struts2.Log4j2.tomcat.jdk7.Config Browser Plugin Created by Bob 20131031 l ...

  6. jquery通过ajax方法获取json数据不执行success

    1.jquery通过ajax方法获取json数据不执行success回调 问题描述:jquery通过ajax方法获取json数据不执行success回调方法 问题原因:json格式存在问题或不符合标准 ...

  7. c# 生成json数据包

    json数据类型,归根到底就是一个字符串,管他里面什么格式,它就是一个字符串来的! 看一个json数据包: { "touser":"OPENID", " ...

  8. jquery通过ajax方法获取json数据不执行success回调

    问题描述:jquery通过ajax方法获取json数据不执行success回调方法 问题原因:json格式存在问题或不符合标准写法,导致总是执行error回调方法 解决方案:使json格式务必符合下述 ...

  9. spring mvc接收ajax提交的JSON数据,并反序列化为对象

    需求:spring mvc接收ajax提交的JSON数据,并反序列化为对象,代码如下: 前台JS代码: //属性要与带转化的对象属性对应 var param={name:'语文',price:16}; ...

随机推荐

  1. Qtree4——动态点分治

    题目描述 给出一棵边带权的节点数量为n的树,初始树上所有节点都是白色.有两种操作: C x,改变节点x的颜色,即白变黑,黑变白 A,询问树中最远的两个白色节点的距离,这两个白色节点可以重合(此时距离为 ...

  2. (转)在Eclipse中用TODO标签管理任务(Task)

    背景:eclipse是一款功能十分强大的编辑,如果能够熟练运用,必定事半功倍,但如果不求甚解,无疑是给自己制造麻烦. 1 标签的使用 1.1 起因 如上图所示,在程序中有很多todo的标签出现,但是却 ...

  3. git-jenkins-k8s构建tomcat项目实践

    相关环境(部署安装略...):jenkins 安装k8s 集群环境部署docker 私有仓库搭建 jenkins 创建项目 Execute shell 构建docker镜像上传到私有仓库,以构建时间做 ...

  4. bzoj千题计划296:bzoj1053: [HAOI2007]反素数ant

    http://www.lydsy.com/JudgeOnline/problem.php?id=1053 求n以内约数个数最多的数 #include<cstdio> using names ...

  5. Spring RedisTemplate操作-事务操作(9)

    @Autowired @Qualifier("redisTemplate") private RedisTemplate<String, String> stringr ...

  6. [百度地图] 用于类似 DWZ UI 框架的 百度地图 功能封装类 [MultiZMap.js] 实例源码

    MultiZMap 功能说明 MultiZMap.js 本类方法功能大多使用 prototype 原型 实现,它是 ZMap 的多加载版本,主要用于类似 DWZ 这个 多标签的 UI 的框架: 包含的 ...

  7. centos7,php7 安装mysqli扩展

    首先安装MySQL https://www.cnblogs.com/manzb/p/9560403.html   php7安装后没有安装mysqli扩展的话: 安装mysqli扩展 1.到php文件e ...

  8. NVIDIA / Intel 核芯显卡显示 + Nvidia 计算

    今天折腾了好久intel集成显卡显示.最后好不容易才全部搞定,这里记录一下.   1. 首先在BIOS里是要打开Intel 核芯显卡的.我把它设置成了主显卡,显示器也接到核心显卡的口上. 重启后, I ...

  9. [转]python ctypes 探究 ---- python 与 c 的交互

    近几天使用 python 与 c/c++ 程序交互,网上有推荐swig但效果都不理想,所以琢磨琢磨了 python 的 ctypes 模块.同时,虽然网上有这方面的内容,但是感觉还是没说清楚.这里记录 ...

  10. innodb和myisam数据库文件存储详解以及mysql表空间

    数据库常用的两种引擎有Innodb和Myisam,关于二者的区别参考:https://www.cnblogs.com/qlqwjy/p/7965460.html 1.关于数据库的存储在两种引擎的存储是 ...