HTTP 的基本概念
(1)定义
- HTTP(超文本传输协议,HyperText Transfer Protocol)是一种用于分布式、协作式和超媒体信息系统的应用层协议。简单来说,它是在互联网上进行数据传输的规则,主要用于客户端和服务器之间的通信,使得客户端(如浏览器)能够从服务器获取网页、图片、视频等各种资源。
- 例如,当你在浏览器中输入一个网址(如https://www.example.com)并按下回车键,浏览器就会通过 HTTP 协议向服务器发送请求,服务器接收到请求后,根据请求的内容返回相应的网页数据,浏览器再将这些数据解析并显示出来。
(2)版本演变
- HTTP/0.9 是最早的版本,它的功能非常简单,仅支持请求获取 HTML 文档,没有请求头和响应头,也没有状态码。
- HTTP/1.0 在 0.9 的基础上进行了扩展,增加了请求头和响应头,使得可以传输除 HTML 以外的其他文件类型,如图片、样式表等,同时还引入了状态码来表示请求的结果。但 1.0 版本每次请求都需要建立一个新的 TCP 连接,这在一定程度上影响了性能。
- HTTP/1.1 是目前广泛使用的版本,它对 1.0 进行了优化,支持持久连接(Connection: keep - alive),一个 TCP 连接可以用于多次请求和响应,减少了建立连接的开销。同时还新增了许多功能,如管道化(Pipelining),可以在一个 TCP 连接上发送多个请求而不用等待每个请求的响应,进一步提高了性能。
- HTTP/2.0 在性能方面有了更大的提升,它采用二进制格式进行数据传输,而不是 HTTP/1.x 的文本格式,这样更高效且不易出错。并且引入了多路复用(Multiplexing)技术,一个连接可以同时处理多个请求和响应,解决了 HTTP/1.1 中管道化的队头阻塞(Head - of - Line Blocking)问题,大大提高了并发处理能力。
HTTP 的请求和响应结构
(1)请求结构
- 请求行(Request - Line):它包含了请求方法、请求的 URL 和 HTTP 协议版本。例如,
GET /index.html HTTP/1.1
,这里GET
是请求方法,表示获取资源;/index.html
是请求的资源路径;HTTP/1.1
是协议版本。 - 请求头(Request - Headers):包含了许多关于请求的附加信息,如
User - Agent
(客户端浏览器的类型和版本)、Accept
(客户端能够接受的内容类型)、Cookie
(存储在客户端的一些用户信息)等。例如,User - Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36
,这个请求头告诉服务器客户端使用的是 Chrome 浏览器。 - 请求体(Request - Body):不是所有的请求都有请求体。一般在 POST 等请求方法中会包含请求体,用于向服务器发送数据,如提交表单数据、上传文件等。请求体的内容格式可以根据
Content - Type
请求头来确定,如application/x - www - form - urlencoded
(表单数据)、multipart/form - data
(文件上传)等。
(2)响应结构
- 响应行(Response - Line):包含 HTTP 协议版本、状态码和状态码的文本描述。例如,
HTTP/1.1 200 OK
,这里200
是状态码,表示请求成功;OK
是状态码对应的文本描述。 - 响应头(Response - Headers):包含了关于响应的各种信息,如
Content - Type
(响应内容的类型,如text/html
)、Content - Length
(响应内容的长度)、Set - Cookie
(设置客户端的 Cookie)等。例如,Content - Type: text/html; charset=UTF - 8
,这个响应头告诉客户端响应的内容是 HTML 文档,字符编码是 UTF - 8。 - 响应体(Response - Body):包含了服务器返回的实际内容,如网页的 HTML 代码、图片的二进制数据、JSON 格式的数据等。客户端根据响应头中的
Content - Type
来解析响应体的内容。
- 请求行(Request - Line):它包含了请求方法、请求的 URL 和 HTTP 协议版本。例如,
HTTP 请求方法
(1)GET
- GET 方法用于从服务器获取资源。它是最常用的请求方法,当你在浏览器中输入网址并访问网页时,浏览器通常会发送 GET 请求。GET 请求的特点是请求参数会附加在 URL 后面,以
?
开头,多个参数之间用&
连接。例如,https://www.example.com/search?keyword=java&page=1
,这里keyword=java
和page=1
是请求参数。由于请求参数会暴露在 URL 中,所以 GET 方法一般用于获取数据,而不适合用于传输敏感信息。 - GET 请求是幂等的,这意味着多次执行相同的 GET 请求应该得到相同的结果,不会对服务器的数据产生副作用。
(2)POST
- POST 方法用于向服务器提交数据,通常用于表单提交、文件上传等场景。与 GET 不同,POST 请求的数据是放在请求体中的,不会暴露在 URL 上,所以更适合传输敏感信息。例如,当你在一个登录页面输入用户名和密码并点击登录按钮时,浏览器会向服务器发送一个 POST 请求,将用户名和密码放在请求体中发送给服务器。
- POST 请求不是幂等的,每次执行 POST 请求可能会对服务器的数据产生不同的影响,如插入一条新的记录到数据库中。
(3)PUT
- PUT 方法用于将数据上传到服务器指定的位置,通常用于更新资源。如果目标资源不存在,PUT 请求可能会创建一个新的资源。例如,在一个文件存储系统中,通过 PUT 请求可以将一个本地文件更新到服务器上指定的文件路径。PUT 请求是幂等的,多次执行相同的 PUT 请求应该得到相同的结果。
(4)DELETE
- DELETE 方法用于请求服务器删除指定的资源。例如,在一个资源管理系统中,可以通过 DELETE 请求删除一个文件或者一个用户记录。DELETE 请求也是幂等的,多次执行相同的 DELETE 请求应该得到相同的结果,即资源被删除后,再次执行 DELETE 请求不会产生额外的影响。
(5)其他请求方法
- HEAD 方法与 GET 方法类似,但服务器只返回响应头,不返回响应体。它主要用于获取资源的元信息,如资源是否存在、资源的类型等。
- OPTIONS 方法用于获取服务器针对特定资源所支持的请求方法列表,客户端可以通过这个方法来了解服务器的功能,以便正确地发送请求。
- GET 方法用于从服务器获取资源。它是最常用的请求方法,当你在浏览器中输入网址并访问网页时,浏览器通常会发送 GET 请求。GET 请求的特点是请求参数会附加在 URL 后面,以
HTTP 状态码
(1)1xx(信息性状态码)
- 这些状态码主要用于提供信息,表示请求已经被服务器接收,正在处理中。例如,
100 Continue
,当客户端发送一个包含请求体的请求(如 POST 请求)时,先发送请求头,服务器如果返回100 Continue
,则表示服务器已经收到请求头,客户端可以继续发送请求体。
(2)2xx(成功状态码)
- 这是最常见的一类状态码,表示请求成功被服务器接收、理解并处理。
200 OK
:表示请求成功,服务器成功返回了客户端请求的资源。例如,当浏览器请求一个网页,服务器正确返回了网页的 HTML 代码时,会返回200 OK
。201 Created
:表示请求成功并且服务器创建了一个新的资源。通常在使用 POST 或 PUT 请求创建或更新资源后返回。例如,当成功插入一条新记录到数据库后,服务器可以返回201 Created
。
(3)3xx(重定向状态码)
- 这类状态码表示客户端需要进行额外的操作才能完成请求,通常是需要进行重定向。
301 Moved Permanently
:表示请求的资源已经永久移动到了新的位置,服务器返回新的 URL,客户端以后应该使用新的 URL 进行访问。例如,一个网站更换域名后,旧域名下的资源可以通过301 Moved Permanently
重定向到新域名下对应的资源。302 Found
(或者307 Temporary Redirect
):表示请求的资源临时移动到了新的位置,客户端应该使用新的 URL 进行临时访问。与301
不同的是,302
或307
只是临时重定向,下次访问可能还会回到原来的位置。
(4)4xx(客户端错误状态码)
- 这些状态码表示客户端发送的请求有问题,如请求的资源不存在、请求方法不被允许等。
400 Bad Request
:表示客户端发送的请求语法错误,服务器无法理解。例如,请求参数格式错误或者请求头不符合要求等情况。401 Unauthorized
:表示客户端请求的资源需要进行身份验证,但客户端没有提供有效的认证信息或者认证失败。例如,访问一个需要登录的页面但没有登录时,会返回401 Unauthorized
。403 Forbidden
:表示服务器理解了请求,但拒绝执行。这可能是因为客户端没有权限访问请求的资源,与401
不同的是,403
不是因为缺少认证信息,而是即使提供了认证信息也不被允许访问。例如,用户权限不足,无法访问某些敏感资源。404 Not Found
:这是最常见的客户端错误状态码之一,表示服务器无法找到客户端请求的资源。可能是因为 URL 错误、资源被删除等原因。
(5)5xx(服务器错误状态码)
- 这类状态码表示服务器在处理请求时出现了错误。
500 Internal Server Error
:表示服务器内部出现错误,无法完成请求。这可能是由于服务器代码错误、数据库故障等原因导致的。例如,服务器端的程序在执行过程中抛出了未处理的异常时,会返回500 Internal Server Error
。503 Service Unavailable
:表示服务器暂时无法处理请求,通常是因为服务器过载、维护或者其他临时问题导致的。例如,在高流量时期,服务器资源耗尽,无法响应新的请求时,会返回503 Service Unavailable
。
- 这些状态码主要用于提供信息,表示请求已经被服务器接收,正在处理中。例如,