我正在努力坚持两者 JSON和HTML的Restful设计模式。我的问题是创建新资源的设计(其中包括,但这是问题的要点)。 IE:
JSON – POST to /resource creates a new resource.
JSON – GET to /resource returns a list of resources.
JSON – GET to /resource/{id} returns a resource.
HTML – POST to /resource creates a new resource.
HTML – GET to /resource returns a list of resources.
HTML – GET to /resource/{id} returns a resource.
到目前为止一切都很好 - 但是我需要一个HTML表单来实际创建要发送到HTML POST的数据。显然POST和GET已经做了。我可以使用以下其中一个来返回HTML表单:
HTML – GET to /resource?CREATE
HTML - GET to /resource?action=CREATE
HTML – GET to /resources/CREATE
但它们看起来像一个kludge而不是那么直观。 有什么想法或想法吗?
编辑 - 请参阅下面我的问题的答案。目前这是(我认为)最好的选择。
答案 0 :(得分:1)
我确实会使用像/resources/create
这样的东西。如果您想允许非数字标识符,那么这将不起作用。在这种情况下,您可以识别带有前缀的资源,例如/resources/resource-{id}
,然后您仍然可以使用/resources/create
。
我发现这篇博文非常有助于做出URI方案决策:http://blog.2partsmagic.com/restful-uri-design/
答案 1 :(得分:0)
事实上,当您想在RESTful服务中处理多种格式时,您应该利用内容协商(CONNEG)。
我的意思是:
Content-Type
标头以指定已发送数据的类型Accept
标头以指定您要接收的数据类型服务器资源应利用这些提示进行适当的数据转换。
对于JSON,内容类型显然是application/json
。对于HTML表单,您应该利用内容类型application/x-www-form-urlencoded
(或multipart/form-data
,如果您还要上传文件)。有关详细信息,请参阅the specification。
否则,您不应该在URL中使用操作,因为它不是真正的RESTful。 HTTP谓词应确定要对资源执行的操作。我的意思是,要创建资源,应该使用POST
方法。 GET
方法旨在检索资源的状态。
有关详细信息,您可以查看此博客文章:
答案 2 :(得分:0)
我有一个答案。我将从HTML页面使用标准RESTful POST,但是当我没有发送表单参数且我的接受标题是text / html时,我将向请求者发送HTML表单。保持RESTful URI设计并允许干净的HTML表单+流程(2步)。
HTML - POST - /resources (with no form attributes) generates a HTML form
HTML - POST - /resources (with form attributes) adds a resource
JSON - POST - /resources (with form attributes) adds a resource
好的,它不是"严格来说" RESTful,因为我正在发布但没有创建新资源所以理论上我应该使用GET,但它是设计不匹配的最佳选择。
如果有人能提供更好的解决方案,我仍然全力以赴: - )
答案 3 :(得分:0)
我宁愿添加名为/templates/
的端点和端点,它返回模板/表单/给定操作所需的任何内容。似乎服务器应该不知道这种形式存在。它可以接受或拒绝请求及其客户工作,以适当的格式提交请求。
我猜你混合处理视图和准备RESTful端点。后端站点应完全不知道需要某种视图/表单的事实。准备这样的表格是客户的工作。