Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
构造此RESTURI的正确方法?_Rest - Fatal编程技术网

构造此RESTURI的正确方法?

构造此RESTURI的正确方法?,rest,Rest,我希望有一个用于Foo的REST资源,并且我希望能够执行一个POST来创建一个新的Foo Foos只能有两个子类型:Fizz和Buzz(后端的模型是FooFizz和foobzz,并且都扩展了Foo)。所有的食物要么是汽水,要么是嗡嗡声。大多数其他型号也遵循这种模式(带有Fizz和Buzz的子类型)。就短期和中期而言,不会有新的类型添加到Foos中。从长远来看,在添加新类型之前,此应用程序很可能会过时,但这种可能性是存在的 无论如何,下面是我为使用Foos而提出的一些URI方案 POST/foo?

我希望有一个用于Foo的REST资源,并且我希望能够执行一个POST来创建一个新的Foo

Foos只能有两个子类型:Fizz和Buzz(后端的模型是FooFizz和foobzz,并且都扩展了Foo)。所有的食物要么是汽水,要么是嗡嗡声。大多数其他型号也遵循这种模式(带有Fizz和Buzz的子类型)。就短期和中期而言,不会有新的类型添加到Foos中。从长远来看,在添加新类型之前,此应用程序很可能会过时,但这种可能性是存在的

无论如何,下面是我为使用Foos而提出的一些URI方案

  • POST/foo?类型=起泡

  • POST/foo/fizz

  • POST/fizz/foo

  • POST/foo嘶嘶作响

  • POST/foo/{foo id}/fizz

  • 我的想法是:

    (1) 可能是不必要的客户机-服务器耦合,因为它依赖于正确形成的查询字符串。但这对我来说最有意义

    (2) 和(3)是不受欢迎的,因为您希望能够使用URI go/foo/{foo id}对单个foo执行操作

    (4) 需要嘶嘶声和嗡嗡声才能成为URI树的完全独立的分支


    (5) 这似乎是一个不错的方案,尽管它可能会弄乱URI树。

    不可否认,我不是REST专家,但这是我的两分钱

    你为什么要发帖子到foo/{foo id}?在这种情况下,这将更像是一次更新。您需要发布的唯一时间是,如果id是自动创建的,并且在实际创建之前未知。因此,在这种情况下,我倾向于1,因为您正在创建一个foo,其余的只是创建foo所需的信息。在这之后,您是否需要关心子类型(嘶嘶声或嗡嗡声)?我假设foo/{foo id}将是足够的信息来单独处理它并从中确定类型

    因此:

  • POST/foo?类型=起泡 **您甚至可以删除查询字符串并将其作为创建数据发送进来,但这取决于您自己
  • 获取/foo/{foo id}…检索创建的foo
  • 放置/foo/{foo id}…更新创建的foo
  • 删除/foo/{foo id}…删除创建的foo
  • 至少我会这么做。

    如果你真的在做一个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来传输信息了,我不喜欢把查询参数和帖子混在一起。每当我看到这一点,我都怀疑这是一个错误的设计。:–)