REST子实体

时间:2014-02-26 02:00:18

标签: node.js rest routing restful-url

用于更新子实体的正确的RESTful URL结构是什么?

例如,我有一个Question实体。一个问题可以有很多答案。答案不仅仅是一个字符串,它们还有一个用户,pubDate等。

创建Question实体的URL如下:

/questions/create

创建特定问题答案的正确格式是什么?也许是这样的:

/questions/{questionId}/answers/create

或者他们应该有自己的专用路线,例如:

/answers/create?questionId={questionId}

感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:1)

与普遍看法相反,REST并不是关于URL结构。实际上,应该只有一个“人类可读”的URL,其余的都是由HATEOAS发现的。

此外,不应该有任何“用于创建问题的URL”。应该有一个(或许多)问题容器,当你在那里POST时,会创建新的实体。同样,一旦你有了问题URL(在创建时返回,客户端不应该知道它具有什么'结构'),你在那里做新的POST来创建答案。

在您的示例中,一旦您执行了任何所需的身份验证,对“root”URL的GET可以返回包含所有所需容器的“main”资源:

GET /api/
=> { "questions":"/api/questions/", .... }

GET /api/questions/
=> [{"name":"firstone", "href":"/api/questions/11"}, 
    {"name":"final", "href":"/api/questions/43"}]

GET /api/questions/101
=> {
    "name":"firstone", 
    "href":"/api/questions/11", 
    "text":"2+2", 
    "answers":[
        {"key":"A", "text":"23", "href":"/api/answers/15"},
        {"key":"B", "text":"3", "href":"/api/answers/34"},
        {"key":"C", "text":"4", "href":"/api/answers/7"}
    ]
}

添加新问题:

POST /api/questions/   {"name":"onemore", "text":"2^2"}
=> 201 Location: /api/questions/45   
data: {"name":"onemore", "text":"2^2", "href":"/api/questions/45"}

GET /api/questions/45
=> {"name":"onemore", "text":"2^2", "href":"/api/questions/45"}

添加答案:

POST /api/questions/45    {"key":"A", "text":"4.5"}
=> 201 Location: /api/answers/56
data: {"key":"A", "text":"4.5", "href":"/api/answers/56", "question":"/api/questions/45"}

修改答案的文字:

PUT /api/answers/56   {"key":"A", "text":"4.8"}
=> 200
data: {"key":"A", "text":"4.5", "href":"/api/answers/56", "question":"/api/questions/45"}

当然,这有很多变化,尤其是当您获取容器时返回的“深度”信息量。在此示例中,当您获得问题时,会有一个答案列表。在一个极端情况下,它可能只是一个URL列表,客户端必须获取每个URL,另一方面它可能是每个URL的整个数据,因此您可以通过单个请求获得所需的一切。

通常,您必须为每个容器选择一个余额,可能会有一些“基本”字段从第一个请求中获得好处,而其他字段可能会延迟。