HTTP 是传输超文本(实际上除了 HTML,可以传输任何类型的文件,如视频、音频、文本等)的协议,是一组用于浏览器-服务器之间数据传输的规则。
HTTP 位于 OSI 七层模型的顶层(应用层),应用程序可以在其中交换数据。HTTP 是 TCP/ICP 协议族的一部分。
HTTPS 是另一种传输协议,这里的 S 表示安全(Secure)。其与 HTTP 的区别在于,消息在传递前会被加密。
浏览器和服务器之间通过 HTTP 报文进行通信。浏览器向服务器发送请求报文,服务器返回给浏览器响应报文。解释如下。
请求报文(request)分为四部分:请求行(request line)、请求头(request headers)、空行(blank line)、请求体(request body)
请求行:任何一个 HTTP 请求的第一行都称之为请求行,包含三部分内容:请求方法(method)、请求路径(request url)、HTTP 版本(HTTP version)
请求方法:表示浏览器请求对资源要进行的操作。
方法 | 作用 |
---|---|
GET | 从服务器请求资源。由于传递的参数直接显示在地址栏中,而浏览器和服务器对 URL 长度有限制,因此 GET 请求不适合传递私密数据和大量数据。 |
POST | 向服务器发送数据。将传递的数据封装在 HTTP 报文的请求体中,可以传输大量数据,同时不会显示在地址栏中。 |
PUT | 更新服务器中的资源。与 POST 类似,但是 PUT 请求指定了资源的存放位置,而 POST 则没有。 |
DELETE | 删除服务器中的资源 |
HEAD | 与 GET 相同,但是响应报文不包含响应体。通常用于获取元数据、检查资源是否存在(验证 URL)、检查资源自上次请求以来是否更改等场景。HEAD 请求因为省去了传输请求体的时间,因此在对应的场景下更加高效。 |
OPTIONS | 浏览器可以使用 OPTIONS 请求来查询服务器在特定资源上允许的 HTTP 方法(如 GET、POST、PUT、DELETE),此时服务端返回的响应报文中包含 Allow 请求头。发送 AJAX 跨域请求访问资源时,浏览器会发送一个 OPTIONS 请求,称之为预检请求,以确保服务器允许该跨域操作,此时服务端返回的响应报文中包含 Access-Control-Allow-Origin 、Access-Control-Allow-Methods 、Access-Control-Allow-Headers 、Access-Control-Max-Age 请求头。 |
请求路径:表示要请求的资源的 URL 地址。请求资源的目标地址需要包含:协议、域名或 IP 地址、端口号、请求路径、请求参数(可选)。
HTTP 版本:当前正在使用的 HTTP 协议版本。常见版本为 HTTP/1.1 和 HTTP/2,默认使用 HTTP/2。
请求头:请求行一结束紧接着就是请求头,提供本次请求的额外信息。可以通过请求头设置浏览器将接收的响应类型等信息。
请求头**类似键值对(name: value)**的形式。值的取值和结构由请求头决定。
请求头不分大小写。
每个请求头占据一行。
常用请求头 | 作用 |
---|---|
User-Agent | 发送请求的浏览器类型 |
Accept | 浏览器可识别的响应数据类型列表 |
Accept-Language | 浏览器可接受的自然语言 |
Accept-Encoding | 浏览器可接受的编码压缩格式 |
Accept-Charset | 浏览器可接受的编码字符集 |
Host | 接收请求的主机名 |
Connection | 浏览器和服务器的连接方式(close 或 keepalive) |
Cookie | 存储于客户端的字段,通常向同一域名的服务端发送属于当前域名的 Cookie |
Content-Type | 浏览器发送的请求体的数据类型 |
空行:请求头后边是一个空行,用于标识请求头部分的结束。
请求体:可选的。一般来说,POST 和 PUT 请求的请求报文中才会包含请求体,其中包含要向服务器发送的数据(如表单输入或文件上传)。
服务器收到请求报文后,对其进行处理,然后向浏览器发送一个响应报文。与请求报文类似,响应报文包含响应行(可以用于标识请求是否成功等)、响应头(设置响应元信息)、空行和响应体(包含请求的资源或提示信息)。
响应报文(response)也分为四部分:状态行(status line)、响应头(response headers)、空行(blank line)、响应体(response body)
状态行:任何一个 HTTP 响应的第一行都称之为状态行,包含三部分内容:HTTP 版本(HTTP version)、状态码(status code)、状态描述(status text)
HTTP 版本:当前正在使用的 HTTP 协议版本。
状态码:表示请求状态的 3 位数字。其中第一个数字表示响应类别。
状态码 | 状态描述 | 含义 |
---|---|---|
1 x x \bf{\Large{1xx}} 1xx | 信息性状态码。 | 表示请求已接收,继续处理。 |
100 | Continue | 表示客户端应该继续请求或忽略此状态码。 |
101 | Switching Protocols | 表示服务端正在根据客户端的请求切换协议。 |
2 x x \bf{\Large{2xx}} 2xx | 成功状态码。 | 表示请求已接收、理解和处理。 |
200 | OK | 表示请求成功,服务器已返回所请求的资源。 |
201 | Created | 表示请求成功,并导致了一个新资源的创建。 |
202 | Accepted | 表示请求已接收,但是尚未处理完成。 |
204 | No Content | 表示请求成功,但没有内容返回。该状态码常用于 DELETE 操作。 |
3 x x \bf{\Large{3xx}} 3xx | 重定向状态码。 | 表示需要客户端采取进一步操作。 |
301 | Moved Permanently | 表示请求的资源已永久移动到新的位置,客户端需要使用新 URL 进行访问。 |
302 | Found | 表示请求的资源临时搬到新的位置,客户端应继续使用原 URL 进行请求。 |
303 | See Other | 表示请求的资源临时搬到新的位置,客户端应继续使用原 URL + GET 方法进行请求。 |
304 | Not Modified | 表示资源未修改,可以使用缓存版本。客户端在请求文件时,如果发现存在的缓存文件中有 Last Modified 时间标识,则向浏览器发送请求时在请求头中包含 If-Modified-Since。如果客户端发现自从 Last Modified 对应资源未改变,则返回 304,表示可以使用缓存文件,否则返回 200。 |
4 x x \bf{\Large{4xx}} 4xx | 客户端错误状态码。 | 表示客户端出现了错误。 |
400 | Bad Request | 表示客户端请求存在语法错误 |
401 | Unauthorized | 表示请求未授权。 |
403 | Forbidden | 表示服务端拒绝请求。 |
404 | Not Found | 表示请求的资源不存在。这可能是因为客户端输入了错误的 URL。 |
405 | Methods Not Allowed | 表示请求方法对资源不适用。这可能是因为使用 GET 请求一个只能 POST 的资源。 |
5 x x \bf{\Large{5xx}} 5xx | 服务器错误状态码。 | 表示服务器在处理请求时发生了内部错误。 |
500 | Internal Server Error | 表示服务器内部错误,无法完成请求。 |
501 | Not Implemented | 表示服务器不支持请求的方法。 |
502 | Bad Gateway | 表示网关或代理服务器从上游服务器中接受到无效响应。 |
503 | Service Unavailable | 表示服务器暂时过载或维护,无法处理请求。 |
504 | Gateway Timeout | 表示网关或代理服务器未及时从上游服务器中接受到响应。 |
状态描述:对状态码简短、可读的描述。
响应头:与请求头类似,提供本次响应的额外信息。
空行:与请求报文的空行类似,标识响应头的结束。
响应体:包含浏览器请求的资源(HTML、JSON、图片等)。
https://medium.com/@adilrk/http-request-and-response-e7da8eb3a00c
https://juejin.cn/post/6931636106710482958