第二章 协议返回状态码

作者:肖鹏 时间:2018-04-06

2.1 报文信息

2.1.1 报文

HTTP报文本身是由多行数据构成的字符串文本HTTP报文大致可分为报文首部和报文主体两块,最初是由空行来划分,通常,不一定需要报文主体

2.1.2 请求报文及响应报文结构

请求报文结构:

  • 报文首部
    • 请求行:包含用户请求的方法,请求URI和HTTP版本
    • 请求首部字段
    • 通用首部字段
    • 实体首部字段
    • 其他
  • 空行(CR + LF)
  • 报文主体
    响应报文结构:

  • 报文首部

    • 状态行:包含表明响应结果的状态码,原因短语和HTTP版本
    • 响应首部字段
    • 通用首部字段:
    • 实体首部字段
    • 其他
  • 空行(CR + LF)
  • 报文主体
    首部字段:包含请求和响应的各种条件和属性的各类首部,一般有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 状态码总结

- HTTP状态码不可能就这么一点,所以这里我只写了常用状态码,当然标准状态码目前是截止与600,我们也可以自定义状态码- 状态码返回信息字段可以修改,有时会出现服务器出现问题,但是依然返回200的情况,所以实际运用中需要根据实际情况来确定

2.4 总结

本章我们简单的总结了下协议响应和请求的结构,以及状态码,下章我们将从首部字段一个一个分析使用

作者:肖鹏 时间:2018-04-06

原文: http://http.kancloud.spiritling.cn/636196