目录
一 、常见响应状态码
1.1 状态码的作用
状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。
1.2 状态码的类别
- HTTP状态码种类繁多,数量可达60余种,实际上经常使用的大概只有十几种。
类别 | 原因短语 | |
---|---|---|
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
1.2.1 2XX 成功(2XX 的响应结果表明请求被正常处理了)
表示从客户端发来的请求在服务器端被正常处理了。 在响应报文内,随状态码一起返回的信息会因方法的不同而发生改变。比如,使用 GET
方法时,对应请求资源的实体会作为响应返回;而使用 HEAD 方法时,对应请求资源的实体首部不随报文主体
作为响应返回(即在响应中只返回首部,不会返回实体的主体部分)
1.2.2 204 No Content
该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。比如,当从浏览器发出请求处理后,返回 204 响应,那么浏览器显示的页面不发生更新。所以对于一些提交到服务器处理的数据,只需要返回是否成功的情况下,可以考虑使用状态码204来作为返回信息,从而省掉多余的数据传输。
1.2.3 206 Partial Content
该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。
1.3 3XX 重定向
3XX 响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。
1.3.1 301 Moved Permanently
永久性重定向。该状态码表示请求的资源已被分配了新的 URI,以后应使用资源现在所指的 URI。也就是说,如果已经把资源对应的 URI
保存为书签了,这时应该按 Location 首部字段提示的 URI 重新保存。
1.3.2 302 Found
临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。
和 301MovedPermanently 状态码相似,但 302 状态码代表的资源不是被永久移动,只是临时性质的。换句话说,已移动的资源对应的 URI将来还有可能发生改变。
1.3.3 303 See Other
该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。 303 状态码和 302 Found 状态码有着相同的功能,但 303 状态码明确表示客户端应当采用 GET 方法获取资源,这点与 302 状态码有区别。
1.3.4 304 Not Modified
该状态码表示请求的资源并未修改,可以直接使用本地的缓存
1.4 4XX 客户端请求错误
1.4.1 400 Bad Request
该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。
1.4.2 401 Unauthorized
该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。另外若之前已进行过 1 次请求,则表示用户认证失败。
1.4.3 403 Forbidden
该状态码表明对请求资源的访问被服务器拒绝了。服务器端没有必要给出拒绝的详细理由,但如果想作说明的话,可以在响应体中对原因进行描述,这样就能让用户看到了。
未获得文件系统的访问授权,访问权限出现某些问题(从未授权的发送源 IP 地址试图访问)等列举的情况都可能是发生 403 的原因。
1.4.4 404 Not Found
该状态码表明服务器上无法找到请求的资源。
1.5 5XX 服务器错误
5XX 的响应结果表明服务器本身发生错误。
1.5.1 500 Internal Server Error
该状态码表明服务器端在执行请求时发生了错误。也有可能是 Web 应用存在的 bug 或某些临时的故障。
1.5.2 503 Service Unavailable
该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
二、常见的头部信息
2.1 常见的通用头部字段
HTTP报文的头部域信息内容其实有很多,每个头部域字段的控制都具有自己的逻辑和判断机制,以下是常见的一些头部域字段的设置。
2.1.1 Date
Date 字段表明创建 HTTP 报文的日期和时间。
2.1.2 Upgrade
Upgrade字段用于检测 HTTP 协议及其他协议是否可以使用更高的版本进行通信。
2.2 常见的请求头部字段
2.2.1 Host
Host 会告知服务器,请求的资源所处的互联网主机名和端 口号。Host 首部字段在 HTTP/1.1 规范内是唯一一个必须被包含在请求内的首部字段。Host 和以域名设置的虚拟主机的工作机制有很密切的关联,这是 Host 字段必须存在的意义。
请求被发送至服务器时,请求中的主机名会用 IP 地址直接替换解 决。但如果这时,相同的 IP 地址下部署运行着多个域名,那么服务器就会无法理解究竟是哪个域名对应的请求。因此,就需要使用首部 字段 Host 来明确指出请求的主机名。
2.2.2 Referer
告诉服务器我是从哪个页面链接过来的,服务器借此可以获取一些信息用于处理。可用于防盗链。
2.2.3 User-Agent
告诉服务器,客户端使用的操作系统和浏览器的名称和版本。
2.2.4 Cookie
服务器委托浏览器存储在客户端里的一些数据,这些数据通常都会记录用户的关键识别信息。
2.2.5 Accept
浏览器端可以接受的MIME类型。例如:Accept: text/html 代表浏览器可以接受服务器回发的类型为 text/html也就是我们常说的html文档,如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误 (non acceptable)。通配符 * 代表任意类型,例如 Accept: */*代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)。
2.2.6 Accept-Language
该字段是浏览器用来告知服务区自己接受的语言,能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。(字段中的q表示权重,可用值为0 到1,数字越大,权重越高,可精确到小数点后三位)
示例:Accept-Language zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
2.2.7 Accept-Encoding
该字段申明浏览器自己可接受的编码方式,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)采用权重 q 值来表示相对优先级,这点与首部字段 Accept相同。另外,也可使用星号(*)作为通配符,指定任意的编码格式。(注意:这不是指字符编码方式)
示例:Accept-Encoding gzip, deflate, br
2.2.8 If-Modified-Since
把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果
If-Modified-Since
的时间在文件的最后修改时间之后,会返回304,客户端就直接使用本地缓存文件。如果If-Modified-Since`的时间在文件的最后修改时间之前,就会返回新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。
例如:If-Modified-Since: Mon, 10 Oct 2022 15:34:46 GMT
2.2.9 If-None-Match
If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。当用户再次请求该资源时,将在HTTP Request中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源以及Etag
2.2.10 Range
对于只需获取部分资源的范围请求,头部字段 Range 可告知服务器资源的指定范围。 接收到附带 Range首部字段请求的服务器,会在处理请求之后返回状态码为 206 Partial Content 的响应。无法处理该范围请求时,则会返回状态码200 OK 的响应及全部资源。
示例:Range: bytes=5001-10000 (表示请求获取从第 5001 字节至第 10000 字节的资源)
2.3 常见的响应头部字段
2.3.1 ETag
对象(比如 URL)的标志值。一个对象(如 HTML 文件)如果被修改了,其 Etag 也会被修改,所以 Etag 的作用和Last-Modified 差不多,主要供 Web 服务器判断一个对象是否改变。例如前一次请求某个 HTML 文件时获得了其Etag,当这次又请求该文件时,浏览器就会把先前获得的 Etag 值发送给 Web 服务器,然后 Web 服务器会将这个 Etag值跟该文件当前的 Etag 值进行对比,判断文件是否改变。
ETag 能告知客户端实体标识。它是一种可将资源以字符串 形式做唯一性标识的方式。服务器会为每份资源分配对应的 ETag 值,当资源更新时,ETag 值也需要更新。
2.3.2 Server
Server能告知客户端当前服务器上安装的 HTTP 服务器应用程序的信息。不单单会标出服务器上的软件应用名称,还有可能包括版本号和安装时启用的可选项。
2.3.3 Set-Cookie
非常重要的header,用于把cookie发送到客户端浏览器,每写入一个cookie都会生成一个Set- Cookie。
2.3.4 Connection
Connection: keep-alive 告诉客户端服务器的tcp连接是一个长连接,客户端可以继续使用这个tcp连接发送http请求
Connection: close 告诉客户端服务器的tcp连接不是长连接,客户端如果还要发送http请求的话需要再次建立tcp连接
2.3.4 Location
该字段可以将客户端引导至某个与请求URL位置不同的资源,或者说将客户端引导到一个新的URL。该字段会配合3XX响应,提供重定向的功能,基本上所有的浏览器在接收到包含Location 的响应后都会强制尝试对已提示的重定向资源进行访问。
2.4 常见的实体头部字段
针对请求体或响应体,实体头部字段是包含在请求报文和响应报文中的针对实体部分使用的头部信息,用于补充实体相关的信息
2.4.1 Conten-Type
在请求当中的话,客户端告诉服务端请求体的数据类型。
在响应当中的话,服务端告诉客户端响应体的数据类型。
2.4.2 Content-Length
该字段表明了请求体或响应体的大小(单位是字节)
2.4.3 Content-Location
该字段表示报文主体对应的URL
2.4.4 Content-Language
该字段会告知客户端响应体使用的自然语言(中文、等语言)
2.4.5 Content-Encoding
告知客户端服务器对实体的主体部分选用的内容编码方式。内容编码是指在不丢失实体信息的前提下所进行的压缩。 如
Content-Encoding:gzip
表示服务器告诉客户端,发送的资源采用的压缩格式是gzip,客户端看到这个信息后,应该采用gzip对资源进行解码。
2.4.6 Content-Range
针对范围请求返回响应时使用的首部字段,字段值以字节为单位,表示当前发送部分及整个实体大小。
2.4.7 Last-Modified
用于指示资源的最后修改日期和时间。