php采用ajax数据提交post与post常见方法总结


Posted in PHP onNovember 10, 2014

本文实例讲述了php采用ajax数据提交post与post常见方法。分享给大家供大家参考。具体方法如下:

在很多情况下我们使用ajax是不会有什么问题的,但有时会碰到ajax数据提交post不完整的问题,这里举例给大家分析一下。

下边是一个标准的ajax请求代码,正常情况下是不会有任何问题的,但是,在特定情况下就会出现问题,比如,username=fdas&321的时候,或者参数值中出现了&符号,经过了N多遍测试,发现数据都传输了,但是打印出来数据是半截,最后仔细观察头信息发现传输的头不对,问题定位到了js上,发现字符串拼接的方式会造成这种问题username=fdas&321&password=password这样就是错误了的。所以我们需要把传输的数据变成 {username:username,passsword:password}这种json格式即可避免问题!

示例代码如下:

$(".submit").bind('click',function(){

var username = $("input[name='username']").val();

$.ajax({

url:"post",

type:"post",

dataType:"json",

data:"username="+username+"&password="+password,

timeout:5000,

error:function(){

alert(1)

},

success:function(){

}

})

})

补充:四种常见的 POST 提交数据方式

① application/x-www-form-urlencoded

这应该是最常见的 POST 提交数据的方式了。浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。请求类似于下面这样(无关的请求头在本文中都省略掉了):

POST https://3water.com HTTP/1.1

Content-Type: application/x-www-form-urlencoded;charset=utf-8

 

title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3

首先,Content-Type 被指定为 application/x-www-form-urlencoded;其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式有很好的支持。例如 PHP 中,$_POST['title'] 可以获取到 title 的值,$_POST['sub'] 可以得到 sub 数组。

很多时候,我们用 Ajax 提交数据时,也是使用这种方式。例如 JQuery 和 QWrap 的 Ajax,Content-Type 默认值都是「application/x-www-form-urlencoded;charset=utf-8」。

② multipart/form-data

这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 form 的 enctyped 等于这个值。直接来看一个请求示例:

POST https://3water.com HTTP/1.1

Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA

 

------WebKitFormBoundaryrGKCBY7qhFd3TrwA

Content-Disposition: form-data; name="text"

 

title

------WebKitFormBoundaryrGKCBY7qhFd3TrwA

Content-Disposition: form-data; name="file"; filename="chrome.png"

Content-Type: image/png

 

PNG ... content of chrome.png ...

------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

这个例子稍微复杂点。首先生成了一个 boundary 用于分割不同的字段,为了避免与正文内容重复,boundary 很长很复杂。然后 Content-Type 里指明了数据是以 mutipart/form-data 来编码,本次请求的 boundary 是什么内容。消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 --boundary 开始,紧接着内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 --boundary-- 标示结束。关于 mutipart/form-data 的详细定义,请前往 rfc1867 查看。

这种方式一般用来上传文件,各大服务端语言对它也有着良好的支持。
上面提到的这两种 POST 数据的方式,都是浏览器原生支持的,而且现阶段原生 form 表单也只支持这两种方式。但是随着越来越多的 Web 站点,尤其是 WebApp,全部使用 Ajax 进行数据交互之后,我们完全可以定义新的数据提交方式,给开发带来更多便利。

③ application/json

application/json 这个 Content-Type 作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。

JSON 格式支持比键值对复杂得多的结构化数据,这一点也很有用。记得我几年前做一个项目时,需要提交的数据层次非常深,我就是把数据 JSON 序列化之后来提交的。不过当时我是把 JSON 字符串作为 val,仍然放在键值对里,以 x-www-form-urlencoded 方式提交。

Google 的 AngularJS 中的 Ajax 功能,默认就是提交 JSON 字符串。例如下面这段代码:

var data = {'title':'test', 'sub' : [1,2,3]};

$http.post(url, data).success(function(result) {

...

});

最终发送的请求是:
POST https://3water.com HTTP/1.1

Content-Type: application/json;charset=utf-8

 

{"title":"test","sub":[1,2,3]}

这种方案,可以方便的提交复杂的结构化数据,特别适合 RESTful 的接口。各大抓包工具如 Chrome 自带的开发者工具、Firebug、Fiddler,都会以树形结构展示 JSON 数据,非常友好。但也有些服务端语言还没有支持这种方式,例如 php 就无法通过 $_POST 对象从上面的请求中获得内容。这时候,需要自己动手处理下:在请求头中 Content-Type 为 application/json 时,从 php://input 里获得原始输入流,再 json_decode 成对象。一些 php 框架已经开始这么做了。

当然 AngularJS 也可以配置为使用 x-www-form-urlencoded 方式提交数据。

④ text/xml

之前提到过 XML-RPC(XML Remote Procedure Call)。它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。典型的 XML-RPC 请求是这样的:

POST https://3water.com HTTP/1.1

Content-Type: text/xml

 

<!--?xml version="1.0"?-->

<methodcall>

<methodname>examples.getStateName</methodname>

<params>

<param>

<value><i4>41</i4></value>

 

</params>

</methodcall>

XML-RPC 协议简单、功能够用,各种语言的实现都有。它的使用也很广泛,如 WordPress 的 XML-RPC Api,seo/seo.html" target="_blank">搜索引擎的 ping 服务等等。JavaScript 中,也有现成的库支持以这种方式进行数据交互,能很好的支持已有的 XML-RPC 服务。不过,我个人觉得 XML 结构还是过于臃肿,一般场景用 JSON 会更灵活方便。

希望本文所述对大家的PHP程序设计有所帮助。

PHP 相关文章推荐
WML,Apache,和 PHP 的介绍
Oct 09 PHP
给初学PHP的5个入手程序
Nov 23 PHP
PHP常用代码
Nov 23 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
Oct 25 PHP
PHP缓存技术的多种方法小结
Aug 14 PHP
MyEclipse常用配置图文教程
Sep 11 PHP
php循环table实现一行两列显示的方法
Jun 04 PHP
PHP实现批量上传单个文件
Dec 29 PHP
php获取POST数据的三种方法实例详解
Dec 20 PHP
php注册审核重点解析(数据访问)
May 23 PHP
PHP htmlentities()函数用法讲解
Feb 25 PHP
php 的多进程操作实践案例分析
Feb 28 PHP
php学习笔记之面向对象
Nov 08 #PHP
php学习笔记之基础知识
Nov 08 #PHP
推荐一款MAC OS X 下php集成开发环境mamp
Nov 08 #PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
Nov 08 #PHP
php中file_get_contents与curl性能比较分析
Nov 08 #PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
Nov 08 #PHP
PHP中使用循环实现的金字塔图形
Nov 08 #PHP
You might like
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
2007/12/11 PHP
解析PHP高效率写法(详解原因)
2013/06/20 PHP
php版微信公众账号第三方管理工具开发简明教程
2016/09/23 PHP
thinkPHP5 ACL用户权限模块用法详解
2017/05/10 PHP
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
浅谈JavaScript字符集
2014/05/22 Javascript
jquery实现网页的页面平滑滚动效果代码
2015/11/02 Javascript
js实现多图左右切换功能
2016/08/04 Javascript
EasyUI为Numberbox添加blur事件的方法
2017/03/05 Javascript
剖析Angular Component的源码示例
2018/03/23 Javascript
Vuex mutitons和actions初使用详解
2019/03/04 Javascript
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
浅谈vue中使用编辑器vue-quill-editor踩过的坑
2020/08/03 Javascript
Python Tkinter模块实现时钟功能应用示例
2018/07/23 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
2019/07/22 Python
在Python3 numpy中mean和average的区别详解
2019/08/24 Python
python json 递归打印所有json子节点信息的例子
2020/02/27 Python
Django配置Bootstrap, js实现过程详解
2020/10/13 Python
Python将QQ聊天记录生成词云的示例代码
2021/02/10 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
css3中单位px,em,rem,vh,vw,vmin,vmax的区别及浏览器支持情况
2016/12/06 HTML / CSS
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
阿根廷首家户外用品制造商和经销商:Montagne
2018/02/12 全球购物
Regatta官网:英国最受欢迎的户外服装和鞋类品牌
2019/05/01 全球购物
JD Sports澳洲官网:英国领先的运动鞋和运动时尚零售商
2020/02/15 全球购物
超级搞笑检讨书
2014/01/15 职场文书
护士演讲稿优秀范文
2014/04/30 职场文书
植树节标语
2014/06/27 职场文书
高中学生自我评价范文
2014/09/23 职场文书
学校拾金不昧表扬信
2015/01/16 职场文书
大学生团日活动总结
2015/05/06 职场文书
秋收起义观后感
2015/06/11 职场文书
【海涛教你打DOTA】虚空假面第一视角骨弓3房29杀
2022/04/01 DOTA
Python实现自动玩连连看的脚本分享
2022/04/04 Python
Python实现双向链表基本操作
2022/05/25 Python
Docker容器harbor私有仓库部署和管理
2022/08/05 Servers