0

我正在为一个网站构建一个 RESTful API,它允许用户创建小部件和包含小部件的选项卡(想想 igoogle.com/netvibes.com),我想分享我的 URL 设计以供您参考。

以下是简单的规则:

  1. 有一个静态的 widgetTypes 列表供用户选择。

  2. 用户可以为每个 widgetType 创建一个或多个 widgetInstances。

  3. 用户可以创建一个或多个包含 widgetInstances 的选项卡/仪表板

此 API 只需提供将由 JavaScript 使用的 JSON。我们还可以假设所有身份验证都将通过 cookie 进行处理。

API 需要服务:

  1. 用户标签的 CRUD

  2. 特定用户小部件实例的 CRUD

  3. 检索用户的所有选项卡

  4. 检索给定选项卡的所有小部件实例。

  5. 检索所有可用的 widgetTypes 供用户从中添加小部件。

设计:

选项卡控制器:

widgetAPI.com/tabs -> 返回用户可用的所有选项卡的元数据(id、标题)。

widgetAPI.com/tabs/1 -> 返回标签 ID 1 的元数据(标题)。如果使用 POST 发送,则更新标签 ID 1。

widgetAPI.com/tabs/1/widgets > 返回标签 ID 为 1 的所有 widgetInstances。

问题1:理想情况下,我想遵循widgetAPI.com/tabs/1 的设计,也返回给定选项卡的所有widgetInstances,但是使用这种设计,widgetAPI.com/tabs 可能会返回太多数据,因为我必须这样做返回所有选项卡的所有小部件。因此,我需要创建一个单独的“widgetAPI.com/tabs/1/widgets”URL,但它还必须返回选项卡元数据,因为我不想进行两次 HTTP 调用来获取元数据和小部件。请告知,因为我不确定这里的最佳方法。

widgetAPI.com/tabs/create -> 创建一个新选项卡

widgetAPI.com/tabs/delete/123 -> 删除 tabid 123

小部件控制器:

widgetAPI.com/widgets/123 -> 返回 widgetInstanceId 123 的数据。如果通过 POST 发送,则更新 123。

widgetAPI.com/widgets/Create?typeID = 2 -> 创建一个 typeid = 2 的新 widgetInstance。这将只是一个 POST 请求,因此 typeId 可以是一个 post 参数。

widgetAPI.com/widgets/delete/123 -> 删除 widgetInstance 123

问题 2所以有一条规则我还没有完成。我需要返回所有可用的 widgetTypes,但我不确定如何将此请求放入前两个控制器中。我目前倾向于单独服务。所以像 widgetAPI.com/getWidgetTypes 这样的东西。想法?

多谢你们。如果您可以对整体设计进行评论,只需解决问题或提及我应该注意的任何事情,那就太好了,因为这是我第一次设计 RESTful 应用程序。再次感谢。

4

1 回答 1

2

widgetAPI.com/tabs/1 -> 返回标签 ID 1 的元数据(标题)。如果使用 POST 发送,则更新标签 ID 1。

对上述 URL 的 POST 不应更新选项卡 1。对该 URL 的 PUT 应更新选项卡 1。

widgetAPI.com/tabs/create -> 创建一个新选项卡

要创建一个新选项卡,您应该 POST 到 widgetAPI.com/tabs

widgetAPI.com/tabs/delete/123 -> 删除 tabid 123

要删除选项卡 123,请将 DELETE 发送到 widgetAPI.com/tabs/123

widgetAPI.com/widgets/123 -> 返回 widgetInstanceId 123 的数据。如果通过 POST 发送,则更新 123

要更新小部件 123,请将 PUT 发送到 widgetAPI.com/widgets/123

widgetAPI.com/widgets/Create?typeID = 2 -> 创建一个 typeid = 2 的新 widgetInstance。这将只是一个 POST 请求,因此 typeId 可以是一个 post 参数。

要创建新的小部件,请将 POST 发送到 widgetAPI.com/widgets。typeId 应该是 POST 请求正文的一部分。

widgetAPI.com/widgets/delete/123 -> 删除 widgetInstance 123

要删除小部件 123,请向 widgetAPI.com/widgets/123 发送 DELETE 请求

答案 1:我喜欢widgetAPI.com/tabs/1/widgetsURL 设计。此外,我喜欢对元数据和数据进行 2 次单独调用的想法。

答案 2:我认为您应该使用单独的控制器来执行此操作。我不喜欢这个网址。相反,我喜欢 HTTP GETwidgetAPI.com/widget-types或只是widgetAPI.com/widgettypes.

作为一般规则,除非您希望您的客户端能够创建 URL 标识符,否则请遵循以下模式:

URL:/whatever-resource GET - 返回此类型的所有资源 POST - 创建新资源

URL:/whatever-resource/{id} GET - 返回具有该 ID 的单个资源 PUT - 更新具有该 ID 的资源 DELETE - 删除具有该 ID 的资源

您还可以允许对 /whatever-resource/{id} 的 PUT 请求以创建资源,但客户端/用户必须指定 id(隐含的 URL,因为 URL 包含 id)。如果您不希望用户提供此资源,而是让服务器生成它,则 POST 到 /whatever-resource 以创建资源。

于 2012-11-02T12:54:40.370 回答