详解http之post
详解http之post
首先,我们先看看jquery中的post方法的使用:
$.ajax({
url:'api/bbg/goods/get_goods_list_wechat',
data:{
'data': JSON.stringify({"offset": ,
"pageSize":
})
},
beforeSend: function(request) {
request.setRequestHeader("BBG-Key", "ab9ef204-3253-49d4-b229-3cc2383480a6");
},
type:'post',
dataType:'json',
success:function(data){
console.log(data);
},
error: function (error) {
console.log(err);
},
complete: function () {
}
});
- url指定访问的接口。
- data表示post键值对。
- beforeSend里我们可以设置请求头。
- type表示请求的方法。
- dataType表示希望获得的数据形式。
- success表示成功后调用的函数。
- error表示失败后调用的函数。
- complete表示请求完成后的函数。
下面主要介绍post提交数据的方式。
我们知道post请求包括状态行、请求头、请求主体。 如下:
<method> <request-URL> <version> --- 状态行
<headers> --- 请求头 <entity-body> --- 请求主体
协议规定, post的数据即ajax中的data必须在请求主体中,但是协议并没有规定你请求主体中的数据格式,所以,这时我们就有自己的空间规定请求主体中的数据格式了。
但是,虽然你发送的格式是各种各样的,但还是要根据服务器端对你的数据的要求来确定,否则服务器端是无法正确解析的。
并且服务器端是根据请求头中的Content-Type字段获知请求主体中的数据是何种方式编码。然后根据格式再对其进行解析。
First --- application/x-www-form-urlencoded
这是最常见的提交post数据的方式,如果在form表单中我们没有设置enctype属性,那么表单最终就会以这种方式来提交数据了。请求类似于下面这样。
POST http://www.example.com HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf- title=test&sub%5B%5D=&sub%5B%5D=&sub%5B%5D=
即在请求主体中的数据都是key1=value1&key2=value2&key3=value3的形式进行编码的, key1就对应于表单中的name属性的值,value1就对应于表单中的value中的值,这样的方式是最为普遍的方式。
大多数服务器端的语言对此都有很好的支持。并且,我们使用jquery、zepto时,默认的content-type的值也是 x-www-form-urlencoded 的编码方式。
之所以说是urlencoded,是因为浏览器会对其中的key和value都使用encodeURIComponent的方法进行编码。 form即为form表单。
举例: 我们登录github,然后找到相应的请求,可以看到请求中的Form Data如下:

这默认就是使用 x-www-form-urlencoded 的方式进行编码数据的,这为什么和上面讲述的不一样呢? 因为这里是parse过得,方便开发者查看,如果我们希望查看像之前所讲的那样的数据,可以点击view source,如下所示:

那么 view URL encoded是什么呢? 即对所有的特殊符号进行编码,类似于对整个URL使用 encodeURI 的方式进行编码是一样的,如下所示:

Second --- multipart/form-data
这也是一种非常常见的形式,比如当一个form表单中含有文件需要上传时,我们就需要将form的enctype的值设置为 multipart/form-data 这样才能成功上传文件。 下面是一个例子:
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 用于分割不同的字段,为了避免和正文内容重复,所以boundry很长很复杂。 且开头就指明了 Content-Type 是用multipart/form-data进行编码的。
消息主题按照字段的个数又分为了多个结构类似的部分。 每一部分都是用--boundry 开始,紧接着就是内容描述信息,接着就是描述字段的具体内容(或者是文本或者是二进制)。 如果包含的是文件,还要包含文件名和文件类型信息。
消息主体最后是用 --boundry--表示结束。
这种方式用来上传文件,各大服务器端语言对之都有很好的支持。
举例: 在知乎中上传图片时,使用的方式就是 multipart/form-data。

然后我们还可以看到请求主体中的内容:

可以看到在请求头中先设置了boundary(即分界线的意思), 然后再在请求主体中使用, 最后以 ------。。。--- 作为结束。
Third --- application/json
现在越来越多的人将 Content-Type 的值用 application 作为响应头, 这用来告诉服务器---消息主体是序列化之后的JSON字符串。
由于JSON规范的流行,除了低版本IE之外的各大浏览器都原生的支持JSON.stringify, 服务器端语言也都有处理JSON的函数, 使用JSON之后是不会遇到什么麻烦的。
好处: JSON格式支持比键值对复杂得多的结构化数据, 这一点很有用。
举例:在知乎中同样可以看到这样的使用方式。

其JSON内容为:

Fourth --- text/xml
使用这种传输方式的具体例子如下:
POST http://www.example.com HTTP/1.1 Content-Type: text/xml <!--?xml version="1.0"?--> <methodcall> <methodname>examples.getStateName</methodname> <params> <param> <value><i4></i4></value> </params> </methodcall>
即其主体为XML格式的。
这种方式使用简单,但是比较臃肿,一般还是JSON用起来更为方便。
详解http之post的更多相关文章
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- Git初探--笔记整理和Git命令详解
几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- Node.js npm 详解
一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...
- .NET应用和AEAI CAS集成详解
1 概述 数通畅联某综合SOA集成项目的统一身份认证工作,需要第三方系统配合进行单点登录的配置改造,在项目中有需要进行单点登录配置的.NET应用系统,本文专门记录.NET应用和AEAI CAS的集成过 ...
随机推荐
- jeecms如何迭代list集合
[@cms_channel_list][#list tag_list as a ]${a.name} [/#list][/@cms_channel_list]使用[XXX_list] 参数为 tag_ ...
- 【C#】CLR内存那点事(初级)
最近回头看了一下书,对内存的理解又有新的认识.我所关注的内存里面说没有寄存器的,所以我关注的只有 托管堆(heap),栈(stack), 字符串常量池(string是一个很特殊的对象) 首先我们看两个 ...
- 「SDOI2017」新生舞会
题目链接 戳我 \(Describe\) 有一场舞会,n个男生,n个女生,要组成n对舞伴,男生i和女生j组队的适合度是\(a_{ij}\), 不适合度是\(b_{ij}\), 让你求\(max(\su ...
- Linux下启动Tomcat项目
在Linux下启动Tomcat项目方法:将war包放进Tomcat的wabapp目录下,进入tomcat目中的bin目录中,运行命令./startup.sh 回车就可以了
- Socket 简易静态服务器 WPF MVVM模式(二)
command类 标准来说,command会有三种模式,委托命令 准备命令 附加命令 1.DelegateCommand 2.RelayCommand 3.AttachbehaviorCommand ...
- Redis在window下安装以及配置
一.安装Redis 1.Redis官网下载地址:http://redis.io/download,下载相应版本的Redis,在运行中输入cmd,然后把目录指向解压的Redis目录. 2.启动服务命令 ...
- Google浏览器历史版和下载地址
Google浏览器历史版本下载地址https://www.slimjet.com/chrome/google-chrome-old-version.php google webdriver下载地址分享 ...
- 【noip2017】【Luogu3960】列队 线段树
题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n \times mn×m 名学生,方阵的 ...
- equals hashcode toString 方法的使用
package com.wu.toString; import java.util.Date; import java.util.GregorianCalendar; /** * * @author ...
- django bug 与陷阱
环境:ubuntu,python3.4 1.QueryDict 陷阱 :以下语句语句是取每行的头元素,其中line应该是一个列表.问题是,line在实际运行中已经不是列表,而变成了列表中的头元素. 错 ...