详解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的更多相关文章

  1. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  2. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  3. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  4. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  5. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  6. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  7. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

  8. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  9. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

  10. .NET应用和AEAI CAS集成详解

    1 概述 数通畅联某综合SOA集成项目的统一身份认证工作,需要第三方系统配合进行单点登录的配置改造,在项目中有需要进行单点登录配置的.NET应用系统,本文专门记录.NET应用和AEAI CAS的集成过 ...

随机推荐

  1. 策略与计费控制规则(Policy and Charging Control Rule-PCC Rule)解析及模板样例

    内容 PCC规则定义 PCC规则运行 PCC规则模板 PCC规则定义 参考文档: 3gpp ts 23.203-be0 条款6.3 策略与计费控制规则(PCC Rule),即一系列相关信息与一系列相关 ...

  2. 国外物联网平台(8):Telit

    国外物联网平台(8) ——Telit 马智 定位 We Bring IoT to Life Telit提供世界上最全面的高性能物联网模块.连接服务和软件. 产品体系 模块 Telit提供丰富专业的物联 ...

  3. 吐槽一下wp toolkit ToggleSwitch控件

    之前用法: <toolkit:ToggleSwitch> <toolkit:ToggleSwitch.Header> <TextBlock Text="2323 ...

  4. c# as与is的区别

    在c#语言中关于类型的判断与转换有is和as这2种操作符,具体用法如下: is检查一个对象是否兼任与指定的类型,并返回一个Boolean值:true或false,主要,is操作符永远不会抛出异常,一下 ...

  5. C# 操作 MongoDB

    今项目使用Mongodb,C#操作MongoDB使用MongoDB.Driver.dll库(Nuget),写了个小Demo,如下: using System; using System.Collect ...

  6. WinForm中获取Listbox、DataGridView等控件某行对应的数据

    Listbox:listbox.SelectedItem as XXX DataGridView:dataGridView1.Rows[i].Cells[1].Value.ToString()

  7. IDEA下载与安装

    IntelliJ IDEA号称当前Java开发效率最高的IDE工具. IntelliJ IDEA有两个版本:社区版(Community)和旗舰版(Ultimate). 社区版 是免费的.开源的,但功能 ...

  8. ecliplse集成反编译插件

    言语不清晰,上图最直接 搜索框输入:Decompiler 等待安装: 重启之后进入下面的界面: 8.对反编译器( Decompiler )进行配置 二.配置说明 1.缺省类反编译器(Default C ...

  9. 题解 BZOJ 1002 【[FJOI2007]轮状病毒】

    题目链接 emm…… 正解:矩阵树定理,但是本宝宝不会求基尔霍夫矩阵. 开始考场方法: 手动模拟$n=1--5$时的答案(数不大,~~画画就出来了~~要画上半个小时). 画出来,答案是这样的:$1$ ...

  10. 洛谷P4458 /loj#2512.[BJOI2018]链上二次求和(线段树)

    题面 传送门(loj) 传送门(洛谷) 题解 我果然是人傻常数大的典型啊-- 题解在这儿 //minamoto #include<bits/stdc++.h> #define R regi ...