初识HTTP | 青训营笔记

90 阅读8分钟

这是我参与「第五届青训营 」笔记创作活动的第5天

主要内容
HTTP 协议的基本定义
HTTP 协议主要特征
HTTP 协议发展历程
HTTP 协议的报文结构
参考资料: developer.mozilla.org/en-US/docs/…

HTTP 介绍

什么是HTTP

Hyper Text Transfer Protocol 超文本传输协议

是 client-server 协议,由 浏览器/用户代理 发起

  • 超文本
  • 应用层协议,基于TCP协议
  • 分为请求和响应两部分 request-response
  • 简单可扩展
  • 无状态:没有记忆能力,每个请求都是独立的

特点

TCP协议的特点是:

  • 面向连接
  • 点对点(一对一)
  • 可靠交付
  • 面向字节流

协议分析

发展阶段

HTTP/0.9版本:单行协议

HTTP/1.1版本:标准化协议

HTTP/2版本:性能更优

报文

请求 request 的组成:

  • 定义客户端的动作行为:GET POST OPTIONS HEAD

  • 要获取的资源的路径

  • HTTP协议版本号

  • 其他信息的标头 headers

  • 报文主体

响应 response 的组成:

  • HTTP 协议版本号

  • 一个状态码 status code,来告知对应请求执行成功或失败,以及失败的原因

  • 一个状态信息,这个信息是非权威的状态码描述信息,可以由服务端自行设定

  • HTTP 标头,与请求标头类似

  • 可选项,比起请求报文,响应报文中更常见地包含获取资源的主体

速查:常见响应状态码

  • 信息响应

100 Continue:迄今为止的所有内容都是可行的,客户端应该继续请求,如果已经完成,则忽略它。

101 Switching Protocols:响应客户端的 Upgrade 请求头发送的,指明服务器即将切换的协议。

102 Processing (WebDAV):表示服务器已收到并正在处理该请求,但当前没有响应可用。

103 Early Hints:此状态代码主要用于与 Link 链接头一起使用,以允许用户代理在服务器准备响应阶段时开始预加载 preloading 资源。

  • 成功响应

200 OK:请求成功。成功的含义取决于 HTTP 方法:

GET: 资源已被提取并在消息正文中传输。

HEAD: 实体标头位于消息正文中。

PUTPOST: 描述动作结果的资源在消息体中传输。

TRACE: 消息正文包含服务器收到的请求消息。

201 Created:该请求已成功,并因此创建了一个新的资源。这通常是在 POST 请求,或是某些 PUT 请求之后返回的响应。

202 Accepted:请求已经接收到,但还未响应,没有结果。意味着不会有一个异步的响应去表明当前请求的结果,预期另外的进程和服务去处理请求,或者批处理。

203 Non-Authoritative Information:服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。当前的信息可能是原始版本的子集或者超集。

204 No Content:对于该请求没有的内容可发送,但头部字段可能有用。用户代理可能会用此时请求头部信息来更新原来资源的头部缓存字段。

205 Reset Content:告诉用户代理重置发送此请求的文档。

206 Partial Content:当从客户端发送Range范围标头以只请求资源的一部分时,将使用此响应代码。

207 Multi-Status :对于多个状态代码都可能合适的情况,传输有关多个资源的信息。

208 Already Reported :在 DAV 里面使用 dav:propstat 响应元素以避免重复枚举多个绑定的内部成员到同一个集合。

226 IM Used:服务器已经完成了对资源的GET请求,并且响应是对当前实例应用的一个或多个实例操作结果的表示。

  • 重定向消息

300 Multiple Choice:请求拥有多个可能的响应。用户代理或者用户应当从中选择一个。

301 Moved Permanently:请求资源的 URL 已永久更改。在响应中给出了新的 URL。

302 Found:此响应代码表示所请求资源的 URI 已 暂时 更改。未来可能会对 URI 进行进一步的改变。因此,客户机应该在将来的请求中使用这个相同的 URI。

303 See Other:服务器发送此响应,以指示客户端通过一个 GET 请求在另一个 URI 中获取所请求的资源。

304 Not Modified:这是用于缓存的目的。它告诉客户端响应还没有被修改,因此客户端可以继续使用相同的缓存版本的响应。

307 Temporary Redirect:服务器发送此响应,以指示客户端使用在前一个请求中使用的相同方法在另一个 URI 上获取所请求的资源。

308 Permanent Redirect:这意味着资源现在永久位于由Location: HTTP Response标头指定的另一个 URI。这与301 Moved PermanentlyHTTP 响应代码具有相同的语义,但用户代理不能更改所使用的 HTTP 方法:如果在第一个请求中使用 POST,则必须在第二个请求中使用 POST

  • 客户端错误响应

400 Bad Request:由于被认为是客户端错误(例如,错误的请求语法、无效的请求消息帧或欺骗性的请求路由),服务器无法或不会处理请求。

401 Unauthorized:虽然 HTTP 标准指定了"unauthorized",但从语义上来说,这个响应意味着"unauthenticated"。也就是说,客户端必须对自身进行身份验证才能获得请求的响应。

403 Forbidden:客户端没有访问内容的权限;也就是说,它是未经授权的,因此服务器拒绝提供请求的资源。与 401 Unauthorized 不同,服务器知道客户端的身份。

404 Not Found:服务器找不到请求的资源。在浏览器中,这意味着无法识别 URL。在 API 中,这也可能意味着端点有效,但资源本身不存在。服务器也可以发送此响应,而不是 403 Forbidden,以向未经授权的客户端隐藏资源的存在。这个响应代码可能是最广为人知的,因为它经常出现在网络上。

405 Method Not Allowed:服务器知道请求方法,但目标资源不支持该方法。例如,API 可能不允许调用DELETE来删除资源。

406 Not Acceptable:当 web 服务器在执行服务端驱动型内容协商机制后,没有发现任何符合用户代理给定标准的内容时,就会发送此响应。

407 Proxy Authentication Required:类似于401 Unauthorized 但是认证需要由代理完成。

408 Request Timeout:此响应由一些服务器在空闲连接上发送,即使客户端之前没有任何请求。这意味着服务器想关闭这个未使用的连接。

409 Conflict:当请求与服务器的当前状态冲突时,将发送此响应。

410 Gone:当请求的内容已从服务器中永久删除且没有转发地址时,将发送此响应。客户端需要删除缓存和指向资源的链接。HTTP 规范打算将此状态代码用于“有限时间的促销服务”。API 不应被迫指出已使用此状态代码删除的资源。

411 Length Required:服务端拒绝该请求因为 Content-Length 头部字段未定义但是服务端需要它。

412 Precondition Failed:客户端在其头文件中指出了服务器不满足的先决条件。

413 Payload Too Large:请求实体大于服务器定义的限制。服务器可能会关闭连接,或在标头字段后返回重试 Retry-After

414 URI Too Long:客户端请求的 URI 比服务器愿意接收的长度长。

415 Unsupported Media Type:服务器不支持请求数据的媒体格式,因此服务器拒绝请求。

416 Range Not Satisfiable:无法满足请求中Range标头字段指定的范围。该范围可能超出了目标 URI 数据的大小。

417 Expectation Failed:此响应代码表示服务器无法满足Expect请求标头字段所指示的期望。

  • 服务端错误响应

500 Internal Server Error:服务器遇到了不知道如何处理的情况。

501 Not Implemented:服务器不支持请求方法,因此无法处理。服务器需要支持的唯二方法(因此不能返回此代码)是 GET HEAD.

502 Bad Gateway:此错误响应表明服务器作为网关需要得到一个处理这个请求的响应,但是得到一个错误的响应。

503 Service Unavailable:服务器没有准备好处理请求。常见原因是服务器因维护或重载而停机。请注意,与此响应一起,应发送解释问题的用户友好页面。

504 Gateway Timeout:当服务器充当网关且无法及时获得响应时,会给出此错误响应。

505 HTTP Version Not Supported:服务器不支持请求中使用的 HTTP 版本。

506 Variant Also Negotiates:服务器存在内部配置错误:所选的变体资源被配置为参与透明内容协商本身,因此不是协商过程中的适当终点。