HTTP 实用指南 | 青训营笔记

89 阅读4分钟

HTTP 超文本传输协议

HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。

HTTP协议的主要特点可概括如下:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

协议分析

报文

以 HTTP/1.1 为例:

First Line

请求行:POST /xxx HTTP/1.1 请求方法 url 路径 协议版本

响应行:HTTP/1.1 403 Forbidden 协议版本 响应状态码 状态字段

Method

image.png

  • Safe(安全的):不会修改服务器的数据的方法。

    • GET
    • HEAD
    • OPTIONS
  • Idempotent 幂等性:同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态是一样的。

    • 所有安全的方法都是幂等的。
    • GET、HEAD、OPTIONS、PUT、DELETE

状态码

  • 1xx 指示信息,表示请求已接收,继续处理

  • 2xx 成功,表示请求已被成功接收、理解、接受

  • 3xx 重定向,要完成请求必须进行更进一步的操作

  • 4xx 客户端错误,请求有语法错误或请求无法实现

    • 401 Unauthorized 请求未经授权
  • 5xx 服务器端错误,服务器未能实现合法的请求

    • 504 Gateway Timeout 网关或者代理的服务器无法在规定的时间内获得想要的响应。

RESTful API

RESTful API(Representational State Transfer):一种 API 设计风格

  1. 每一个 URI 代表一种资源。
  2. 客户端和服务器之间,传递这种资源的某种表现层。
  3. 客户端通过 HTTP method,对服务器端资源进行操作,实现“表现层状态转化”。

image.png

常用请求头

image.png

缓存

强缓存

本地有资源直接用即可。
一些相关的响应头:

  • Expires 到期时间(时间戳)

  • Cache-Control

    • 可缓存性

      • no-cache:协商缓存验证
      • no-store:不适用任何缓存
      • public
      • private
    • 到期

      • max-age

        • 单位为秒
        • 资源的最大生存周期
    • 重新验证 重新加载

      • must-revalidate

        • 与 max-age 一起使用
        • 一旦资源过期,在成功向原始服务器验证之前,不能使用
协商缓存

即使本地具有该资源的缓存,也需要向服务端进行通信,以检查资源是否过期。

  • Etag / If-None-Match 资源的特定版本的标识符,类似于指纹。
  • Last-Modified / If-Modified-Since 最后修改时间。
请求资源流程

image.png

  • 强缓存是否可用

  • 是,读取浏览器缓存

  • 否,检查 协商缓存 相关信息

    • 上一次响应头中是否有 ETag

      • 发起请求,请求头带上 If-None-Match
    • 上一次响应头中是否有 Last-Modified (时间准确性稍差)

      • 发起请求,请求头带上 If-Modified-Since
    • 状态为 304 Not Modified,使用浏览器缓存

    • 状态为 200,将响应的最新的数据缓存协商

cookie

image.png