一、HTTP 协议基础
HTTP 简介
HTTP 是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通常是由客户端发起一个请求,创建一个到服务器的 TCP 连接,当服务器监听到客户端的请求时,便会向客户端返回一个状态和内容。如下图所示,便是客户端发起请求,服务端响应的一个简单过程。
HTTP 工作原理
HTTP工作原理主要涉及客户端和服务器之间的交互。
- 当我们在浏览器中输入网址并回车后,浏览器会向服务器发送一个HTTP请求。这个请求由多个部分组成,包括请求行、头部和正文。请求行包含请求方法、请求URI和HTTP版本号,如GET、POST、PUT、DELETE等。请求URI指定了要访问的资源的位置。HTTP版本号表示请求所使用的HTTP协议版本。头部包含了一系列的键值对,用于向服务器传递一些请求信息。例如,Accept表示客户端可以接受的响应内容类型,User-Agent表示客户端的浏览器信息,Referer表示客户端从哪个页面跳转而来等等。正文是可选的,用于向服务器传递一些数据。例如,当客户端向服务器提交表单时,表单数据就可以放在请求的正文中。
- 服务器接收到请求消息后,根据请求消息的URL和相应的处理逻辑,生成服务器响应消息,并将其发送给客户端。响应消息中包含协议版本、状态码、响应头和响应体等信息。状态行包含HTTP版本号、状态码和状态短语。HTTP版本号表示响应所使用的HTTP协议版本。状态码是一个三位数字,用于表示服务器对请求的处理结果,如200表示成功、404表示未找到资源、500表示服务器内部错误等等。状态短语是对状态码的简短描述,例如200对应的状态短语是OK,404对应的状词短语是Not Found。头部包含了一系列的键值对,用于向客户端传递一些响应信息。例如,Content-Type表示响应内容的类型,Content-Length表示响应内容的长度,Set-Cookie表示服务器要求客户端保存一个Cookie等等。正文是响应的实际内容。例如,当客户端请求一个网页时,网页的HTML代码就可以放在响应的正文中。
HTTP 特点
- 支持客户/服务器模式:HTTP协议支持客户/服务器模式,客户端向服务器发起请求并接收响应。
- 简单快速:HTTP协议简单且快速,客户端向服务器发送请求时只需传送请求方法和路径,响应也较为迅速。
- 灵活:HTTP允许传输任意类型的数据对象,具有灵活性,这意味着它不仅可以传输文本,还可以传输图片、音频、视频等非文本数据。
- 无连接:HTTP协议无连接,即限制每次连接只处理一个请求。服务器处理完客户的请求并收到客户端的应答后,即断开连接,以节省资源。
- 无状态:HTTP协议无状态,每个请求都是独立的,这意味着服务器不会保存之前和现在的请求和响应之间的关联。
HTTP 和 HTTPS
上面介绍 HTTP 的工作原理和特点,看起来是一个很不错的协议,但是 HTTP 也存在许多不足,特别是在安全方面。HTTP 通信使用明文传输,并且在通信中是不验证通信方的身份,也无法证明报文是完整的,因此使用 HTTP 通信有可能使内容被窃听,通信方身份被伪装,报文遭篡改。
HTTP 协议中是没有加密机制,但是可以和 SSL(Secure Socket Layer )或 TLS(Transport Layer Security)组合使用,从而加密 HTTP 的通信内容。即出现了 HTTPS。HTTPS 中的 S 可以理解为是 Secure,是以安全为目标的 HTTP 通道。大家可以这样理解 HTTPS = HTTP + 加密 + 认证 + 完整性保护。
细心的同学应该会发现,在一些大型网站,特别是银行、支付等网站使用的都是 HTTPS,因为它更安全。
二、HTTP 协议介绍
1.URL
如:
2. HTTP协议
- HTTP请求:定义请求数据格式 请求行、请求头、请求体
- HTTP响应:定义响应数据格式 状态行、响应头、响应体
我们以瑞吉外卖项目为例,在登录界面发送了一个请求,按住F12进行调试:
1.请求行
请求行分为三个部分:请求方法、请求地址 URL 和 HTTP 协议版本,它们之间用空格分割。例如下图中的:POST /employee/login HTTP/1.1。
请求方法
HTTP/1.1 中定义的请求方法有 8 种,分别是 GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。GET 和 POST 是最常见的两种请求方法。如果是 RESTFul 接口则是 GET、POST、DELETE、PUT。
协议版本
协议版本的格式为:协议名称/主版本号.次版本号,常见的有 HTTP/1.0 和 HTTP/1.1。
2.请求头
位置:请求数据第二行到空白行之间
作用:通知服务器客户端请求信息
- text/html:HTML格式
- image/jpeg:jpg图片格式
- application/json:JSON数据格式
- application/x-www-form-urlencoded: 表单默认的提交数据格式
- multipart/form-data:在表单中进行文件上传时使用
3.请求体
4.状态行
状态行
状态行分为三个部分:HTTP 协议版本、状态码和状态码描述,它们之间用空格分割。例如 HTTP/1.1 200 OK
。
- HTTP 协议版本:与请求行中的协议版本一致,格式为:协议名称/主版本号.次版本号,常见的有 HTTP/1.0 和 HTTP/1.1。
- 状态码:表示网页服务器超文本传输协议响应状态的 3 位数字代码。第一个数字代表当前响应的类型。例如 1xx 表示请求已经被服务器接收,需要继续处理。
- 状态码描述:也叫状态描述,是对状态码的一个说明。
HTTP 常见响应码
我们经常会听到开发人员说,200、404、500 等数字,其实说的就是状态码。
HTTP 状态码(HTTP Status Code)由三个十进制的数字组成。状态码的第一个数字定义了状态码的类别,HTTP 状态码总共有五种类别,如下所示:
- 1xx:信息。表示服务器接收到请求,需要继续处理。
- 2xx:成功。请求已经被成功接收并处理。
- 3xx:重定向。需要客户端采取进一步操作才能完成请求。
- 4xx:客户端错误。客户端发送的请求有语法错误或者请求无法实现。
- 5xx:服务端错误。服务器在处理请求的过程中发生了错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。
下面列举出一些常见的状态码:
状态码 | 英文名 | 描述 |
---|---|---|
100 | Continue | 客户端应当继续发送请求 |
101 | Switching Protocols | 服务器根据客户端的请求切换协议 |
200 | OK | 请求成功。请求所希望的响应头或数据体将随此响应返回 |
203 | Accepted | 服务器已经接受请求,但未处理完成 |
204 | No Content | 服务器成功处理,但未返回内容 |
301 | Moved Permanently | 请求的资源已被永久的移动到新 URI,浏览器会自动定向到新 URI |
305 | Use Proxy | 被请求的资源必须通过代理才能被访问 |
400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
401 | Unauthorized | 请求要求用户的身份认证 |
403 | Forbidden | 服务器理解请求,但是拒绝执行此请求 |
404 | Not Found | 请求失败,服务器上无法找到请求的资源 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时无法处理客户端的请求 |
505 | HTTP Version not supported | 服务器不支持,或者拒绝支持请求中使用的 HTTP 协议的版本 |
5.响应头
响应头部用来说明客户端需要使用的一些附加信息。与请求头部类似,包含若干个属性,每行一对,传递着固定的信息。格式为:属性名:属性值。下面列举一些响应头部内容。
响应头 | 说明 | 示例 |
---|---|---|
Server | 服务器应用程序软件的名称和版本 | Server: Tengine |
Date | 此消息被发送时的日期和时间 | Date: Tue, 15 Jun 2021 11:28:29 GMT |
Content-Type | 当前文档的 MIME 类型 | Content-Type: text/html; charset=utf-8 |
Content-Encoding | 当前文档使用的编码方式 | Content-Encoding: br |
Expires | 超过该时间则认为文档已经过期 | Expires: Fri, 01 Jan 1990 00:00:00 GMT |
6.响应体
作用:服务器返回的数据实体