http报文-概念状态码
http报文信息
用于HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的叫做响应报文。HTTP报文本身是由多行(用CR+LF作换行符)数据构成的字符串文本。
报文结构
报文可以分为:
- 报文首部-服务器或者客户端需要处理或响应的内容及属性
- 报文主体-发送的数据
报文主体不一定必须存在。通常使用空行(CR+LF)来划分两者
报文首部又可以包括: - 请求行/状态行-(包含用于请求的方法,请求URI和HTTP版本/包含表明响应结果的状态码,原因短语和HTTP版本)。
- 首部字段-包含表示请求和响应的各种条件和属性的各类首部。
- 请求首部/响应首部
- 通用首部
- 实体首部
优化传输
报文主体和实体主体的差异(不理解)(知乎)
- 报文-是 HTTP 通信中的基本单位,由 8 位组字节流(octet sequence, 其中 octet为8个比特)组成,通过HTTP通信传输。
- 实体-作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。 HTTP 报文的主体用于传输请求或响应的实体主体。 通常,报文主体等于实体主体。只有当传输中进行编码操作时,实 体主体的内容发生变化,才导致它和报文主体产生差异。
内容编码
可以理解为将文件打包压缩之后上传,加快传输速率。 常用的内容编码:
- gzip(GNUzip)
- compress(UNIX 系统的标准压缩)
- deflate(zlib)
- identity(不进行编码)
分块传输
在HTTP通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面。在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。称为分块传输编码。
分块传输编码会将实体主体分成多个部分(块)。每一块都会用 十六进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)” 来标记。
使用分块传输编码的实体主体会由接收的客户端负责解码,恢复到 编码前的实体主体。
HTTP/1.1 中存在一种称为传输编码(Transfer Coding)的机制,它 可以在通信时按某种编码方式传输,但只定义作用于分块传输编码中。
传输多种数据类型-发送多种数据的多部分对象集合(Content-type 如接口上传文件等)
采用 MIME(Multipurpose Internet Mail Extensions,多用途因特网 邮件扩展)机制允许邮件处理文本、图片、视频等多个不同类型的 数据。例如,图片等二进制数据以 ASCII 码字符串编码的方式指明,就 是利用 MIME 来描述标记数据类型。而在 MIME 扩展中会使用一种称 为多部分对象集合(Multipart)的方法,来容纳多份不同类型的数据。 HTTP 协议中也采纳了多部分对象集合,发送的一份报文 主体内可含有多类型实体。通常是在图片或文本文件等上传时使用。
- multipart/form-data (web表单上传使用,使用ajax传入formData对象)
- multipart/byteranges (状态码 206(Partial Content,部分内容)响应报文包含了多个范 围的内容时使用。如使用Range标记指定传输范围) 在 HTTP 报文中使用多部分对象集合时,需要在首部字段里加上 Content-type。
内容协商机制
内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言(中英文网站)、字符集(charset)、编码方式(压缩方式)等作为判断的基准。
包含在请求报文中的某些首部字段可以作为判断标准,比如:
- Accept
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Content-Language
应用:浏览器协商缓存
http状态码
状态码告知从服务器端返回的请求结果。格式如: 200 OK
,以3位数字和原因短语组成。
状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。
基本的响应类别
数字中的第一位指定了响应类别,后两位无分类。响应类别有以下 5 种
状态码 | 类别 | 原因短语 |
---|---|---|
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
注意:状态码可以自行定义,只要遵守状态码类别的定义,即使改变RFC2616中定义的状态码, 或服务器端自行创建状态码都没问题。
常见的状态码
状态码和状况的不一致
不少返回的状态码响应都是错误的,但是用户可能察觉不到这点。比 如 Web 应用程序内部发生错误,状态码依然返回 200 OK,这种情况也经常遇到.
2XX 成功
表明请求被正常处理。
200 OK
表示从客户端发来的请求在服务器端被正常处理。在响应报文内,随状态码一起返回的信息会因方法的不同而发生改变。比如,使用GET 方法时,对应请求资源的实体会作为响应返回;而使用HEAD方法时,对应请求资源的实体主体不随报文首部作为响应返回(即在响应中只返回首部,不会返回实体的主体部分)。
204 No Content
该状态码代表服务器接收的请求已成功处理,但在返回的响应报文 中不含实体的主体部分。另外,也不允许返回任何实体的主体。一般在只需要从客户端往服务器发送信息,而对客户端不需要发送 新信息内容的情况下使用。当从浏览器发出请求处理后,返回 204 响应,那么浏览器显示的页面不发生更新。
206 Partial Content
该状态码表示客户端进行了范围请求,而服务器成功执行了这部分 的 GET 请求。响应报文中包含由 Content-Range指定范围的实体内容。
3XX 重定向
表明浏览器需要执行某些特殊的处理以正确处理请求。
301 Moved Permanently
永久性重定向。代表访问的uri已经被分配新的uri。302 Found
临时性重定向。该状态码表示请求的资源需要访问新的 URI,希望用户(本次)能使用新的URI访问。如用到用户登陆验证和 301 Moved Permanently 状态码相似,但 302 状态码代表的资源 不是被永久移动,只是临时性质的。换句话说,已移动的资源对应的 URI 将来还有可能发生改变。比如,用户把 URI 保存成书签,但不会像 301 状态码出现时那样去更新书签,而是仍旧保留返回 302 状态码的页 面对应的 URI。
303 See Other
该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。303 状态码和 302 Found 状态码有着相同的功能,但 303 状态码明 确表示客户端应当采用 GET 方法获取资源,这点与 302 状态码有区别。
304 Not Modified
该状态码表示服务器端资源未改变,可直接使用客户端未过期的缓存。客户端发送附带条件的请求时,服务器端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回 304 Not Modified。 304 状态码返回时,不包含任何响应的主体部分。304 虽然被划分在3XX类别中,但是和重定向没有关系。附带条件的请求是指采用GET方法的请求报文中包含If-Match,If-ModifiedSince,If-None-Match,If-Range,If-Unmodified-Since中任一首部。(我理解为在Nginx或node服务中配置的缓存策略)
307 Temporary Redirect
临时重定向。该状态码与 302 Found 有着相同的含义。尽管 302 标 准禁止 POST 变换成 GET,但实际使用时大家并不遵守。307 会遵照浏览器标准,不会从 POST 变成 GET。但是,对于处理 响应时的行为,每种浏览器有可能出现不同的情况。
4XX 客户端错误
表示响应结果发生错误原因是客户端。(实际也不全是,某些后端数据库查询出错给返回400)
400 Bad Request
该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求 的内容后再次发送请求。浏览器会像 200 OK 一样对待该状态码(接口请求可以正常处理响应实体)401 Unauthorized
该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、 DIGEST 认证)的认证信息。另外若之前已进行过 1 次请求,则表示用 户认证失败。返回含有 401 的响应必须包含一个适用于被请求资源的 WWW-Authenticate 首部用以质询(challenge)用户信息。当浏览器初次接收 到 401 响应,会弹出认证用的对话窗口。
403 Forbidden
表明对请求资源的访问被服务器拒绝。服务器端没有必 要给出拒绝的详细理由,但如果想作说明的话,可以在实体的主体部分 对原因进行描述,这样就能让用户看到了。未获得文件系统的访问授权,访问权限出现某些问题可能会产生403。404 Not Found
该状态码表明服务器上无法找到请求的资源。除此之外,也可以在 服务器端拒绝请求且不想说明理由时使用。404,你懂得405 Method not allowed
表明服务器禁止了使用当前 HTTP 方法的请求。需要注意的是,GET 与 HEAD 两个方法不得被禁止,当然也不得返回状态码 405。406 Not Acceptable
表示客户端错误,指代服务器端无法提供与 Accept-Charset 以及 Accept-Language 消息头指定的值相匹配的响应
5XX 服务端错误
表明服务器本身发生错误。
500 Internal Server Error
表明服务器端在执行请求时发生了错误。也有可能是 Web 应用存在的 bug 或某些临时的故障。501 Not Implemented
服务器错误响应码表示请求的方法不被服务器支持,因此无法被处理。502 Bad Gateway
错误网关,无效网关。这通常并不意味着上游服务器已关闭(无响应网关/代理) ,而是上游服务器和网关/代理使用不一致的协议交换数据。 鉴于互联网协议是相当清楚的,它往往意味着一个或两个机器已不正确或不完全编程。503 Service Unavailable
该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无 法处理请求。如果事先得知解除以上状况需要的时间,最好写入 RetryAfter 首部字段再返回给客户端。504 Gateway Timeout
表示扮演网关或者代理的服务器无法在规定的时间内获得想要的响应。