网络基本概念之http请求
请求消息格式有三部分组成:请求行、请求头、请求体。
http 是基于 请求-响应 的方式完成通信的,每一次通信都是由客户端向服务器发出请求,传递一些消息过去,然后经过服务器程序处理后,响应给客户端一些消息。
https 是在 http 协议基础上发展起来的,它增加了安全性,其他和 http 协议完全一致
请求的消息格式
请求消息格式有三部分组成
- 请求行:高度概括了客户端想要干什么
- 请求头:描述了请求的一些额外信息
- 请求体:包含了要给服务器传递的正文数据。请求体是可以省略的
请求行
请求行是整个 http 报文的第一行字符串,它包含三个部分:请求方法 路径+参数+hash 协议和版本
重点关注请求方法
请求方法是一个单词,它表达了客户端的「动作」,比如:
- GET:获取
- POST:提交
在 http 协议中,并没有规定只能使用上面两种动作,甚至没有规定每种动作会带来怎样的变化
而在实际的应用中,我们逐渐有了一些约定俗成的规范:
- 动作通常有:GET(获取资源)、POST(提交消息)、PUT(修改数据)、DELETE(删除数据)。其中,GET 和 POST 最为常见。
- GET 和 DELETE 请求不能有请求体,而 POST 和 PUT 请求可以有请求体
浏览器遵循了上面的规范,这带来了 GET 和 POST 的诸多区别。比如,由于 GET 请求没有请求体,所以要传递数据只能把数据放到 url 的参数中
在浏览器中,获取数据一般使用的都是 GET 请求,比如:
- 在地址栏输入地址并按下回车
- 点击了某个 a 元素
- 获取图片、音频、视频
- 获取 css、js、字体等文件
事实上,浏览器自动发出的请求基本都是 GET 请求,而 POST 请求需要开发者手动处理,比如在 form 表单中设置 method 为 POST
请求头 header
请求头是一系列的键值对,里面包含了诸多和业务无关的信息
浏览器每次请求服务器都会自动附带很多的请求头,其实这些请求头大部分服务器是不需要的
你可以说不要,但不能说我没给
我们只需关注下面几个请求头即可:
Host:url 地址中的主机
User-Agent:客户端的信息描述
Content-Type: 请求体的消息是什么格式,如果没有请求体,这个字段无意义
该字段的常见取值为:
application/x-www-form-urlencoded
表示请求体的数据格式和 url 地址中参数的格式一样,比如
1
loginId=admin&loginPwd=123123
application/json
表示请求体的数据是 json 格式,比如
1
{ "loginId": "admin", "loginPwd": "123123" }
multipart/form-data
一种特殊的请求体格式,上传文件一般选择该格式
请求体 body
包含业务数据的字符串
理论上,请求体可以是任意格式的字符串,但习惯上,服务器普遍能识别以下格式:
- application/x-www-form-urlencoded:
属性名=属性值&属性名=属性值... - application/json:
{"属性名":"属性值", "属性名":"属性值"} - multipart/form-data:使用某个随机字符串作为属性之间的分隔符,通常用于文件上传
由于请求体格式的多样性,服务器在分析请求体时可能无法知晓具体的格式,从而不知道如何解析请求体,因此,服务器往往要求在请求头中附带一个属性Content-Type来描述请求体使用的格式
