REST API 设计:请求特定参数

Posted

技术标签:

【中文标题】REST API 设计:请求特定参数【英文标题】:REST API design: request specific parameters 【发布时间】:2015-09-02 13:20:25 【问题描述】:

我们有一个 CORS REST API。它很干净。有用。这几乎是完美的。但是……

我正在尝试使用特定于请求的参数来实现端点。此端点应接受 POST、PUT、LINK 和 DELETE 请求。而且我不确定如何实现这些参数。

一个例子: 用户想要删除模型。有两种情况:一种是模型被删除,没有其他任何事情发生,另一种是模型被删除+发送通知电子邮件。

最初我在一个名为“X-NOTIFY-OWNER”的头文件中实现了这个参数。这很有效,因为它可以添加到 4 个动作中的任何一个中。但是现在我们想去掉那个标头,因为它对于这个单一的端点来说太具体了。

放置此参数的最佳位置是什么?查询参数听起来最干净(因为 DELETE 和 LINK 在技术上不需要正文),但查询参数应该用于过滤内容。请求正文中的参数也可以工作,并且似乎是首选方法;但这意味着发送带有 DELETE 和 LINK 操作的正文...

对这种情况下的最佳实践有什么想法吗?

【问题讨论】:

X-NOTIFY-OWNER 是请求头还是响应头? 这是一个请求头 说实话,我还是最喜欢header解决方案的。该参数特定于请求。有谁知道做类似事情的其他 api 的任何例子? 如果你还喜欢它,为什么要改变呢?您说查询字符串参数用于内容过滤,因此请继续使用它进行内容过滤。使用 X- 标头对我来说似乎又好又干净,我怀疑你能得到比这更有意义或更容易的任何东西。 IMO,使用自定义标头通知应用程序需要执行的额外任务是有意义的。 【参考方案1】:

我会坚持使用查询字符串,DELETE 应该忽略正文并仅读取 URL,因此在这里使用查询字符串是有意义的。

【讨论】:

【参考方案2】:

您应该使用 URL 参数。正如您所说,它们应该用于过滤输出,并且可以将电子邮件视为输出。

【讨论】:

【参考方案3】:

我建议为最干净的解决方案设置一个新端点。

example.com/endpoint

example.com/endpointAndNotify

你可以:

    设置通知端点以扩展基本端点,然后将通知逻辑添加到通知操作。

    从两个动作中抽象出共享逻辑,更新每个动作以扩展基类,然后在通知动作中添加具体的通知逻辑

这样两个端点都保持简洁明了,如果您为此端点定义一个标准,任何其他需要通知逻辑的端点都可以使用相同的标准。

【讨论】:

我们的端点是模型名称(名词);这样就变成了:DELETE /meetings/id 和 DELETE /meetingsWithNotify/id。看起来不是一个干净的解决方案。

以上是关于REST API 设计:请求特定参数的主要内容,如果未能解决你的问题,请参考以下文章

Github 糟糕的 REST API 设计

在 Rest API 中批量更新

REST API 设计 - 使用请求正文删除多个项目

rest 接口设计和参数接收

Django REST framework框架之GET, POST, PUT, PATCH, DELETE等API请求接口设计

笔记:Jersey REST API 设计