# 第二章 协议返回状态码
> 作者:肖鹏 时间: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
- 首语
- 第一章 HTTP协议及网络基础
- 第二章 协议返回状态码
- 第三章 HTTP通用首部字段
- 第一节 Cache-Control字段
- 第二节 Connection 字段
- 第三节 Date 字段
- 第四节 Pragma 字段
- 第五节 Trailer 字段
- 第六节 Transfer-Encoding 字段
- 第七节 Upgrade 字段
- 第八节 Via 字段
- 第九节 Warning 字段
- 第四章 HTTP请求首部字段
- 第一节 Accept 字段
- 第二节 Accept-Charset 字段
- 第三节 Accept-Encoding 字段
- 第四节 Accept-Language 字段
- 第五节 Authorization 字段
- 第六节 Expect 字段
- 第七节 From 字段
- 第八节 Host 字段
- 第九节 If-Match 字段
- 第十节 If-Modified-Since 字段
- 第十一节 If-None-Match 字段
- 第十二节 If-Range 字段
- 第十三节 If-Unmodified-Since 字段
- 第十四节 Max-Forwards 字段
- 第十五节 Proxy-Authorization 字段
- 第十六节 Range 字段
- 第十七节 Referer 字段
- 第十八节 TE 字段
- 第十九节 User-Agent 字段
- 第五章 HTTP响应首部字段
- 第一节 Accept-Ranges 字段
- 第二节 Age 字段
- 第三节 ETge 字段
- 第四节 Location 字段
- 第五节 Proxy-Authenticate 字段
- 第六节 Retry-After 字段
- 第七节 Server 字段
- 第八节 Vary 字段
- 第九节 WWW-Authenticate 字段
- 第六章 HTTP实体首部字段
- 第一节 Allow 字段
- 第二节 Content-Encoding字段
- 第三节 Content-Language 字段
- 第四节 Content-Length 字段
- 第五节 Content-Location 字段
- 第六节 Content-MD5 字段
- 第七节 Content-Range 字段
- 第八节 Content-Type 字段
- 第九节 Expires 字段
- 第十节 Last-Modified 字段
- 第七章 Cookie相关和其他的首部字段