post请求上传数据的几种方式

2,414 阅读5分钟

前言

post请求一般有以下几种方式传递数据,即:form-datax-www-form-urlencodedrawbinary

相比与 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

最后

这篇文章相信能解决大家开发过程中的一些疑问,记得点赞😂