HTTP 详解
HTTP(Hypertext Transfer Protocol)基本信息
HTTP(Hypertext Transfer Protocol)是一种用于在网络上传输超文本数据的协议。它是一种客户端 - 服务器协议,客户端发送请求,服务器返回响应。HTTP 是 Web 的基础,用于在 Web 浏览器和 Web 服务器之间传输数据。
以下是 HTTP 的一些关键概念和详解:
请求和响应
HTTP 通信是基于请求 - 响应模型。客户端发送 HTTP 请求到服务器,服务器处理请求并返回 HTTP 响应。
URL(Uniform Resource Locator)
URL 是用于标识资源的地址。它由协议类型(如 http:// 或 https://)、域名或 IP 地址、端口号(可选)、路径和查询参数组成。
URL(Uniform Resource Locator)是用于标识资源的地址。下面是一个 URL 的图解示例:
1
2
3
4
5
6
7
8┌─────────────────────────────────────────────────────┐
│ URL │
├───────────┬─────────────┬─────────┬───────┬───────┤
│ 协议类型 │ 域名/IP │ 端口号 │ 路径 │ 查询参数 │
├───────────┴─────────────┴─────────┴───────┴───────┤
│ 示例: │
│ https://www.example.com:8080/path/to/resource?q=1 │
└─────────────────────────────────────────────────────┘- 协议类型(Protocol):指定使用的协议,如 HTTP、HTTPS、FTP 等。
- 域名或 IP 地址(Domain/IP):标识资源所在的主机名或 IP 地址。
- 端口号(Port):可选项,用于指定与服务器通信的端口号,默认使用协议的默认端口号(如 HTTP 的默认端口号是 80)。
- 路径(Path):指定资源在服务器上的路径,用斜杠(/)分隔不同的目录或文件。
- 查询参数(Query Parameters):可选项,用于向服务器传递额外的参数,以键值对的形式出现,多个参数使用 & 符号分隔。
在示例中,URL 是以 HTTPS 协议访问的,域名为 www.example.com,使用了 8080 端口号。路径为 /path/to/resource,查询参数为 q=1。
URL 的结构可以根据不同的协议和应用场景有所变化,但基本的组成部分是协议类型、域名或 IP 地址、端口号、路径和查询参数。通过 URL,我们可以定位和访问互联网上的各种资源。
HTTP 方法
HTTP 定义了一组方法,用于指定对资源的操作类型。常见的 HTTP 方法有 GET(获取资源)、POST(提交数据创建资源)、PUT(更新资源)、DELETE(删除资源)、PATCH(更新资源)、OPTIONS(获取资源支持的 HTTP 方法)、HEAD(获取资源头信息)。
GET:用于获取资源。客户端发送 GET 请求到服务器,服务器返回请求的资源。GET 请求通常不应该对服务器端产生副作用,即不应该修改服务器上的数据。
POST:用于提交数据创建资源。客户端发送 POST 请求到服务器,请求创建一个新的资源。POST 请求通常用于提交表单数据、上传文件等操作。
PUT:用于更新资源。客户端发送 PUT 请求到服务器,请求更新指定的资源。PUT 请求应该是幂等的,即多次执行相同的 PUT 请求结果应该是一致的。
DELETE:用于删除资源。客户端发送 DELETE 请求到服务器,请求删除指定的资源。
PATCH:用于局部更新资源。客户端发送 PATCH 请求到服务器,请求对指定的资源进行部分更新。
HEAD:类似于 GET 请求,但只返回响应头信息,不返回响应体。HEAD 请求常用于获取资源的元数据,如文件大小、修改时间等,而不需要获取完整的资源内容。
OPTIONS:用于获取服务器支持的 HTTP 方法和其他选项。客户端发送 OPTIONS 请求到服务器,服务器返回支持的方法和其他信息,用于客户端了解服务器的功能和配置
请求头
HTTP 请求包含一组请求头,用于传递关于请求的元数据,如 User-Agent(客户端标识)、Content-Type(请求体的数据类型)、Authorization(身份验证信息)等。
响应头
HTTP 响应也包含一组响应头,用于传递关于响应的元数据,如 Content-Type(响应体的数据类型)、Content-Length(响应体长度)、Cache-Control(缓存策略)等。
状态码
HTTP 响应包含一个状态码,用于表示请求的处理结果。常见的状态码有 200(成功)、404(资源未找到)、500(服务器内部错误)等。
以下是 HTTP 状态码的分类:
- 1xx(信息性状态码):表示接收的请求正在处理。
- 2xx(成功状态码):表示请求成功被服务器接收、理解、并接受。
- 3xx(重定向状态码):需要后续操作才能完成这一请求。
- 4xx(客户端错误状态码):表示请求包含语法错误或无法完成。
- 5xx(服务器错误状态码):服务器在处理请求的过程中发生了错误。
请求体和响应体
某些 HTTP 请求和响应可能包含一个可选的消息体,用于传递数据。请求体通常用于 POST 或 PUT 请求发送数据,而响应体用于返回请求的结果数据。
Cookie
Cookie 是一种在客户端和服务器之间传递的小型数据,用于跟踪和识别用户。服务器可以通过设置响应头中的 Set-Cookie 字段来发送 Cookie 给客户端,客户端在后续的请求中会自动将 Cookie 包含在请求头中发送给服务器。
缓存
HTTP 支持缓存机制,可以减少对服务器的请求次数,提高性能。服务器可以通过设置响应头中的 Cache-Control 字段来控制缓存策略,客户端可以通过设置请求头中的 If-Modified-Since 或 If-None-Match 字段来验证缓存的有效性。
HTTP 是一个无状态协议,每个请求和响应之间是相互独立的。为了跟踪用户状态,HTTP 引入了 Cookie 等机制。此外,HTTP 还支持 HTTPS(HTTP Secure)协议,通过加密和身份验证来提供更安全的通信。
HTTP 报文
HTTP 协议的请求报文和响应报文的基本结构相同,由三大部分组成:
- 起始行(start line): 描述请求或相应的基本信息;
- 头部字段集合(header):使用
key-value
形式更详细地说明报文 - 消息体(entity):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。
HTTP 报文由请求报文和响应报文两种格式组成,它们的基本结构如下:
- 请求报文格式:
1 | <方法> <URL> <协议版本> : 请求行 |
请求行
- 方法:指定请求的方法,如 GET、POST 等。
- URL:请求的目标资源的 URL。
- 协议版本:使用的 HTTP 协议版本,如 HTTP/1.1。
请求头部字段
- 包含了请求的各种附加信息,如 User-Agent、Content-Type 等。
空行
- 用于分隔请求头部和请求体。
请求体
- 可选项,包含了请求的主体内容,如 POST 请求中的表单数据、PUT 请求中的更新内容等。
- 响应报文格式:
1 | <协议版本> <状态码> <状态码描述>: 响应行 |
响应行
- 协议版本:使用的 HTTP 协议版本,如 HTTP/1.1。
- 状态码:表示服务器对请求的处理结果,如 200 表示成功,404 表示资源未找到等。
- 状态码描述:对状态码的简短描述。
响应头部字段
- 包含了响应的各种附加信息,如 Content-Type、Content-Length 等。
空行
- 用于分隔响应头部和响应体。
响应体
- 包含了响应的主体内容,如 HTML 页面、JSON 数据等。
HTTP 报文的格式是文本格式,使用 ASCII 编码。请求报文由客户端发送到服务器,响应报文由服务器返回给客户端。报文中的请求头部和响应头部字段提供了关于请求和响应的元数据信息,而请求体和响应体则包含了具体的数据内容。通过这种报文格式,客户端和服务器可以进行有效的通信和数据交换。
状态码
1xx(信息性状态码)
1xx
状态码是 HTTP
协议中的信息性状态码,表示请求已被接受,但还未完成。通常情况下,服务器会在响应中发送一些额外的信息,以帮助客户端了解请求的状态。
常见的 1xx 状态码包括:
- 100 Continue(继续):表示服务器已经收到请求的头部,并且客户端应该继续发送请求的主题部分。
- 101 Switching Protocols(切换协议):表示服务器已经理解客户端的请求,并将切换到不同的协议,如从
HTTP
切换到WebSocket
。 - 102 Processing(处理中):表示服务器正在处理请求,但尚未完成。
- 103 Early Hints(早期提示):表示服务器已经开始处理请求,但仍在生成响应的过程中,可以在响应头部发送一些提示信息。
这些 1xx 状态码主要用于在请求 - 响应过程中提供一些中间状态信息,以便客户端和服务器能够更好地进行通信和处理。
2xx(成功状态码)
2xx 状态码是 HTTP 协议中的成功状态码,表示服务器成功处理了客户端的请求。
以下是一些常见的 2xx 状态码:
200 OK(成功):表示请求已成功处理,并返回了请求的内容。
201 Created(已创建):表示请求已成功处理,并在服务器上创建了新的资源。
202 Accepted(已接受):表示服务器已经接受了请求,但尚未完成处理。通常用于异步操作,告知客户端请求已接受,但处理尚未完成。
204 No Content(无内容):表示服务器成功处理了请求,但没有返回任何内容。通常用于不需要返回具体内容的请求,如 DELETE 请求。
这些 2xx 状态码表示客户端的请求已经成功处理,并且服务器能够提供相应的响应。不同的 2xx 状态码可以提供不同的信息,客户端可以根据这些状态码来判断请求的结果和下一步的操作。
3xx(重定向状态码)
3xx 状态码是 HTTP 协议中的重定向状态码,用于指示客户端需要采取进一步的操作来完成请求。
以下是一些常见的 3xx 状态码:
- 300 Multiple Choices(多种选择):表示请求有多个可供选择的响应,客户端可以选择其中一个进行访问;
- 301 Moved Permanently(永久重定向):表示请求的资源以永久移动到新的
URL
,客户端应该使用新的URL
进行访问; - 302 Found(临时重定向):表示请求的资源已临时移动到新的
URL
,客户端应该使用新的URL
进行访问。与301
状态码类似,但是302
状态码表示重定向是临时的; - 304 Not Modified(未修改):表示客户端发送的条件请求(如带有
If-Modified-Since
头部)的资源未发生修改,可以使用缓存的版本; - 307 Temporary Redirect(临时重定向):与
302
状态码类似,表示请求的资源已临时移动到新的URL
,客户端应该使用新的URL
进行访问; - 308 Permanent Redirect(永久重定向):与
301
状态码类似,表示请求的资源已永久移动到新的URL
,客户端应该使用新的URL
进行访问。
这些 3xx 状态码用于在客户端和服务器之间进行资源重定向,指示客户端采取进一步的操作来获取所需的资源。具体使用哪个 3xx 状态码取决于服务器的配置和需求。
4xx(客户端错误状态码)
4xx
状态码是 HTTP
协议中的客户端错误码,表示客户端发送的请求有错误。
以下是一些常见的 4xx
状态码:
- 400 Bad Request(错误请求): 表示服务器无法理解客户端发送的请求,通常是由于请求语法错误或缺少不要的参数;
- 401 Unauthorized(未授权):表示客户端请求需要进行身份验证,但未提供有效的身份验证凭证;
- 403 Forbidden(禁止访问): 表示客户端请求的资源被服务器拒绝访问,通常是由于权限限制或者访问被禁止;
- 404 Not Found(未找到):表示客户端请求的资源在服务器上未找到;
- 405 Method Not Allowed(方法不允许):表示客户端使用了服务器不支持的请求方法;
- 408 Request Timeout(请求超时):表示客户端发送的请求在服务器等待时间内没有得到响应。
这些 4xx 状态码指示客户端发送的请求存在错误或无法成功处理。客户端可以根据这些状态码来判断请求的错误类型,并采取相应的操作进行修正或处理。
5xx(服务端错误状态码)
5xx
状态码是 HTTP
协议中的服务端错误状态码,表示服务器在处理请求时发生了错误。
以下是一些常见的 5xx
状态码:
- 500 Internal Server Error(服务器内部错误):表示服务器在处理请求时发生了未知的内部错误;
- 501 Not Implemented(未实现):表示服务器不支持客户端的功能或者请求的方法;
- 502 Bad Gateway(错误的网关):表示服务器作为网关或代理时从上游服务器接收到无效的响应;
- 503 Service Unavailable(服务器不可用):表示服务器当前无法处理请求,通常是由于服务器过载或者维护;
- 504 Gateway Timeout(网关超时):表示服务器作为网关或代理时未及时从上游服务器接收到响应。
这些 5xx 状态码指示服务器在处理请求时出现了错误或无法提供所需的服务。客户端可以根据这些状态码来判断服务器的状态,并采取相应的操作,如等待一段时间后重试请求或联系服务器管理员进行修复。