如果通过rest api发布资源,是不是必须存储资源?

Posted

技术标签:

【中文标题】如果通过rest api发布资源,是不是必须存储资源?【英文标题】:Do you have to store resource if you publish it via rest api?如果通过rest api发布资源,是否必须存储资源? 【发布时间】:2021-02-25 19:18:03 【问题描述】:

假设我有一个带有以下端点的 rest api:/foos/fooId,它返回一些名为 foo 类型的对象。现在假设我在下面的数据库中存储了不同类型的资源,即栏。示例栏有一些 barId,我通过 api (foo) 可用的资源是一个栏的投影加上其他一些东西。这种设计有意义吗?如果我不存储名为 foo 的资源并且没有 fooId 之类的东西(只是 bar 的投影),我的 api 是否仍然安静?

【问题讨论】:

【参考方案1】:

如果 API 遵循 REST 的设计原则,它就是 RESTful,特别是如果它是 level 3 API。

重要的是客户看到的视图。状态如何存储是一个实现细节,它对 HTTP API 是否为 RESTful 没有直接影响。客户端看不到您的数据库。

您可以设想一个没有底层数据存储的 REST API;例如,它可以为您提供一天中的日期和时间。只要符合 REST 规则,它仍然是 RESTful。

了解 RESTful 设计的好资源是 RESTful Web Services Cookbook 和 REST in Practice。

【讨论】:

+1 -- 直接存储资源是有原因的,也有这样做的原因 -- 例如在客户的要求。【参考方案2】:

如果我不存储名为 foo 的资源并且没有 fooId 之类的东西(只是 bar 的投影),我的 api 是否仍然安静?

REST 或 HTTP 中没有任何东西会限制您的存储实现。

如果生成资源表示需要七个数据库、两个时钟、一个外部摄像头和一杯热伯爵茶,那很好。 “规则”,例如它们,都是关于消息的含义,而不是你如何产生它们。

您可以对资源标识符使用任何您想要的拼写约定。人们通常会选择一种对某些人来说更容易的设计(例如,操作员在 HTTP 访问日志中查看 URI)。

如果您的资源标识符将是 long lived(特别是,如果它比任何特定实现都更有效),那么您可能希望选择与资源语义更接近的拼写而不是拼写与您当前的存储高度一致。

【讨论】:

以上是关于如果通过rest api发布资源,是不是必须存储资源?的主要内容,如果未能解决你的问题,请参考以下文章

自然键和 RESTful URL

用于创建资源的 REST API 补丁方法

通过 Rest API 调用存储过程字符串返回空而不是有效字符串

REST API:在单个查询中创建嵌套资源

在 Laravel 5.2 中通过 RESTful 资源控制器使用 jQuery Ajax Post 方法将数据存储在数据库中

REST API 资源是不是应该根据查询参数进行授权?