HTTP 响应头 Deprecation 字段在 API 版本迭代的应用

API 版本迭代过程中,我们希望使用者能保持使用新版本 API,并且知道他正在使用的旧版本 API 即将废弃。维护者与使用者关于这点的沟通通常通过下面的方式:

  1. 维护者定期更新网站中 API 版本信息,使用者定期关注
  2. 维护者通过邮件主动通知使用者

这两种方式并不可靠,如果双方开发人员可以在程序交互时就交流这个信息,会比依赖人的通知更为准时可靠。
目前社区打算引进一个新的 HTTP 响应头字段 Deprecation 来传递这个信息

  • refer:draft-ietf-httpapi-deprecation-header

字段的格式:Deprecation: 1688169599

应用案例

原始版本
下面的案例中存在两个版本,使用者使用的是旧版本的接口,版本的信息交互只能通过响应体中的 [Version 1] 来传递(实际应用中可能在 json 响应字段中或者其他地方),这种方式的问题在于它不具备普适性,每个外部依赖的 API 关于版本废弃的信息格式和位置都不一样,很难做基础开发。

from flask import Flaskapp = Flask(__name__)@app.route("/v1/list_books")
def get_book_list():return "This is a book list! [Version 1]"@app.route("/v2/list_books")
def get_book_list_v2():return "This is a book list! [Version 2]"
➜  ~ curl -i http://172.21.208.1:5000/v1/list_books
HTTP/1.1 200 OK
Server: Werkzeug/3.0.6 Python/3.11.9
Date: Mon, 18 Nov 2024 07:04:25 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 20
Connection: closeThis is a book list!%

使用 Deprecated 字段版本

from datetime import datetimefrom flask import Flask, make_responseapp = Flask(__name__)@app.route("/v1/list_books")
def get_book_list():resp = make_response("This is a book list!")deprecation_date = int(datetime(2024,11,20,23,59,59).timestamp())resp.headers["Deprecation"] = deprecation_datereturn resp@app.route("/v2/list_books")
def get_book_list_v2():return "This is a book list! [Vesion 2]"
➜  ~ curl -i http://172.21.208.1:5000/v1/list_books
HTTP/1.1 200 OK
Server: Werkzeug/3.0.6 Python/3.11.9
Date: Mon, 18 Nov 2024 08:36:03 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 20
Deprecation: 1732118399
Connection: close

这个版本只是增加了一个头字段,但对于API使用者来说可以做的发挥就增加了。
由于字段与时间表示方式遵循协议制定的格式,使用者可以做统一的开发,在响应头提取到 Deprecation 字段后:

  1. 使用者的系统对外部调用的API 统一监测响应头中的 Deprecation 字段,发出提示和告警,对于已经到达时间阈值内的发出告警
  2. 项目的请求中间件可以据此发出警告日志,从而使得在开发时得到提醒

下面我对这种应用做下基本演示:

# 客户端代码
import logging
import time
from datetime import timedeltaimport requestslogger = logging.Logger("Detect")def api_response_hook(func):def new_func():resp = func()deprecation = resp.headers.get("Deprecation")if deprecation:# 对 deprecation 提取到的时间值做计算,开发者可以清楚感知到还剩几天过期seconds = int(deprecation) - int(time.time())remain_days = timedelta(seconds=seconds).dayslogger.warning(f"Warning:{resp.request.url} will be deprecate after {remain_days} days!")return respreturn new_func@api_response_hook
def list_books():resp = requests.get("http://127.0.0.1:5000/v1/list_books")return respdef main():resp = list_books()print(resp.text)if __name__ == "__main__":main()
Warning:http://127.0.0.1:5000/v1/list_books will be deprecate after 2 days!
This is a book list!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/474434.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《通往人工智能深度学习专家之路:全面解析学习路线图》

《通往人工智能深度学习专家之路:全面解析学习路线图》 一、人工智能深度学习简介1.1 人工智能与深度学习的关系1.2 深度学习的应用领域1.3 深度学习的重要性 二、深度学习路线图总览2.1 学习路线图的结构2.2 各阶段学习目标与重点 三、深度学习基础阶段3.1 数学基础…

Git 分⽀规范 Git Flow 模型

前言 GitFlow 是一种流行的 Git 分支管理策略,由 Vincent Driessen 在 2010 年提出。它提供了一种结构化的方法来管理项目的开发、发布和维护,特别适合大型和复杂的项目。GitFlow 定义了一套明确的分支模型和工作流程,使得团队成员可以更有效…

任务管理功能拆解——如何高效管理项目任务?

在项目管理中,任务管理功能不仅仅是一个操作工具,它是确保项目按时、高效完成的核心所在。无论是小团队还是跨部门合作,任务管理能够帮助项目经理和团队成员清晰地看到每一项任务的执行情况和进度,从而合理调配资源、优化工作流程…

nodejs入门(1):nodejs的前后端分离

一、引言 我关注nodejs还是从前几年做了的一个电力大数据展示系统开始的,当然,我肯定是很多年的计算机基础的,万变不离其宗。 现在web网站都流行所谓的前后端结构,不知不觉我也开始受到这个影响,以前都是前端直接操作…

集群聊天服务器(13)redis环境安装和发布订阅命令

目录 环境安装订阅redis发布-订阅的客户端编程环境配置客户端编程 功能测试 环境安装 sudo apt-get install redis-server 先启动redis服务 /etc/init.d/redis-server start默认在6379端口上 redis是存键值对的,还可以存链表、数组等等复杂数据结构 而且数据是在…

深入解析大带宽服务器:性能优势与选择指南

一、大带宽服务器是什么? 大带宽服务器指的是具备高网络带宽能力的服务器,通常提供1Gbps、10Gbps甚至更高的网络连接能力。与普通带宽服务器相比,大带宽服务器能够在更短时间内传输大量数据,因此常用于高流量、高并发需求的场景&…

关于Qt C++中connect的几种写法

目录 1. 传统的槽函数写法 2. 使用函数指针的connect写法(5.0) 3. Lambda表达式作为槽函数(C11) 4.使用QOverload选择重载信号的写法 这connect函数就像是编程世界里的“茴”字,千变万化,各有千秋。咱们…

常见网络厂商设备默认用户名/密码大全

常见网络厂商的默认用户名/密码 01 思科 (Cisco) 设备类型:路由器、交换机、防火墙、无线控制器 默认用户名:cisco 默认密码:cisco 设备类型:网管型交换机 默认用户名:admin 默认密码:admin 02 华…

elasticsearch是如何实现master选举的?

大家好,我是锋哥。今天分享关于【elasticsearch是如何实现master选举的?】面试题。希望对大家有帮助; elasticsearch是如何实现master选举的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中&…

讯飞、阿里云、腾讯云:Android 语音合成服务对比选择

在 移动端 接入语音合成方面,讯飞和腾讯云等都是优秀的选择,但各有其特点和优势。咱们的需求是需要支持普通话/英语/法语三种语言,以下是对各个平台的详细比较: 一、讯飞语音合成介绍 与语音听写相反,语音合成是将一段…

说说软件工程中的“协程”

在软件工程中,协程(coroutine)是一种程序运行的方式,可以理解成“协作的线程”或“协作的函数”。以下是对协程的详细解释: 一、协程的基本概念 定义:协程是一组序列化的子过程,用户能像指挥家…

使用 JavaScript 制作 To-Do List

使用 JavaScript 制作 To-Do List 本文记录了使用 HTML、CSS 和 JavaScript 制作一个简单的 To-Do List 网页的全过程,包含功能描述、代码实现以及优化方向。 **🎉🎉🎉欢迎来到我的博客,我是一名自学了2年半前端的大一学生,熟悉的…

HarmonyOs鸿蒙开发实战(16)=>沉浸式效果第一种方案一窗口全屏布局方案

1.沉浸式效果的目的 开发应用沉浸式效果主要指通过调整状态栏、应用界面和导航条的显示效果来减少状态栏导航条等系统界面的突兀感,从而使用户获得最佳的UI体验。 2.窗口全屏布局方案介绍 调整布局系统为全屏布局,界面元素延伸到状态栏和导航条区域实现沉…

【HarmonyOS】鸿蒙系统在租房项目中的项目实战(一)

从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是…

基于STM32的智能语音识别饮水机系统设计

功能描述 1、给饮水机设定称呼,喊出称呼,饮水机回答:我在 2、语音进行加热功能,说:请加热,加热片运行 3、饮水机水位检测,低于阈值播报“水量少,请换水” 4、检测饮水机水温&#xf…

Java 使用MyBatis-Plus数据操作关键字冲突报错You have an error in your SQL syntax问题

问题 这个报错是出现在Java Spring boot项目中,使用MyBatis-Plus通过创建的实体类对数据库的操作过程中,通过实体创建数据库表是没有问题的,而在接口调用服务类操作数据库的时候,会出现报错。报错详情如下: 服务请求异…

高效工具推荐:基于WebGPU的Whisper Web结合内网穿透远程使用指南

文章目录 前言1.本地部署Whisper Web1.1 安装git1.2 安装Node.js1.3 运行项目 2. Whisper Web使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 公网访问测试6. 配置固定公网地址 前言 OpenAI开源的 Whisper 语音转文本模型效果都说还不错,今天就给大家推荐 GitHub…

力扣-Mysql-3322- 英超积分榜排名 III(中等)

一、题目来源 3322. 英超积分榜排名 III - 力扣(LeetCode) 二、数据表结构 表:SeasonStats --------------------------- | Column Name | Type | --------------------------- | season_id | int | | team_id …

20241116解决在WIN11和ubuntu20.04通过samba共享时出现局域网千兆带宽拉满的情况

20241116解决在WIN11和ubuntu20.04通过samba共享时出现局域网千兆带宽拉满的情况 2024/11/16 13:42 缘起:最近需要通过iperf3打流,因此在ubuntu20.04服务器上常开sudo nethogs监控流量。 但是发现一个异常,ubuntu20.04服务器上发送的流量过大…

Stable Diffusion最全提示词写法教程

基础书写规则 所有单词都是通过英文书写,单词之间通过, 分割,注意是英文逗号;提示词之间是可以已通过换行书写的,并不会有什么影响;单个提示词的权重是1 , 默认情况下,越往前,权重越大&#xf…