与实体不对应的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} \”。
没有找到相关结果
已邀请:
3 个回复
泉秘胁
DELETE并不意味着删除单个数据库实体。它意味着删除单个资源。 \“ / products?category = milk \”(或就此而言,\“ / products / milk \”)标识单个资源。如果可以获取,则可以删除它。 而且,如果您想同时实现这两者呢? 这个怎么样?
在Ruby on Rails中流行的一个技巧是为任何PUT / POST / DELETE操作提供一种表单(使用GET)。因此,对于这些删除,您可能想要提供如下形式:
在这种形式(例如HTML)中,您可以询问用户是否可以删除整个类别。(请不要注意HTML形式与RESTful Web服务并不真正兼容的概念。 HTML是一种非常成功的格式,可用于与Web上的资源进行交互,并且设计良好的AJAX应用程序可能首先会用作设计良好的HTML应用程序,需要制定一些细节以支持浏览器和其他浏览器客户端,但它们都是合法的REST客户端。) 如何禁用网站? 有很多方法可以做到这一点。仅将PUT放到/sites/stackoverflow.com并带有禁用标志即可。 最后,您如何使RESTful与HTML表单保持一致? 您实际上无法从浏览器执行HTTP PUT或DELETE,但是可以在表单中提供隐藏字段来伪造它:
只要您的路由引擎支持,这就是将浏览器帖子路由到适当的处理程序的好方法(我也看到人们对非HTML客户端使用X-HTTP-Method-Override标头,而没有对HTML客户端的完全支持HTTP动词)。 如果您有兴趣进行挖掘,建议将Web Services Cookbook作为入门。另外,看看理查森成熟度模型。请记住,REST与网络的其余部分一样。没有链接,它就不会很有用。为您的客户提供一种解决之道。
信藉乒
鞘垒飘
的DELETE有什么问题? 在“老派”网络服务模型下,我有一种方法简单地命名为“ disableWebsite \”, 什么? 但是我无法创建一个称为\“ DISABLE \”的HTTP动词和一个名为\“ / website \”的资源(因此请求将是\“ DISABLE / website \”)。这里有什么解决方案? 开机自检POST到
实体(
)中包含一个“禁用”和“启用”子实体。您可以发布到任何一个以更改父实体的状态。 如果我有搜索表单,我希望它请求\“ / products / search / {query} \” 这就是大多数RESTful Web服务都使用Javascript或Flex或类似语言编写的原因。 RESTful Web服务和“本机” HTML表单并不是真正兼容的。他们不是故意的。