如何在RESTful网站中处理“弱”资源?

时间:2018-03-19 10:47:37

标签: rest

在RESTful网站中,每个资源都应该由URI标识。但是,我应该如何处理关系数据库中所谓的“弱实体”,也就是说,只有在与另一个资源相关时才有意义的资源?它们是否也有指向它们的特定URI?

举个例子:假设我有一个网站,用于显示城市中发生的事件。每个活动都可以有用户发布的评论。

event是一种资源,具有相应的URI(/events/:id)。 但是每个comment也应该有一个URI吗?像/events/:eventid/comments/:commentid一样?注释只有在与相应事件关联时才有意义,因此只有表示一条消息的页面似乎很奇怪/不必要。我只希望评论出现在活动的页面上。

我猜/events/:eventid/comments/:commentid URI可以用于DELETE请求,但它应该返回GET个请求?

3 个答案:

答案 0 :(得分:3)

  

event是一种资源,具有相应的URI(/events/:id)。   但是每个comment也应该有一个URI吗?喜欢/events/:eventid/comments/:commentid

如果comment资源,则它必须具有标识符,但并不意味着您必须支持此类资源的所有操作。如果目标资源不支持某种方法,服务器可以返回带有405状态代码的响应:

  

6.5.5. 405 Method Not Allowed

     

405(方法不允许)状态代码表示请求行中接收的方法由源服务器知道,但目标资源不支持。 [...]

  

我猜/events/:eventid/comments/:commentid URI可以用于DELETE请求,但它应该返回GET个请求?

返回具有给定标识符的注释的表示。

答案 1 :(得分:2)

  

在RESTful网站中,每个资源都应该由URI标识。但是我应该如何处理所谓的弱实体"在关系数据库中,也就是说,只有在与另一个资源相关时才有意义的资源?它们是否也有指向它们的特定URI?

这取决于。需要认识到的一件重要事情是资源和实体不是一对一。您可以拥有许多资源(网页),其中包含来自同一实体的信息。

Jim Webber用这种方式描述了这种区别

  

网络不是您的域名,它是一个文档管理系统。所有HTTP谓词都适用于文档管理域。 URI不会映射到域对象 - 这违反了封装。

Domain Driven Design for Restful Systems

  

我想/ events /:eventid / comments /:commentid URI可以用于DELETE请求,但它应该返回给GET请求呢?

Cassio所述,如果客户端错误地使用不受支持的方法发送请求,则405 Method Not Allowed是正确的状态代码。 OPTIONS是用于通知客户资源当前支持哪些方法的适当机制。

您也可以通过将客户端重定向到/events/:eventId资源来进行响应;利用URI Fragment support并将客户端重定向到/events/:eventid#:commentid甚至是有意义的 - 允许客户端使用自己的片段发现来识别事件表示中的特定注释。

或者,如果您希望支持有用的集成,则可以让此资源返回一个公开集成的表示。

答案 2 :(得分:0)

这实际上取决于客户端如何使用域名。应用程序是否希望获取事件的所有注释列表?用户是否可以更新他们的通讯?或者他们是匿名评论?

如果您打算只使用同一页面显示事件和评论的后端信息,那么您不需要单独的评论API。如果您想向应用程序供应商打开数据集(也许您可能希望将来开发应用程序),那么评论api会很方便。即获取活动的所有评论。