HTTP的方法有几种
在文章HTTP入门里说到了有6种,我们这里讨论最常见的GET POST
HTTP的方法
Get和Post的区别
我们讨论到Get方法和Post的区别时,大部分搜索给出的答案都是
- Get的参数在URL中,Post的参数在HTTP的报文体Body里
- Get参数有大小限制,Post没有大小限制
- Get参数不安全,Post安全
以上答案是错误的参考文章99%的人理解错Get和Post的区别讲解为什么错误,我们这里只说结论
- HTTP用什么请求和参数在哪里一点关系没有
- HTTP协议对参数长度也没限制,大多数和服务器容器的配置有关
- HTTP用什么方法都不安全,除非用HTTPS
HTTP的参数
HTTP不管使用什么方法和参数放的位置都没有关系的 这里来介绍有几种放HTTP参数的方式
URL里放参数
在URL里放参数最简单,就是问号+键值对,它存在于HTTP的Header中第一行
1 | POST /psas/bug/image/confirm?param1=1¶m2=b HTTP/1.1 |
包含里两个参数
参数名 | 参数值 |
---|---|
param1 | 1 |
param2 | b |
Body里放参数
由于URL里放参数是放在HTTP报文头,而往Body里放参数的方式就有很多种了,如何让接收放识别这些放参数的方法,就靠Content-type
Body参数方式 | Content-type |
---|---|
Text | text/plain |
Form | application/x-www-form-urlencoded |
JSON | application/json |
File | 不确定 |
Multipart | multipart/form-data; boundary=X_PAW_BOUNDARY |
根据Content-type不同,服务器去读取HTTP Body中参数的方式也不一样
Body不同参数方式介绍
text/plain 文本传输
一般这个。。很少用到
HTTP的报文体中是纯文本,没有任何格式和修饰,服务端就会拿走文本自己处理
application 参数传输
我们最常用到的就是 application 格式的HTTP报文体,其中还分为JSON格式与Form表单格式
Form 表单
这个是最常用的传递参数方式,HTML中都有form标签与其对应,其本身采用Key-Value的方式传递参数
其本身就是简单的把URL参数中?后的字符串移到Body里
所以看其Content-type全称 application/x-www-form-urlencoded 后边代表意思是 X-万维网-FORM表单-URL编码方式
JSON Object
与Form表单同属于一个Content-type分类JSON格式的全称是 application/json 与Form表单不同是,
他的HTTP的Body是一串符合JSON格式的字符串,而不是简单的把URL参数移动到Body内
所以说Json格式比Form更加有效的地方是可以传送Object,而不是简单的Key-Value对,但是还有聪明的小伙子用Form来发Object,参考Spring传JSON参数和文件
File 文件传输
这个也很少用,一般只在返回报文中出现,用于传输 单个文件 ,所以说根据传输的文件不同其Content-type也不同,例如
文件类型 | Content-type |
---|---|
png图片 | image/png |
pdf文档 | application/pdf |
而HTTP的Body中则是文件的二进制数据
Multipart 复合传输
Multipart的中文直译是 “多个部分” 就是指的不仅可以传输参数(Value)还可以传输文件(File),但是参数和文件之间怎么区分呢?
根据Content-type 除了使用 multipart/form-data 之外还有一个 boundary=X_PAW_BOUNDARY
其中前者代表 多个部分/表单数据 而后者代表boundary(边界),是一个字符串 “X_PAW_BOUNDARY“,由于我用的软件是PAW,所以叫X_PAW,用浏览器可能是其它的字符串,然后在HTTP的Body中我们可以看到它
1 | --__X_PAW_BOUNDARY__ <==边界的开始 |