Post请求中form-data和x-www-form等格式的区别
使⽤post请求发送数据时候,数据会放在body部分⽽不是头信息中,⽽数据放在body中传输时候,我们可以将这个body中的信息看作是⼀个长长的单个字符串,⽽我们使⽤不同的编码就是将这个数据⽤不同的形式进⾏发送。
application/x-www-form-urlencoded
原理
它是post的默认格式,它默认使⽤了⼀些特殊的符号作为分割符,例如&(ascii码为0x26), =(0x3D), (空格)等,我们input中的name、value信息会发送时使⽤=连接,不同的input之间使⽤&连接;在接收端使⽤相同⽅式进⾏解码,⼀旦遇到&,=等字符将会按照规定将这个长字节断开,还原为原来key:value 形式的数据,以供我们使⽤。所以使⽤这种格式解码时,可以看作是⼀个个字节进⾏扫描的,并使⽤特殊的字节将其不同的部分区分。
问题
这种⽅式发送⼀个⾮特殊字符的单字节字符时没有问题的,当我们需要发送⼀个多字节字符,例如中⽂的中字,如果直接使⽤utf-8编码发送,其编码为0xE4B8AD,会使⽤三个字节传输,分别为0xE4,0xB8,
0xAD,当某些中⽂或者多字节的字符发送时,恰好有⼀个字节解码
为0x26或者0x3D时,这个多字节字符中⼀个字节将会被接收段解码为=或&符号这中特殊字节,从⽽将数据从此处断开,产⽣数据的错误。
使⽤这中⽅式发送的数据,⼀个中⽂将会被编码为9个字节进⾏发送,在发送⼤量的中⽂及多字符数据时会严重的浪费⽹络带宽资源,⼀般在发送少量的数据使⽤。例如下⾯是在⼀个表单中发送{country: 中国, city:北京}信息时候,浏览器发送的部分信息
POST /users/ HTTP/1.1
Host: localhost:8000
Content-Type: application/x-www-form-urlencoded      // 头中指定格式
country=%E4%B8%AD%E5%9B%BD&city=%E5%8C%97%E4%BA%AC    // 编码后的数据
form-data
url编码和utf8区别application/x-www-form-urlencoded必须进⾏多字节字符的编码,这是由于多字节字符的单个字节信息
可能与特殊字节信息冲突。⽽form-data的解决⽅法就是,不在使⽤这些单个字节的特殊字符作为特殊分割,⽽是告诉对⽅使⽤分割字符串。上⾯的{country: 中国, city:北京}表单信息使⽤这种格式发送时,浏览器发送的数据为。
POST /users/ HTTP/1.1
Host: localhost:8000
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW--,
Content-Disposition: form-data; name="country"
中国
------WebKitFormBoundary7MA4YWxkTrZu0gW--
Content-Disposition: form-data; name="city"
北京
------WebKitFormBoundary7MA4YWxkTrZu0gW--
在header头信息中,Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW分别指定了格式和 boundary(分割字符串),在body中使⽤了这个boundary指定的字符串作为分割,从⽽可以轻易的还原为key:value的形式。这⾥的中国和北京中,每⼀个字符l例如中,都是直接使⽤utf-8编码(⼤部分⽹络传输都使⽤该编码)后进⾏传输的,也就是说每个中⽂只需要3个字节。
总结
application/x-www-form-urlencoded 他能简洁的将key:value的数据进⾏分割。这⼀点相⽐form-data使⽤长长的字符串作为分割符优势巨⼤,虽然对于多字节的数据会因为编码造成字节量剧增(可以看到⼀个中⽂字符增加了2倍字节量),但是在单字节或者是少量的数据时,这种⽅式是划算的。
form-data 是⼀种重视数据的⽅式,通常我们在value值中会发送⼤量的⽂本信息,或者直接的传送⼀个⽂件,数据直接编码为⼆进制发送,不会产⽣多余的字节,适合⼤⽂本的传输。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。