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设计中常见的问题和解决方案的主要内容,如果未能解决你的问题,请参考以下文章

基于 RBAC 模型的 RESTful API 设计

如何更好的设计RESTful API

开放接口/RESTful/Api服务的设计和安全方案

如何设计好的RESTful API之安全性

springboot的服务端Restful风格 API接口,在不同场景下,设置不同的请求及传参方式的设计,及其他异常场景解决方案

RESTful API的设计原则