POST 应该只用于 RESTful 服务器中的创建类型 API 吗?



RESTful(或任何(类型的服务器应该只使用POST路由来创建数据吗?例如,如果我说我需要从我们的服务器获取一些过滤数据,有些人会建议将这些条件放在 POST 路由的正文中。

但是,一些开发人员还建议将这些条件放在GET路由中,并使用url参数或url查询来获取数据。后者的开发人员也会告诉我,每当调用 POST 路由时,都应该创建一些东西,例如在数据库中。

对我来说,使用GET进行查询以使其保持RESTful似乎是更好的做法。我想知道将 POST 路由排除在基本查询之外有多重要,为什么?(如果它很重要的话(

REST的主要特性,由Fielding定义,是统一的接口。

要获得统一的接口,您需要标准化正在使用的协议元素。

HTTP 方法的通用标准是 RFC 7231。它定义了检索表示的GET,其中可以包括"过滤数据"。它将GET定义为安全和可缓存的。

假设你正在编写一个通用的 RESTful 客户端。您可以假设GET将检索所请求 URL 的表示形式。您可以将响应缓存到GET。您可以在出现错误时重试GET请求(因为它是安全的(。这一切都非常有用。

POST被定义为一种通用的、包罗万象的方法。它不仅缺乏自己的任何语义,而且 RFC 7231 说(强调我的(:

POST 方法请求目标资源处理根据资源的 拥有特定的语义

因此,在你的通用 RESTful 客户端中,你不能假设任何关于POST,所以你不能用它做任何有用的事情。

因此,GET是统一界面的一部分,而POST则不是。从这个意义上说,GET"更休息"。

也就是说,您可以为POST请求设计一个新标准,例如使用Content-Type: application/data-filter,具有有用且定义明确的语义。这将与RFC 7231的上述文本相矛盾,但无论如何,如果你有足够多的人同意你(也许在你的组织内(,你又有一个统一的界面。

顺便说一下,有人试图为这样的事情标准化SEARCH方法。这将作为统一接口(与标准化Content-Type结合使用(工作正常。不幸的是,该提案已经停滞不前,因此您可能不应该使用SEARCH.

最新更新