小部件检查的RESTful URL设计

时间:2012-11-02 06:11:55

标签: asp.net-mvc rest widget asp.net-mvc-routing

我正在为一个网站构建一个RESTful API,允许用户创建包含小部件的小部件和标签(想想igoogle.com/netvibes.com),我想分享我的网址设计以获取您的见解。

以下是简单的规则:

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

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

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

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

    API需要提供服务:

    1. 用户标签的CRUD

    2. 特定用户widgetInstances的CRUD

    3. 检索用户的所有标签

    4. 检索给定选项卡的所有widgetInstances。

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

    6. 设计

      标签控制器:

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

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

      widgetAPI.com/tabs/1/widgets>返回tab id 1的所有widgetInstances。

      问题1:理想情况下,我想按照widgetAPI.com/tabs/1的设计同样返回给定标签的所有widgetInstances,但是使用该设计,widgetAPI.com / tarbs可能会返回太多数据,因为我必须返回所有选项卡的所有小部件。因此,我需要创建一个单独的“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 因此,我还没有能够实现一条规则。我需要返回所有可用的widgetType,我不知道如何将此请求放入前两个控制器。我目前倾向于单独服务。像widgetAPI.com/getWidgetTypes这样的东西。想法?

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

1 个答案:

答案 0 :(得分: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参数。

要创建新窗口小部件,请向widgetAPI.com/widgets发送POST。 typeId应该是POST请求体的一部分。

  

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

要删除窗口小部件123,请向widgetAPI.com/widgets/123

发送DELETE请求

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

回答2:我认为您应该使用单独的控制器执行此操作。我不喜欢这个URL。相反,我喜欢HTTP GET widgetAPI.com/widget-types或仅widgetAPI.com/widgettypes

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

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

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

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