RESTful API设计中常见的问题和解决方案
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RESTful API设计中常见的问题和解决方案相关的知识,希望对你有一定的参考价值。
参考技术A 在开发HTTP API的时候,我们一般会按照REST风格来设计,符合REST风格的API也称为RESTful API。RESTful API的主要规则包括以下几点:
标准的RESTful API示例如下:
由于英语语法的特点和HTTP请求的方法数量的有限,可能存在一些无法覆盖到的部分,如下:
下面来谈谈上述未覆盖部分及其解决方案。
常规动作有GET,POST,PUT,PATCH和DELETE,也就是所谓的增删改查,但是现实中还有很多非前面提到的动作,如取消操作。
针对非常规动作,解决的方案有两种:
下面我们以取消订单为例,来看看针对该问题不同方案的实现。
该方案是GitHub在使用中的方案,在开放的API的可以看到。
针对实例的实现如下:
这个Google Could中Could API设计规范中定义的方案,语法为:
针对实例的实现如下:
该情况可按照英语语法使用对应的名词即可,如下:
使用可数名词来代替,如news可以用news-items来代替。
这种情况可以采用资源对应的名词的单数形式来表示获取一条数据, 该方案也适用于多对一的情况。
例如:用户的购物车数据,每个用户有一个购物车,可以表示如下:
RESTful API 设计:内部交互
【中文标题】RESTful API 设计:内部交互【英文标题】:RESTful API design: inner interaction 【发布时间】:2013-10-15 17:20:15 【问题描述】:简单的问题。我阅读了一堆关于 API 设计的文章,但没有找到答案。
API 的端点应该如何相互交互?
例如,如果我有 2 个端点:/category/:name
和 /messages
。例如,从消息中检查类别存在的最佳方法是什么?
1) 来自/messages
处理程序的数据库查询,例如:SELECT * FROM categories WHERE name = 'test'?
或
2) 从/messages
处理程序到该端点的 HTTP 请求,例如:httpclient.get('/category/test') ?
或
3) 客户端应该获取所有类别,获取特定类别的 ID 并使用该类别 ID 向/messages
发送请求?
【问题讨论】:
【参考方案1】:您应该以所有端点都调用内部 API 来执行任务的方式设计您的应用程序。当您想在另一个内部调用一个操作时,您应该使用相应的内部 API,而不是任何其他方法,例如调用 http 服务。
【讨论】:
【参考方案2】:问题很简单,但没有答案。有一件事是肯定的,永远不要使用(2)解决方案。当您可以调用方法时使用 http 客户端请求一些数据会降低 API 的性能和容量。
如果需要检查特定类别的存在以在 /messages
中创建响应,则使用 (1) 但不是调用 SQL 查询,而是调用与处理对 /category/test
的请求相同的方法,只需在本地调用它,而不是通过 HTTP .
当每个端点只负责一种类型的资源时,解决方案 (3) 是 REST 方式。缺点是它可能需要从客户端到 API 的更多 HTTP 请求。
【讨论】:
以上是关于RESTful API设计中常见的问题和解决方案的主要内容,如果未能解决你的问题,请参考以下文章
springboot的服务端Restful风格 API接口,在不同场景下,设置不同的请求及传参方式的设计,及其他异常场景解决方案