# 第二章 协议返回状态码 > 作者:肖鹏 时间:2018-04-06 ## 2.1 报文信息 ### 2.1.1 报文 HTTP报文本身是由多行数据构成的字符串文本 HTTP报文大致可分为报文首部和报文主体两块,最初是由空行来划分,通常,不一定需要报文主体 ### 2.1.2 请求报文及响应报文结构 请求报文结构: 1. 报文首部 1. 请求行:**包含用户请求的方法,请求URI和HTTP版本** 2. 请求首部字段 3. 通用首部字段 4. 实体首部字段 5. 其他 2. 空行(CR + LF) 3. 报文主体 响应报文结构: 1. 报文首部 1. 状态行:**包含表明响应结果的状态码,原因短语和HTTP版本** 2. 响应首部字段 3. 通用首部字段: 4. 实体首部字段 5. 其他 2. 空行(CR + LF) 3. 报文主体 首部字段:包含请求和响应的各种条件和属性的各类首部,一般有4种首部,分别是:通用首部、请求首部、响应首部和实体首部 ### 2.1.3 报文和实体差异 > 报文(message): 是HTTP通信中的基本单位,由8位组字节流(octet sequence,其中octet为8个比特)组成,通过HTTP通信传输。 > 实体(entity): 作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。 > HTTP报文的主体用于传输请求或响应的实体主体。 > > 通常,报文主体等于实体主体,只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。** 后面会多次出现,所以我们在这里提前了解两者差异 ** ## 2.2 请求行信息 > GET /index.html HTTP/1.1 请求方法: | 方法 | 详细 | | ---|--- | | GET | 请求获取服务器资源,返回报文主体 | | HEAD | 用于确认URI的有效性及资源更新的日期时间等,和GET一样,只不过不返回主体 | | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。| | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 | | DELETE | 请求服务器删除指定的页面。| | CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。要求使用隧道协议连接代理 | | OPTIONS | 允许客户端查看服务器的性能,询问支持的方法 | | TRACE | 回显服务器收到的请求,主要用于测试或诊断。追踪路劲 | 一般 DELETE,PUT直接被禁用,毕竟在HTTP/1.1中没有验证机制,所以为了服务器的安全,一般会禁止使用这两种方法 ## 2.3 响应状态码 > HTTP状态码负责表示客户端HTTP请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。当然可以自定义状态码 | 类别 | 信息 | 原因短语 | | ---|--- | --- | | 1XX | Informational(信息性状态码) | 接收的请求正在处理 | | 2XX | Success(成功状态码) | 请求正常处理完毕 | | 3XX | Redirection(重定向状态码) | 需要进行附加操作已完成请求 | | 4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 | | 5XX | Server Error(服务端错误状态码) | 服务器处理请求出错 | ### 2.3.1 1XX 继续 | 状态码 | 信息 |表示 | | ---|--- | --- | | 100 | Continue | 客户端应当继续发送请求 | | 101 | Switching Protocols | 服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求 | | 102 | Processing | 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行 | ### 2.3.2 2XX 成功 | 状态码 | 信息 |表示 | | ---|--- | --- | | 200 | OK | 从客户端发来的请求在服务端正常处理 | | 204 | No Content | 服务端接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分,另外也不允许返回任何实体的主体 | | 206 | Partial Content | 客户端进行了范围请求, 而服务器成功执行了这部分请求,响应报文中包含由Content—Range 指定的范围的实体内容 | ### 2.3.3 3XX 重定向 | 状态码 | 信息 |表示 | | ---|--- | --- | | 301 | Moved Permanently | 永久性重定向 | | 302 | Found | 临时性重定向 | | 303 | See Other | 由于对应的资源存在着另一个uri,应使用GET方法定向获取请求的资源 | | 304 | Not Modified | 客户端发送附带条件的请求,也就是资源找到了,但是没有符合条件请求 | | 307 | Tempoeary Redirect | 临时重定向,和302很相似,但是会根据游览器不同导致出现不同问题 | > 注意:当301、302、303响应状态码返回时,几乎所有的游览器都会把POST改为GET,并删除请求报文内的主体,之后请求会自动再次发送 > > 301、302标准是禁止将POST改为GET方法,但实际使用时都会改变 > 304的请求附加条件是指采用GET方法的请求报文中包含If-Match、If-Modified-Since、IF-None-Match、IF-Range、If-Unmodified-Since中的任一首部 ### 2.3.4 4xx 客户端错误 > 4XX 的响应结果表明客户端是发生错误的原因所在 | 状态码 | 信息 | 表示 | | ---|--- | --- | | 400 | Bad Request | 请求报文中存在语法错误:游览器会像200 OK 一样对待改状态码 | | 401 | Unauthorized | 发送的请求需要通过http认证(BASIC认证、DIGEST认证)的认证信息,如果前面已经请求过一次,证明认证失败 | | 403 | Forbidden | 请求资源的访问被服务器拒绝 | | 404 | Not Found | 服务器无法找到请求的资源 | ### 2.3.5 5xx 服务器错误 | 状态码 | 信息 | 表示 | | --- | --- | --- | | 500 | Internal Server Error | 服务器端知悉请求时发生错误 | | 503 | Service Unavailable | 服务器暂时处于超负载或正在进行停机维护,现在无法处理请求 | > Ps:作为前端进行ajax请求时,出现5xx错误,那最大的可能是服务端出现问题。 ### 2.3.6 状态码总结 > 1. HTTP状态码不可能就这么一点,所以这里我只写了常用状态码,当然标准状态码目前是截止与600,我们也可以自定义状态码 > 2. 状态码返回信息字段可以修改,有时会出现服务器出现问题,但是依然返回200的情况,所以实际运用中需要根据实际情况来确定 ## 2.4 总结 本章我们简单的总结了下协议响应和请求的结构,以及状态码,下章我们将从首部字段一个一个分析使用 >作者:肖鹏 时间:2018-04-06