文章目录
HTTP协议
一、核心概念
Hyper Text Transsfer Protocol 超文本传输协议,是一种应用非常广泛的 应用层协议
- 协议是指双方,或多方,相互约定好,大家都需要遵守的规则,叫做协议
- 是无状态的 : 每次请求之间相互独立,不能交互数据
在网络通信中,有几个概念:
- 服务器 VS 客户端
- 请求和响应
所谓HTTP协议,就是指。客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫做HTTP协议,HTTP协议中的数据又叫报文,是前后端沟通的桥梁。
在客户端和服务器之间的沟通存在多种模型
- 一发一收 : 请求和响应是一 一 对应的~(这是web 开发中最常见的一种模型,也是http协议用的模型)
- 多发一收 :多个请求对应一个响应,(典型应用,大文件上传的场景)
- 一发多收 : 一个请求,对应很多的响应 (看直播)
- 多发多收 :多个请求,对应到多个响应
二、HTTP协议格式
HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的 应用层协议. HTTP协议永远都是客户端发起请求,服务器回送响应。
当我们在浏览器中输入一个搜索地址"URL时",浏览器就给服务器发送一个 http 请求,服务器就返回一个 http 响应。
这个响应结果被浏览器解析之后,就展示成我们看到的页面内容(这个过程中浏览器可能会给服务器发送多个 HTTP 请求,服务器就会对应返回多个响应,这些响应里包含了页面HTML,CSS,JavaScript,图片字体等信息)。
我们要关心的是:
- 请求要包含哪些信息,按照啥格式传输
- 响应要包含哪些信息,按照啥格式传输
请求方法:
根据HTTP标准,HTTP请求可以使用多种请求方法。
- HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
- HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
方法 | 说明 | 支持的HTTP协议格式 |
---|---|---|
GET | 获取资源,也可以通过URL传参给服务器。 | 1.0、1.1 |
POST | 用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式 | 1.0、1.1 |
PUT | 传输文件,报文主体中包含文件内容,保存到对应URL位置 | 1.0、1.1 |
HEAD | 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URL是否有效。 | 1.0、1.1 |
DELETE | 删除文件,与PUT方法相反,删除对应URL位置的文件 | 1.0、1.1 |
OPTIONS | 查询相应URL支持的HTTP方法 | 1.1 |
TRACE | 追踪路径 | 1.1 |
CONNECT | 要求用隧道协议连接代理 | 1.1 |
LINK | 建立和资源之间的联系 | 1.0 |
UNLINK | 断开连接 | 1.0 |
URL : (Uniform Resource Locator 统一资源定位符),就是我们俗称的 “网址”,互联网尚的每个文件都有一个唯一的 URL , 它包含的信息指出文件的位置以及浏览器怎么出处理它。
HTTP请求不光是一个文本,还是一个“行文本” , 一行一行的组织数据,每一行都有特定的含义
2.1、HTTP请求:(Request)
GET请求格式:
POST请求格式:
2.2、HTTP响应:(Response)
2.3、协议格式小结
请求格式:
- 请求行 : 方法 URL 版本号
- 请求头 : 包含多个键值对,每个键值对占一行,键和值之间使用 冒号空格分割
- 空行 : 作为请求的结束标记
- 请求正文 : 有的请求有正文,有的请求没有正文
响应格式:
- 响应行 : 版本号 响应状态码 状态码描述符
- 响应头 : 包含多个键值对,每个键值对占一行,键和值之间使用 冒号空格分割
- 空行 : 作为响应头的结束标记
- 响应正文 : 有的响应有响应正文,有的没有。一种常见的响应正文格式是 HTML
HTTP报文中为什么要存在“空行”?
- 因为 HTTP 协议中并没有规定报头部分的键值对有多少个,空行就相当于是 “报头的结束标记”,或者“报头和正文之间的分隔符” , 如果没有这个空行,就会出现粘包问题。
HTTP协议中 GET 和 POST两个方法有什么区别?
首先两个方法本质上没有任何区别
GET请求的特点:
- 首行第一部分为 GET
- URL的query String 部分可以为空也可以不为空
- header部分有若干个键值对
- doby部分为空看那个
POST请求的特点:
- 首行的一个部分为 POST
- URL的query String 一般为空,也可以不为空
- header 部分有若干个键值对
- body部分一般不为空,body内的数据格式通过header 中 content-Type指定,body的长度一般由header 中的 content-Length指定
GET方法:初心是从服务器中获取数据,通常情况下,GET请求的请求体为空,但是也可以自己构造一个请求体,请求体是可以不为空的,为空只是一种习惯上的用法
POST :初心是往服务器中提交数据,常见使用 POST请求的情况就是 登录,如果使用 GET完成登录也是可以的,
但是实际上,现在 GET 和 POST 都即可以用来获取,也可以用来提交。
区别在于:
- 数据位置:GET请求的数据在 URL之后,POST请求的数据一般在请求体中
- 语义区别 : GET 一般用于获取数据,POST 一般用于提交数据
- 幂等性 : GET请求一般会设计成幂等的,POST一般不要求设计成幂等的
- 可缓存 : GET请求一般会被缓存, POST 请求一般不能被缓存
触发 GET请求的情况
- 直接在浏览器中输入 HTTP URL
- HTML 中的 link , img , a ,script 标签等,这些标签也能触发 HTTP GET 请求
- form 表单
- ajax请求
- 使用 java代码
- 使用 postman这类工具
触发 POST请求的方式也有很多
- form 标签
- ajax请求
- 第三方工具