返回顶部

HTTP协议中你不知道POST请求的数据格式

HTTP协议中你不知道POST请求的数据格式

看一些开发文档,要求的POST数据格式指的是什么?前后端开发都需要了解下。

本文阅读大约 4 分钟

开发客户端程序的时候,我们最常用的 Http 协议的 2 个方法就是 GET 方法(也可以叫 GET 请求)和 POST 方法(也可以叫 POST 请求)。GET 方法我们一般用来传输一些简单的数据,POST 方法因为可以把参数放在 body 中,所以我们也常常用来提交复杂的表单信息,或者上传文件。

聊 POST 方法之前,我们先谈谈 GET 方法和 POST 方法有什么区别呢?

GET 方法与 POST 方法的区别

刚开始接触 GET 方法和 POST 方法的时候,有可能会觉得 POST 方法会比 GET 方法安全些,因为 GET 方法会直接把参数显示在浏览器的地址栏。

图片描述

如图,https://www.baidu.com/s?wd=wechat,我们搜索的百度的关键字wechat就直接显示在浏览器的地址栏。但实际上,因为 GET 和 POST 都是基于 Http 协议的方法,他们的内容都会显示在报文上,所以安全上并没有什么差别。

但是我们传输数据的过程中,如何选择使用 GET 方法还是 POST 方法呢,我们可以这么考虑

GET 方法

  • 数据长度:Http 协议规范没有对URL长度进行限制,但是不同的浏览器对于 URL 长度是有不同的长度限制,比如 Safari URL 最大长度限制为 80000 个字符,Chrome URL 最大长度限制为 8182 个字符,所以我们在使用 GET 方法的时候,数据长度可以看作有长度限制。
  • 数据类型:只支持文本类型,而且使用时一些特殊符号需要 urlencode 转义

POST 方法

  • 数据长度:Http 协议规定 POST 参数是放在 body 里的,所以对长度也没有长度限制
  • 数据类型:支持文本类型,支持 json,支持文件二进制流,所以也可以用于上传文件。

POST 方法我们常用的方法就是构造一个 form 表单,然后直接调用 Http 客户端的 POST 方法即可调用成功。接下来我们讲讲 POST 方法的一些不同的数据格式。

POST 方法的数据格式

一个简单的 POST

一个 POST 请求包含header(请求头)body(请求体)两部分,我们看看 POST 请求:

POST  HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded

username=admin&password=123456

上述请求中,请求头和请求内容是由一个“空行”隔开,实际上空行是一个\r\n\r\n字符串。

在请求头中:

  • POST HTTP/1.1包含了 HTTP 的方法 POST,协议版本号 Http 1.1 版本;
  • Host 目标地址
  • Content-Type 请求的数据格式

在请求体中:

username=admin&password=123456

看起来和 GET 请求的参数没什么区别,由&符号分隔成的几组参数。请求体的内容很灵活,这里是简单的文本参数,也可以是文件二进制数据。

那么怎么区分 body 请求体的数据是什么数据呢,那我们就需要在请求头中写明Content-Type数据类型,来表明是什么数据格式。

我们最常用的 POST 的几种数据格式:

  • x-www-form-urlencode
  • multipart/form-data
  • application/json

x-www-form-urlencode

请求头:

Content-Type: x-www-form-urlencode

x-www-form-urlencode是 form 表单默认的数据格式类型,form 表单数据被编码为 key/value 格式发送到服务器,如:key1=value1&key2=value2&keyn=valuen

其中 key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式有很好的支持。

multipart/form-data

请求头:

Content-Type: multipart/form-data

multipart/form-data主要用于在表单中上传文件,也可以和x-www-form-urlencode一样,上传普通的 key/val 数据。

例如下面的请求格式:

POST  HTTP/1.1
Host: 127.0.0.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="username"

admin
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="password"

123456
------WebKitFormBoundary7MA4YWxkTrZu0gW--

在数据请求头中,还会有一个boundary分割线,这里是----WebKitFormBoundary7MA4YWxkTrZu0gW

在请求体中,请求体以boundary开始,中间每个参数之间也是用boundary来分隔,以boundary结束。每个参数内容有描述信息,然后是一个空行,接着是参数的具体内容。

小总结

纯文本 key/val 上传文件 key/val 和上传文本混合
x-www-form-urlencode 支持 单个文件 不支持
multipart/form-data 支持 多个文件 支持

x-www-form-urlencode请求体是纯文本或纯二进制文件流,一般用于纯文本参数的提交或者单个文件传输。 multipart/form-data 能够混合传输文本与二进制,相比于 x-www-form-urlencode,multipart/form-data 还能够多文件传输。

application/json

请求头:

Content-Type: application/json

现如今很多移动客户端或者小程序客户端,开发者会用到 json 作为页面的数据格式,在使用 POST 方法时,在请求头添加它作为请求头,也可以告诉服务端请求数据为 JSON,后端开发语言也有很多函数去支持这种结构化数据。例如:

POST  HTTP/1.1
Host: 127.0.0.1:8500
Content-Type: application/json

{"username":"admin","password":123456}

这种数据格式的请求体内容为 json 字符串。

总结

POST 请求的数据格式主要分 2 部分,一部分是请求头中,在Content-Type中说明请求的数据格式,另一部分就是对应的请求体的内容,可以是简单 key/val 文本,也可以是文件二进制流。

本篇文章介绍的是客户端发送 POST 请求的一些不同的数据格式,开发者可以在开发过程中根据具体需求来选择。

本文标题: 《HTTP协议中你不知道POST请求的数据格式》

文章链接: https://unyiong.com/index/index/post/id/kGcWJyAEBos%253D.html

文章作者: 荔枝君

发布时间: 2019-10-17

最后更新: 2024-04-29

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

请荔枝君喝杯咖啡☕️:-)
打赏