用于更新子实体的正确的RESTful URL结构是什么?
例如,我有一个Question实体。一个问题可以有很多答案。答案不仅仅是一个字符串,它们还有一个用户,pubDate等。
创建Question实体的URL如下:
/questions/create
创建特定问题答案的正确格式是什么?也许是这样的:
/questions/{questionId}/answers/create
或者他们应该有自己的专用路线,例如:
/answers/create?questionId={questionId}
感谢您提供任何帮助!
答案 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的整个数据,因此您可以通过单个请求获得所需的一切。
通常,您必须为每个容器选择一个余额,可能会有一些“基本”字段从第一个请求中获得好处,而其他字段可能会延迟。