HTTP 是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通常是由客户端发起一个请求,创建一个到服务器的 TCP 连接,当服务器监听到客户端的请求时,便会向客户端返回一个状态和内容。如下图所示,便是客户端发起请求,服务端响应的一个简单过程。

HTTP工作原理主要涉及客户端和服务器之间的交互。
上面介绍 HTTP 的工作原理和特点,看起来是一个很不错的协议,但是 HTTP 也存在许多不足,特别是在安全方面。HTTP 通信使用明文传输,并且在通信中是不验证通信方的身份,也无法证明报文是完整的,因此使用 HTTP 通信有可能使内容被窃听,通信方身份被伪装,报文遭篡改。
HTTP 协议中是没有加密机制,但是可以和 SSL(Secure Socket Layer )或 TLS(Transport Layer Security)组合使用,从而加密 HTTP 的通信内容。即出现了 HTTPS。HTTPS 中的 S 可以理解为是 Secure,是以安全为目标的 HTTP 通道。大家可以这样理解 HTTPS = HTTP + 加密 + 认证 + 完整性保护。
细心的同学应该会发现,在一些大型网站,特别是银行、支付等网站使用的都是 HTTPS,因为它更安全。
如:

我们以瑞吉外卖项目为例,在登录界面发送了一个请求,按住F12进行调试:

请求行分为三个部分:请求方法、请求地址 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。
位置:请求数据第二行到空白行之间
作用:通知服务器客户端请求信息

分为三个部分:HTTP 协议版本、状态码和状态码描述,它们之间用空格分割。例如 HTTP/1.1 200 OK。
我们经常会听到开发人员说,200、404、500 等数字,其实说的就是状态码。
HTTP 状态码(HTTP Status Code)由三个十进制的数字组成。状态码的第一个数字定义了状态码的类别,HTTP 状态码总共有五种类别,如下所示:
下面列举出一些常见的状态码:
| 状态码 | 英文名 | 描述 |
|---|---|---|
| 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 协议的版本 |
响应头部用来说明客户端需要使用的一些附加信息。与请求头部类似,包含若干个属性,每行一对,传递着固定的信息。格式为:属性名:属性值。下面列举一些响应头部内容。
| 响应头 | 说明 | 示例 |
|---|---|---|
| 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 |

作用:服务器返回的数据实体
