我喜欢RESTful的简单性以及它如何避免像SOAP这样的普通"企业"系统,或DCOM和RPC的二进制硬度.
但REST似乎比更抽象的服务更适合数据库实体.我想知道你是否可以告诉我你如何做这些情况:
例如,假设我有一个用于普通数据库系统的RESTful Web服务(例如,乳品购物网站),所以我有/ products/eggs/battery和/ products/milk/skimmed
通过对/ products/eggs进行POST来实现INSERT.
但你怎么做一个"清除所有"命令?DELETE动词仅适用于单个实体.而"DELETE/products/milk"意味着删除"牛奶"产品类别本身,而不仅仅是牛奶类别中的所有产品.如果你想完成两件事怎么办?
我遇到的另一个问题涉及与实体无关的Web服务操作.例如,如果我正在为密码数据库设计一个Web服务,我会有"GET /passwords/stackoverflow.com"之类的操作,这很好,但我也有操作在入侵的情况下禁用该网站检测.在"旧学校"网络服务模式下,我有一个名为"disableWebsite"的方法,但是我不能创建一个名为"DISABLE"的HTTP动词和一个名为"/ website"的资源(所以请求将是" DISABLE /网站").这里有什么解决方案?
最后,如何将HTML表单与RESTful协调?Web表单只能使用查询字符串或POST进行GET请求.如果我有搜索表单,我希望它请求"/ products/search/{query}",但现在请求看起来像"/ products/search?query = {query}".
小智 5
我认为你应该停止将资源视为数据库实体的同义词.是的,它们通常是相关的,但资源实际上只是您域中的可寻址概念.我认为将资源视为您在使用浏览器时在网络上看到的内容(列表,项目,帖子,评论,图像等等)会更有用.
但你怎么做一个"清除所有"命令?
我不确定为什么DELETE/products/milk意味着删除了牛奶类别本身,但如果你宁愿:
DELETE /products?category=milk
Run Code Online (Sandbox Code Playgroud)
DELETE并不意味着删除单个数据库实体.它意味着删除单个资源.并且"/ products?category = milk"(或"/ products/milk",就此而言)标识单个资源.如果你可以获得它,你可以删除它.
如果你想完成两件事怎么办?
这个怎么样?
DELETE /product-categories/milk
Run Code Online (Sandbox Code Playgroud)
Ruby on Rails中流行的一个技巧是为任何PUT/POST/DELETE操作提供一个表单(使用GET).因此,对于这些删除,您可能希望提供如下表单:
GET /product-categories/milk/delete
Run Code Online (Sandbox Code Playgroud)
在那种形式(想想HTML)中,您可以询问您的用户是否真的可以删除整个类别.(请不要注意HTML表单与RESTful Web服务并不真正兼容的概念.HTML非常漂亮用于与网络资源交互的成功格式,以及精心设计的AJAX应用程序可能首先作为精心设计的HTML应用程序工作.有一些细节需要解决以支持浏览器和其他客户端,但他们'重新所有合法的REST客户端.)
如何禁用网站?
有很多方法可以做到这一点.只需对带有禁用标志的/sites/stackoverflow.com进行PUT即可.
最后,如何将HTML表单与RESTful协调?
您无法从浏览器中真正执行HTTP PUT或DELETE,但您可以在表单中提供隐藏字段以伪造它:
<input type="hidden" name="_method" value="PUT" />
Run Code Online (Sandbox Code Playgroud)
只要您的路由引擎支持它,这是将浏览器帖子路由到适当的处理程序的好方法(我也看到人们在没有完全支持HTTP的情况下为非HTML客户端使用X-HTTP-Method-Override标头动词).
如果您对挖掘感兴趣,我推荐Web Services Cookbook作为入门者.另外,看看Richardson成熟度模型.请记住,REST就像网络的其他部分一样.没有这些链接就不会有用.为您的客户提供一种出行方式.
<a href="/products/milk/delete" rel="delete" />
<atom:link href="/products/milk/delete" rel="delete" />
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2326 次 |
最近记录: |