gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:50:06 25 4
gpt4 key购买 nike

我喜欢 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”的资源(因此请求将是“禁用/网站”)。这里的解决方案是什么?

最后,您如何协调 HTML 表单与 RESTful? Web 表单只能使用查询字符串或 POST 发出 GET 请求。如果我有一个搜索表单,我希望它请求“/products/search/{query}”,但现在请求看起来像“/products/search?query={query}”。

最佳答案

我认为您应该停止将资源视为数据库实体的同义词。是的,它们通常是相关的,但资源实际上只是您领域中的一个可寻址概念。我认为将资源视为您在使用浏览器时在网络上看到的内容(列表、项目、帖子、评论、图像等)会更有用。

But how would you do a "clear all" command?



我不确定为什么 DELETE/products/milk 意味着删除牛奶类别本身,但如果您愿意:
DELETE /products?category=milk

DELETE 并不意味着删除单个数据库实体。它意味着删除单个资源。并且“/products?category=milk”(或“/products/milk”,就此而言)标识单个资源。如果你能得到它,你可以删除它。

And what if you want to accomplish both?



这个怎么样?
DELETE /product-categories/milk

Ruby on Rails 流行的一个技巧是为任何 PUT/POST/DELETE 操作提供一个表单(使用 GET)。因此,对于这些删除,您可能需要提供这样的表单:
GET /product-categories/milk/delete

在那种形式(想想 HTML)中,你可以问你的用户是否真的可以删除整个类别。(请不要注意 HTML 表单与 RESTful Web 服务并不真正兼容的概念。HTML 是一个很好的与网络上的资源交互的成功格式,一个设计良好的 AJAX 应用程序可能首先作为一个设计良好的 HTML 应用程序工作。有一些细节需要解决以支持浏览器和其他客户端,但它们都是合法的 REST 客户端。)

How to disable a website?



有很多方法可以做到这一点。只需将带有禁用标志的 PUT 放到/sites/stackoverflow.com 即可。

Finally, how do you reconcile HTML Forms with RESTful?



您不能真正从浏览器执行 HTTP PUT 或 DELETE,但您可以在表单中提供一个隐藏字段来伪造它:
<input type="hidden" name="_method" value="PUT" />

只要您的路由引擎支持它,这是将浏览器帖子路由到适当处理程序的好方法(我还看到人们对非 HTML 客户端使用 X-HTTP-Method-Override header ,而没有完全支持 HTTP动词)。

如果你有兴趣深入挖掘,我推荐 Web Services Cookbook作为首发。另外,看看 Richardson Maturity Model .请记住,REST 就像网络的其他部分一样。如果没有链接,它不会很有用。为您的客户提供出行方式。
<a href="/products/milk/delete" rel="delete" />

<atom:link href="/products/milk/delete" rel="delete" />

关于与实体不对应的 RESTful 操作/服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6433480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com