前言
post请求一般有以下几种方式传递数据,即:form-data、x-www-form-urlencoded、raw、binary
相比与 post 请求,get 请求要简单的多,参数都以url?key1=value1&key2=value2...的方式放在了请求头中,而post请求大多参数数据都是放在请求体(body或者data)中,因此衍生出了多种传递数据的方式,一般 post请求时,参数都是默认放到这里的
注:这里讲的是request上传数据,与response要分开
常见的几种传递数据的方式
下面传递参数同样都是传递下面两个参数
params参数
{"username": "shuai123", "password": "123"}
1、x-www-form-urlencoded
最常见的一种传递方式,post 一种常见传递方式,会把表单数据转换为key-value键值对
且需要转码将 key、value 中的空格替换为加号;将 非ascii 字符做百分号编码;key-value键值对们用 = 和 &连接,请求体内容如下所示
//上传的数据如下所示,跟get一样,但是存放的地方不一样
username=shuai123&password=123
//content-type设置如下所示
content-type: application/x-www-form-urlencoded
2、raw
使用的是纯字符串的数据上传方式,所以在 post之前,可能需要手工的把一些数据转换成字符串形式,raw 可以填充任何格式,并可以指定类型,例如:application/json、text/plain、application/javascript、application/xml、text/xml、text/html等,常用来提交 json、xml 类型的数据
ps:我们平时的 post 大多数基本都是使用 application/json,因为他太方便了,当然也有人使用习惯 urlencoded
{
"username": "shuai123",
"password": "123"
}
3、binary
从字面意思得知,只可以上传二进制数据,通常用来上传文件,因为没有键值,所以一次只能上传一个文件,一般单纯的图片上传服务走的就是这种模式(只不过键值可能是由服务器根据时间等参数生成)
//由于是单个文件二进制流,这里就不标出信息了
//如果硬是要用这个格式传递,那么直接将 username=shuai123&password=123 转化成二进制传递即可,使用分隔符取出即可
//content-type
content-type:application/octet-stream
4、form-data
表示http请求中的multipart/form-data方式,会将表单的数据处理为一条消息,用分割符隔开,可以上传键值对、文件、或全部
上传数据采用了以--开头和结尾的字串作为分割符,把不同的字段分割开来。所以可以同时上传多个文件以及多个键值对,传递内容如下所示
--FormBoundary_SdjlkjlfLFlkslkfjlsljdf
Content-Disposition: form-data; name="username" Content-Type:text/plain;charset=UTF-8 Content-Length:8
shuai123
--FormBoundary_SdjlkjlfLFlkslkfjlsljdf
Content-Disposition: form-data; name="password" Content-Type:text/plain;charset=UTF-8 Content-Length:3
123
--FormBoundary_SdjlkjlfLFlkslkfjlsljdf
form-data传参注意
form-data传参过程中一般都会传递基本类型,即:数字、字符串,数组和对象类型最好以json字符串的方式传递
传递数组类型:如果碰到不可抗力因素(后台跑路时),需要传递数组类型,会发现有重复参数需要传递,那就是数组类型(或者没标记,就是数组),只需要重复传递 key[]=value即可:
//例如传递键值为list, value为[1, 2, 3] 的数组数据时,传递方式如下所示
list[]: 1
list[]: 2
list[]: 3
//没错重复传递就是了,只不过在key后面多加一个[]即可
response返回类型
也就是我们常见的 accept 类型,根据返回结果的类型不同,我们要设置不同的值,常见的有以下⼏种:
普通⽂本:Content-Type="text/plain"
HTML代码 :Content-Type="text/html"
XML代码:Content-Type="text/xml"(注意,是代码!没有返回⼀个XML⽂件这种说法,服务器与浏览器通过IO流来传输,所以只能是某种格式的字符串⽽不是⼀个⽂件)
javascript代码:Content-Type= "text/javascript"
json:Content-Type="application/json"
这个与request上传类似,只不过类型相对比较简单而统一,一般都在客户端控制之内(只需要打印就很容易看出来)
MIME
互联网媒体类,用来标识传递媒体(字符、数字、图片、文件等)类型,用于与后台沟通传递媒体的类型
现在一般都是以 multipart/form-data 方式传递文件,中间方便传递其他参数(不过目前上传文件标记基本上都是file也可能是其他,毕竟现在文件都是使用时根据内部类型信息进行判断,MIME类型也是早期用的比较多的)
默认类型为application/octet-stream 二进制
一般是标记传递单个文件的类型,方便服务器分类(现在实际上都统一当做文件处理,毕竟二进制文件中都有其类型信息)
MIME 的组成结构非常简单,由类型与子类型两个字符串中间用 / 分隔而组成,不允许有空格。type 表示可以被分多个子类的独立类别,subtype 表示细分后的每个类型。
MIME类型对大小写不敏感,但是传统写法都是小写。
两种主要的 MIME 类型在默认类型中扮演了重要的角色:
- text/plain 表示文本文件的默认值。
- application/octet-stream 表示所有其他情况的默认值。
常见的 MIME 类型
- 超文本标记语言文本 .html、.html:text/html
- 普通文本 .txt: text/plain
- RTF 文本 .rtf: application/rtf
- GIF 图形 .gif: image/gif
- JPEG 图形 .jpeg、.jpg: image/jpeg
- au 声音文件 .au: audio/basic
- MIDI 音乐文件 mid、.midi: audio/midi、audio/x-midi
- RealAudio 音乐文件 .ra、.ram: audio/x-pn-realaudio
- MPEG 文件 .mpg、.mpeg: video/mpeg
- AVI 文件 .avi: video/x-msvideo
- GZIP 文件 .gz: application/x-gzip
- TAR 文件 .tar: application/x-tar
最后
这篇文章相信能解决大家开发过程中的一些疑问,记得点赞😂