一、什么是HTTP
1.什么是 Internet (网络)
Internet(或 Web)是一个大规模的分布式客户端/服务器信息系统,如下图所示。
许多应用程序在网络上同时运行,例如网页浏览/冲浪、电子邮件、文件传输、音频和视频流等等。为了在客户端和服务器之间进行正确的通信,这些应用程序必须就特定的应用程序级协议(例如 HTTP、FTP、SMTP、POP 等)达成一致。
2. 如何理解HTTP (超文本传输协议)
HTTP(超文本传输协议)是 Internet(或 WEB)中最流行的应用程序协议。
HTTP是一种用于获取 HTML 文档等资源的协议。完整的文档是根据获取的不同子文档重建的,例如文本、布局描述、图像、视频、脚本等。
- 超文本:不仅能传输文字,还能传输图片、音频、视频,甚至点击文字或图片能够进行超链接的跳转,这种语义扩大后的文本就被称为超文本(Hypertext)。
- 传输:两台计算机之间会形成互联关系进行通信,存储的超文本会被解析成为二进制数据包,由传输载体(例如同轴电缆,电话线,光缆)负责把二进制数据包由计算机终端传输到另一个终端的过程称为传输(transfer)。
- 协议:网络协议就是网络中(包括互联网)传递、管理信息的一些规范。如同人与人之间相互交流是需要遵循一定的规矩一样,计算机之间的相互通信需要共同遵守一定的规则,这些规则就称为网络协议。
所以,HTTP就是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范
3. HTTP有哪些特点
- 如图所示,HTTP 是一种非对称请求-响应客户端-服务器协议。HTTP 客户端向 HTTP 服务器发送请求消息,服务器依次返回响应消息。换句话说,HTTP 是一种拉式协议,客户端从服务器拉取信息(而不是服务器将信息推送给客户端)。
- HTTP 是一种无状态协议。换句话说,当前请求并不知道之前的请求做了什么。
- HTTP 允许协商数据类型和表示,以便允许系统的构建独立于所传输的数据。也就是在客户端发送给服务端一个请求的时候,客户端可以声明该请求所期望获得的数据格式和数据相关的一些属性,服务端会根据客户端声明的请求做出判断并给出相应的结果
二、HTTP如何工作
1. 简单流程
每当您从浏览器发出 URL 以使用 HTTP 获取 Web 资源时,例如http://www.nowhere123.com/index.html
,浏览器会将 URL 转换为请求消息并将其发送到 HTTP 服务器。HTTP 服务器解释请求消息,并返回相应的响应消息,该消息可以是您请求的资源,也可以是错误消息。这个过程如下图所示:
2. 什么是url
URL(统一资源定位符)用于唯一标识网络上的资源。URL 具有以下语法:
protocol://hostname:port/path-and-file-name
- protocol(协议):客户端和服务器使用的应用层协议,例如HTTP、FTP、Telnet。
- hostname(主机名):服务器的DNS 域名(例如
www.baidu.com
)或 IP 地址(例如 192.128.1.2)。 - port(端口):服务器正在侦听来自客户端的传入请求的 TCP 端口号。
- Path-and-file-name:请求资源的名称和位置,位于服务器文档基目录下。
例如,URL中http://www.nowhere123.com/docs/index.html
,通信协议为HTTP;主机名是www.nowhere123.com
. URL 中未指定端口号,并采用默认端口号,即 HTTP 的 TCP 端口 80。要定位的资源的路径和文件名是“ /docs/index.html
”。
三、HTTP请求和响应消息
HTTP 客户端和服务器通过发送文本消息进行通信。客户端向服务器发送请求消息。服务器依次返回响应消息。
HTTP 消息由消息头和可选的消息体组成,中间用空行分隔,如下所示:
1. HTTP请求消息
HTTP请求报文的格式如下:
1.1 什么是请求行
标头的第一行称为请求行,后面是可选的请求标头。
请求行具有以下语法:
request-method-name request-URI HTTP-version
- request-method-name:HTTP 协议定义了一组请求方法,例如 GET、POST、HEAD 等。客户端可以使用其中一种方法向服务器发送请求。
- request-URI:指定请求的资源。URI(统一资源标识符)比URL更通用,甚至可以定位资源中的片段
- HTTP-version:当前使用两个版本:HTTP/1.0 和 HTTP/1.1。
举例:
// 什么是HTTP请求方法
请求方法告诉服务器客户端希望服务器采取什么样的操作。最常见的方法是:
HTTP方法 | 说明 |
HEAD | 向服务器询问资源的状态(大小、可用性)。 |
GET | 请求服务器检索资源,常用于获取服务器上的某个资源 |
POST | 要求服务器创建新资源,多用于提交用户输入的数据给服务器 |
PUT | 要求服务器编辑/更新现有资源。 |
DELETE | 请求服务器删除资源。 |
GET 请求的特点:
- 首行里面的第一个部分就是 GET
- URL 里面的 query string 可以为空,也可以不为空
- GET 请求的 header 有若干个键值对结构
- GET 请求的 body 一般是空的
GET /api/data HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36
Accept: application/json
Accept-Language: en-US,en;q=0.5
Authorization: Token abc123
Cache-Control: no-cache
Connection: keep-alive
Referer: https://www.google.com/
Pragma: no-cache
POST 请求的特点:
- 首行第一个部分就是 POST
- URL 里面的 query string 一般是空的
- POST 请求的 header 里面有若干个键值对
- POST 请求的 body 一般不为空(body 的具体数据格式,由 header 中的 Content-Type 来描述;body 的具体数据长度,由 header 中的 Content-Length 来描述)
POST /submit-form HTTP/1.1 请求行
Host: www.example.com 请求头
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
Connection: keep-alive
Referer: https://www.example.com/form-page
空白行
key1=value1&key2=value2 请求体
1.2 什么是请求标头
请求标头是成对的形式name:value
。可以指定多个值,以逗号分隔。
举例:
1.3 什么是请求正文
在 HTTP 中,请求正文是作为 HTTP 请求的一部分,从客户端发送到服务器的数据。
一个标准的请求消息示例:
2. HTTP响应消息
HTTP响应报文格式如下:
2.1 什么是状态行
第一行称为状态行,后面是可选的响应标头。
状态行具有以下语法:
HTTP-version status-code reason-phrase
- HTTP-version:此会话中使用的 HTTP 版本。HTTP/1.0 和 HTTP/1.1。
- status-code:服务器生成的 3 位数字,用于反映请求的结果。
- Reason-phrase:对状态代码给出简短的解释。
- 常见的状态代码和原因短语有“200 OK”、“404 Not Found”、“403 Forbidden”、“500 Internal Server Error”。
2.2 什么是响应头
响应标头采用成对的name:value
:
举例:
2.3 什么是响应消息体
响应消息体包含请求的资源数据。
响应消息示例: