构造此RESTURI的正确方法?
我希望有一个用于Foo的REST资源,并且我希望能够执行一个POST来创建一个新的Foo Foos只能有两个子类型:Fizz和Buzz(后端的模型是FooFizz和foobzz,并且都扩展了Foo)。所有的食物要么是汽水,要么是嗡嗡声。大多数其他型号也遵循这种模式(带有Fizz和Buzz的子类型)。就短期和中期而言,不会有新的类型添加到Foos中。从长远来看,在添加新类型之前,此应用程序很可能会过时,但这种可能性是存在的 无论如何,下面是我为使用Foos而提出的一些URI方案构造此RESTURI的正确方法?,rest,Rest,我希望有一个用于Foo的REST资源,并且我希望能够执行一个POST来创建一个新的Foo Foos只能有两个子类型:Fizz和Buzz(后端的模型是FooFizz和foobzz,并且都扩展了Foo)。所有的食物要么是汽水,要么是嗡嗡声。大多数其他型号也遵循这种模式(带有Fizz和Buzz的子类型)。就短期和中期而言,不会有新的类型添加到Foos中。从长远来看,在添加新类型之前,此应用程序很可能会过时,但这种可能性是存在的 无论如何,下面是我为使用Foos而提出的一些URI方案 POST/foo?
(5) 这似乎是一个不错的方案,尽管它可能会弄乱URI树。不可否认,我不是REST专家,但这是我的两分钱 你为什么要发帖子到foo/{foo id}?在这种情况下,这将更像是一次更新。您需要发布的唯一时间是,如果id是自动创建的,并且在实际创建之前未知。因此,在这种情况下,我倾向于1,因为您正在创建一个foo,其余的只是创建foo所需的信息。在这之后,您是否需要关心子类型(嘶嘶声或嗡嗡声)?我假设foo/{foo id}将是足够的信息来单独处理它并从中确定类型 因此:
如果你真的在做一个RESTful架构,那么你不需要问这个问题
RESTful体系结构在表示中包含指向应用程序流的链接。如果要创建的新资源是父资源的子资源,则父资源的表示应该有一个嵌入式链接,告诉您要使用哪个URL和(可能)哪个动词。比如:
<link rel="add-child" method="POST" href="http://foo/1234">Add a new child</link>
添加新子级
如果您正在创建一个全新的根资源,那么您可能希望发布到一个绝对URL,并让响应文档或位置
标题告诉您的应用程序从何处检索新的表示。目标资源本质上是进入应用程序状态机的“入口点”。我很想只发布到/foo
,要创建的foo类型(fizz或buzz)由发布文档的内容决定。它将以一个合适的重定向来响应新创建的foo(/foo/{fooId}
)的URI,您可以通过它以正常的方式操作事物。子类型很重要,因为每个子类型都有不同的构造函数,并且需要不同的事物才能创建。我同意你的观点,像(5)这样的帖子是相当愚蠢的。是的,我想到了把它发送到创建数据中,但我又一次认为这会变得混乱,因为嘶嘶声和嗡嗡声需要不同的参数。为什么不有一个工厂方法来处理不同类型的创建呢?所以你是说URI模式不重要,因为你的父资源无论如何都在命令它的子URI?它仍然需要在后端进行良好的组织。如果它是公共API呢?公共API只是入口端点。所有其他URL都包含在资源表示中(例如,XML元素、JSON文档等),因此只有生成器(服务器)知道它们。API用户不应生成初始入口点以外的URL。哦。。。我并不反对在服务器上使用URL模式来生成URL。这大概是保持事物可伸缩性的唯一明智方法。约束条件是API的用户不使用URL模板或其他什么来构造URL。我认为你是对的。也许我太依赖URI来传输信息了,我不喜欢把查询参数和帖子混在一起。每当我看到这一点,我都怀疑这是一个错误的设计。:–)