POST是否仅用于RESTful服务器中的创建类型API?

时间:2018-05-11 21:56:10

标签: rest restful-architecture

RESTful(或任何)类型的服务器是否只使用POST路由进行数据创建?例如,如果我要说我需要从服务器获取一些过滤数据,有些人会建议将这些条件放在POST路由的主体中。

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

对我而言,似乎更好的做法是使用GET进行查询以保持RESTful。我想知道保留POST路由的基本查询有多重要,为什么? (如果它很重要的话)

1 个答案:

答案 0 :(得分:3)

由Fielding定义的REST的主要特征是uniform interface

要拥有统一的界面,您需要标准化您正在使用的协议元素。

HTTP方法的通用标准是RFC 7231。它定义GET用于检索表示,其中可以包括“过滤数据”。它将GET定义为safecacheable

想象一下,您正在撰写通用RESTful客户端。您可以假设GET将检索所请求URL的表示。您可以缓存对GET的回复。您可以针对错误重试GET次请求(因为它是安全的)。这一切都非常有用。

但是POST被定义为一种通用的,全能的方法。它不仅缺乏自己的语义,而且RFC 7231说(强调我的):

  

POST方法请求目标资源处理      根据资源的请求包含在中的表示      拥有特定的语义

因此,在您的通用RESTful客户端中,您不能假设有关POST的任何内容,因此您无法对其进行任何有用的操作。

因此GET是统一界面的一部分,而POST则不是。GET。从这个意义上讲,POST是“更加RESTful”。

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

顺便说一下,有人试图standardize a SEARCH method这样的事情。这可以作为统一的界面(与标准化的SEARCH一起使用)。不幸的是,该提案已经停滞,因此您可能不应该使用buildscript { repositories { maven { url 'https://maven.fabric.io/public' } } dependencies { classpath 'io.fabric.tools:gradle:1.25.4' }