三种POST提交数据方式

0x00 背景

POST是在平日中很常见一种请求方式。相比于GET请求方式来说,POST更加的安全(不会被保存在浏览器历史或WEB服务器日志中)也支持更大的数据传输(GET请求因为是在URL添加参数所以受到URL长度的限制,即只支持2048个字符)。

通过POST提交的数据是需要放在请求头的消息体中,支持的格式主要有下面四种,而对于这四种的识别则是服务器端对请求头的content-tyep参数来进行判断的。

0x01 multipart/form-data

multipart/form-data 是新增的编码类型,以提高二进制文件的传输效率。这种方式一般用来上传文件,各大服务端语言对它也有着良好的支持。 某表单的源代码如下:

<form action="upload.php" enctype="multipart/form-data" method="post">
<input name="myflie" type="file" />
<input type="submit" />

当在该表单输入内容进行提交的时候就会产生一个POST请求,其中的Content-Type参数值就会被设置为multipart/form-data

同时还会因为其特殊的格式增加一个boundary参数,这个参数是一个分隔符,分隔多个文件、表单项,他的值要足够的复杂或者随机,以保证不会与上传表单或者文件的内容出现重复。

请求头部分内容如下:

POST http://www.example.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开始,各个表单的内容使用--boundary分隔开,最后使用--boundary--来结束

0x02 application/x-www-form-urlencoded

这是最常见的POST提交数据的方法了吧。在源代码未知道enctype的时候默认就使用这种方式来提交。请求头类似于这样:

POST http://www.example.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

可以看到消息体中提交的内容使用&进行连接,同时使用了URL编码,所以就像是把GET请求的参数放到消息体中一样。大部分服务端语言都对这种方式有很好的支持。很多时候,我们用 Ajax 提交数据时,也是使用这种方式。例如 JQuery 和 QWrap 的 Ajax,Content-Type 默认值都是「application/x-www-form-urlencoded;charset=utf-8」。

0x03 application/json

由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。同时json可以支持比普通的键值对更加复杂的数据,因此越来越多的人开始使用这种方式进行数据传输。

POST http://www.example.com HTTP/1.1
Content-Type: application/json;charset=utf-8

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

0x04 补充

除了以上的3种情况之外,还有一些特殊的content-type。

参考:四种常见的 POST 提交数据方式对应的content-type取值

原文地址:https://www.cnblogs.com/a-little-bai/p/9689926.html

时间: 2024-10-09 08:15:08

三种POST提交数据方式的相关文章

application/json 四种常见的 POST 提交数据方式

application/json 四种常见的 POST 提交数据方式 四种常见的 POST 提交数据方式 HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文主要讨论 POST 提交数据的几种方式. 我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范.规范把 HTTP 请求分为三个部分:状态行.请求头.消息主

Hive三种不同的数据导出的方式

转自:http://blog.chinaunix.net/uid-27177626-id-4653808.html Hive三种不同的数据导出的方式,根据导出的地方不一样,将这些方法分为三类:(1)导出到本地文件系统 (2)导出到HDFS (3)导出到hive的另一个表中 导出到本地文件系统 执行: hive> insert overwrite local directory '/root/student' > select * from student; 通过insert overwrite

客户端表单提交数据方式与服务器获取数据

表单提交数据的两种方式 表单form的提交有两种方式,一种是get的方法,通过超级链接后面的参数提交过来,一种是post ,通过Form表单提交过来. post方式: <form id="form1" name="form1" method="post" action="login.aspx"> <table width="501" border="0" align=&

三种实现Ajax的方式

本文主要是比较三种实现Ajax的方式 1. prototype.js 2. jquery1.3.2.min.js 3. json2.js Java代码 收藏代码 后台处理程序(Servlet),访问路径servlet/testAjax: package ajax.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.s

C# HttpWebRequest提交数据方式浅析

原文:http://developer.51cto.com/art/200909/149995.htmC# HttpWebRequest提交数据方式其实就是GET和POST两种,那么具体的实现以及操作注意事项是什么呢?那么本文就向你详细介绍C# HttpWebRequest提交数据方式的这两种利器. AD:2014WOT全球软件技术峰会北京站 课程视频发布 C# HttpWebRequest提交数据方式学习之前我们先来看看什么是HttpWebRequest,它是 .net 基类库中的一个类,在命

Objective-C:三种文件导入的方式以及atomic和nonatomic的区别

一.三种文件导入的方式比较: 类的前项声明@class.import.include: 1.采用@class 类名的方式,它会告诉编译器有这么一个类,目前不需要知道它内部的实例变量和方法是如何定义的,后面会告你,现在你就可以直接使用它,节约程序编译时间: 2.采用import方式,能避免重复导入同一类,它导入的不但这个类的所有的内容,而且使用它之前,编译器必须先对类的所有内容走一遍,就是先做预编译处理,这样比较耗费程序编译的时间. 3.采用include方式,不能避免重复导入的问题,但是它用在C

Android Volley框架的几种post提交请求方式

首先简单描述一下Google的Android开发团队在2013年推出的一个网络通信框架Volley.它的设计目标是进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如下载文件等,Volley的表现就不尽如人意. 在app开发中,我们最常见的就是从app客户端向服务端发一个http请求.对于两种基本的web请求方式get和post来说,get请求方式相对比较简单,在此略过不表.本文重点描述一下通过volley进行几种post提交的方式. 1.客户端以普通的post方式进行提交,服务

【转】C# HttpWebRequest提交数据方式

[转]C# HttpWebRequest提交数据方式 HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择.它们支持一系列有用的属性.这两个类位 于System.Net命名空间,默认情况下这个类对于控制台程序来说是可访问的.请注意,HttpWebRequest对象不是利用new关键字通过构 造函数来创建的,而是利用工厂机制(factory mechanism)通过Create()方法来创建的.另外,你可能预计需要显式地调用一个"Send"

iOS五种本地缓存数据方式

iOS五种本地缓存数据方式 iOS本地缓存数据方式有五种:前言 1.直接写文件方式:可以存储的对象有NSString.NSArray.NSDictionary.NSData.NSNumber,数据全部存放在一个属性列表文件(*.plist文件)中. 2.NSUserDefaults(偏好设置),用来存储应用设置信息,文件放在perference目录下. 3.归档操作(NSkeyedArchiver),不同于前面两种,它可以把自定义对象存放在文件中. 4.coreData:coreData是苹果官