与实体不对应的RESTful动作/服务?

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

<atom:link href=\"/products/milk/delete\" rel=\"delete\" />
    
RESTful系统与“资源”交互,该“资源”与实体的标准概念不相关。 “资源”是一个非常模糊的概念,有一些严格的规则。我喜欢将资源视为任何有用的概念,它可以帮助客户执行他们需要做的事情。 因此,如果您需要删除一堆实体,则创建一个表示该“实体束”的资源,然后在其上使用DELETE方法。 设计静态系统的真正诀窍是停止尝试为特定资源分配重要性,而是为两个资源之间的关系分配重要性。考虑一下HTML是如何工作的。您下载一个页面,并且有一个样式表链接。 rel = \“ stylesheet \”定义您在href URL末尾找到的内容的含义。 如果要禁用网站,请访问网站资源并使用rel = \“ disabler \”链接中的URL。 RESTful设计是关于定义通过链接相互关联的资源。一些链接仅用于检索信息,而其他链接实际上用于更改资源状态。 资源必须遵循的严格规则是资源必须具有标识符(例如URL),并且您只能通过该资源的“表示”与该资源进行交互。这些表示形式可以采用多种不同的格式。 对于HTML表单,使用查询字符串参数和路径参数一样RESTful,就不用理会URI的样子。 HTML表单可让您执行GET和POST,即安全操作和不安全操作。这足以使任何人进行REST。当然,DELETE和PUT可能有用,但实际上,与超媒体之类的东西相比,那些额外的方法给RESTful系统带来的好处很小。     
           但是,您将如何执行“全部清除”命令? DELETE动词仅适用于单个实体。 假。   “删除/产品/牛奶”表示删除“牛奶”产品类别本身,而不是删除牛奶类别中的所有产品。 正确。   而且,如果您想同时实现这两者呢?
/cart/milk/
的DELETE有什么问题?   在“老派”网络服务模型下,我有一种方法简单地命名为“ disableWebsite \”, 什么?   但是我无法创建一个称为\“ DISABLE \”的HTTP动词和一个名为\“ / website \”的资源(因此请求将是\“ DISABLE / website \”)。这里有什么解决方案? 开机自检POST到
/passwords/stackoverflow.com/disable/
实体(
passwords/stackoverflow.com
)中包含一个“禁用”和“启用”子实体。您可以发布到任何一个以更改父实体的状态。   如果我有搜索表单,我希望它请求\“ / products / search / {query} \” 这就是大多数RESTful Web服务都使用Javascript或Flex或类似语言编写的原因。 RESTful Web服务和“本机” HTML表单并不是真正兼容的。他们不是故意的。     

要回复问题请先登录注册