我正在为一个网站构建一个RESTful API,允许用户创建包含小部件的小部件和标签(想想igoogle.com/netvibes.com),我想分享我的网址设计以获取您的见解。
以下是简单的规则:
有一个widgetTypes的静态列表供用户选择。
用户可以创建每个widgetType的一个或多个widgetInstances。
用户可以创建一个或多个包含widgetInstances的标签/仪表板
此API只需提供JavaScript将使用的JSON。我们还可以假设所有身份验证都将通过cookie进行处理。
API需要提供服务:
用户标签的CRUD
特定用户widgetInstances的CRUD
检索用户的所有标签
检索给定选项卡的所有widgetInstances。
检索用户添加小部件的所有可用widgetTypes。
设计
标签控制器:
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应用程序。再次感谢。
答案 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以创建资源。