我们如何以RESTful方式实现资源"编辑"表单?
我们正在尝试为现有的应用程序实现REST API。我们希望使用REST API公开各种资源的读/写功能。我们如何实现其中的"形式"部分?通过创建本质上用作方法调用的RESTful URL并返回数据,我了解了如何公开数据的"读取":
GET /restapi/myobject?param=object-id-maybe
...然后返回表示某些数据结构的XML文档。美好的。
但是,通常,在Web应用程序中,"编辑"将涉及两个请求:一个是加载资源的当前版本并用该数据填充表单,另一个是将修改后的数据发布回去。
但是我不知道如何使用REST映射到的HTTP方法执行相同的操作。是PUT,对不对?有人可以解释吗?
(其他注意事项:用户界面将主要使用AJAX完成)
--
更新:绝对有帮助。但是,我对服务器端还是有些困惑?显然,我不是在这里简单地处理文件。在服务器上,回答请求的代码应过滤请求方法以确定如何处理它?那是读写之间的"切换"吗?
解决方案
回答
负载应该只是普通的GET请求,而新数据的保存应该是对当前拥有数据的URL的POST。
例如,从http://www.example.com/record/matt-s-example加载当前数据,然后更改数据,然后用新数据POST回至相同的URL。
创建新记录时可以使用PUT请求(即,将数据放置在当前不存在的URL上),但实际上,仅POST可能是一种更好的入门方法。
回答
如果要通过纯HTML提交数据,则只能进行基于POST的表单。发送POST请求的URI不应是要修改的资源的URI。我们应该开机自检到每次都会添加一个新创建的资源的集合资源(位置标头中包含新资源的URI和202状态码),或者开机自检到更新程序资源,该更新程序将使用请求的内容(或者自定义标头)。
如果使用的是XmlHttpRequest对象,则可以将方法设置为PUT并将数据提交到资源的URI。如果服务器为尚不存在的资源提供有效的URI,则这也适用于空表格。第一PUT将创建资源(返回202)。如果相同的数据,后续的PUT将不执行任何操作,或者修改现有资源(在任何一种情况下,除非出现错误,否则返回200)。
回答
我认为我们需要将数据服务与Web UI分开。提供数据服务时,RESTful系统是完全合适的,包括使用浏览器不支持的动词(例如PUT和DELETE)。
在描述UI时,我认为大多数人会将" RESTful"与"漂亮的,可预测的URL"混为一谈。当我们描述Web UI时,我不会担心纯粹的RESTful URL语法。
回答
我们可以使用多种替代方法。微格式Wiki提供了一个很好的解决方案,并且RESTful JSON工作人员也已引用了该解决方案。确实,我们可以尽一切可能达到标准。
Operate on a Record GET /people/1 return the first record DELETE /people/1 destroy the first record POST /people/1?_method=DELETE alias for DELETE, to compensate for browser limitations GET /people/1/edit return a form to edit the first record PUT /people/1 submit fields for updating the first record POST /people/1?_method=PUT alias for PUT, to compensate for browser limitations