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. LANMP环境编译参数查看方法

    nginx编译参数查看:/usr/local/nginx/sbin/nginx -V apache编译参数查看:cat /usr/local/apache2/build/config.nice mys ...

  2. 获取C++类成员虚函数地址

    1.GCC平台 GCC平台获取C++成员虚函数地址可使用如下方法[1]: class Base{ int i; public: virtual void f1(){ cout<<" ...

  3. Cocos2d-x 3.2 打包Android平台APK

    (转自:http://www.cnblogs.com/Richard-Core/p/3855130.html) 从cocos2dx 3.2项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭 ...

  4. js实现数字键盘

    效果图: 1.引入jquery.js文件 2.css样式 <style type="text/css"> #numberkeyboard { border: 1px s ...

  5. Kubernetes HPA

    简介 通过手工执行 kubectl scale 命令或者通过修改deployment的replicas数量,可以实现 Pod 扩容或缩容.但如果仅止于此,显然不符合 Google 对 Kubernet ...

  6. 深入理解JS this,作用域

    深入理解JS this 阮一峰博客链接http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascript.html this ...

  7. 管理KVM虚拟机(二)

    管理KVM虚拟机 工具:libvirt 官网:http://libvirt.org/ 介绍:Libvirt 库是一种实现 Linux 虚拟化功能的 Linux® API,它支持各种虚拟机监控程序,包括 ...

  8. bzoj千题计划105:bzoj3503: [Cqoi2014]和谐矩阵(高斯消元法解异或方程组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3503 b[i][j] 表示i对j是否有影响 高斯消元解异或方程组 bitset优化 #include ...

  9. .NET面试题系列(五)数据结构(Array、List、Queue、Stack)及线程安全问题

    常用数据结构的时间复杂度 如何选择数据结构 Array (T[]) 当元素的数量是固定的,并且需要使用下标时. Linked list (LinkedList<T>) 当元素需要能够在列表 ...

  10. [转] Android 性能分析案例

    Android 系统的一个工程师(Romain Guy)针对Falcon Pro  应用,撰写了一个Android性能分析的文章.该文章介绍了如何分析一个应用哪里出现了性能瓶颈,导致该应用使用起来不流 ...