如何设计开发好一个 HTTP API?
在过去的几年里,我使用着各式各样的HTTP API。这些API通常不是公开的,只是提供给合作伙伴公司。此外,我也看了很多开发者提供的API,自己也参与了几个API的开发。这些API经常有设计缺陷,使得API的可靠性与可集成性变得有点困难。
我想说常出的问题主要是重复创建资源。资源创建必须与关键的实际操作(如付款)绑定在一块。
让我们以Paypal的Create Payment API为例:
当我们创建一个新的付款资源。(我们向/v1/payments/payment发出POST请求),Paypal则立即向用户收费。如果交易成功,则返回状态码201以及补充Id。这意味着,如果在发送请求时遇到网络问题中断,会拿不到付款Id,因此也无法轻易判断付款是否成功。更糟糕的,如果我们有一个发现网络错误的自动重试机制,这会向用户发生二次收费。
当然,这是API的一个已存在的问题,Paypal提供了一个解决方案。我们可以使用PayPal-Request-Id或者使用误写发票号码来取消重复的请求。
但是解决方案真的需要这么复杂么?这两种方式都不是用户友好的:消费者需要有一个可靠的机制来生成相同的请求Id,在第二种情况下,如果你有多张发票的付款,该怎么办?可能还是需要一个更优雅的解决方案。
用POST/PUT 来解决重复资源的创建
如果POST请求数据库记录和资源ID生成以外,就可以轻松地避免这个问题。流程如下图:
POST/PUT的资源创建
有了这个流程,在发生网络故障时很容易重试请求。比如重试POST请求,则只会导致重复的空资源,如果你重试PUT请求,你也是安全的,因为PUT请求是幂等的。
所以我发现,POST/PUT 创建模式更优雅,尽管它需要两次请求才能完全创建一个资源。 你可以并不喜欢这种方法。但是我的观点是,POST 需要支持大规模请求,以适合真实场景。如果你没有提供这样的机制,那么你的API将是不稳定的或不可靠的开发环境。
感谢阅读,希望对大家有帮助。
作者:Alex Rudenko
编译:21CTO社区
地址:https://dev.to/orkon/making-better-http-apis-72l
- Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成
- RePractise前端篇: 前端演进史
- 性能优化总结(三):聚合SQL在GIX4中的应用
- ASP.NET AJAX 控件开发基础
- 听我说说我的博客: 月访问量过万的个人IT博客的技术史
- TransactionScope和Enterprise Libray 3.0 Data Access Application Block
- 《Python Web开发 - 测试驱动方法》阅后感
- 微信小程序分享——会话服务器和业务服务器合并
- 微信官方开源UI库-WeUI
- ViewFlipper实现多页面切换
- Ubuntu & Fedora Mono 2.8 安装脚本
- android下拉加载更多
- 在 Windows 上安装Rabbit MQ 指南
- CentOS 7 安装RabbitMQ 3.3
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 面试官:谈一谈java中基于AQS的并发锁原理
- kubernete编排技术三:StatefulSet
- Qt网络聊天室客户端
- 聊聊java中的StampedLock并发锁原理
- tomcat对AQS的扩展:使用LimitLatch控制连接数
- kubernete编排技术五:DaemonSet
- 深度剖析github上15.1k Star项目:redux-thunk
- 在不影响程序使用的情况下添加shellcode
- [K8s 1.9实践]Kubeadm 1.9 HA 高可用 集群 本地离线镜像部署
- ansible模块command、shell、raw、script
- systemd - CentOS 7进程守护&监控
- Java 8的新特性还不了解?快进来!
- 【Vulnhub】Play XML Entities
- 一切皆是映射:詳解 Kotlin Map 集合類
- 10大高性能开发宝石,我要消灭一半程序员!