我在开发休息服务时得到了一个查询。
根据REST设计,GET是读取,PUT或POST是根据场景创建或更新,DELETE是删除资源。
但从技术上讲,我们不能在GET调用中执行创建或删除操作。 即,通过使用指定的URL模式和所需的响应类型来调用客户端调用方式,以达到REST应用程序的服务类中的确切方法。但是为什么我们不能在GET服务中执行删除或创建一些数据。
所以我的问题是在GET服务中技术上不可能的DELETE或CREATE,或者是遵守REST原则的规则。
答案 0 :(得分:1)
所以我的问题是在GET服务中技术上不可能的DELETE或CREATE,或者是遵守REST原则的规则。
后者。使用DELETE HTTP方法进行删除操作只是一种约定。但是,使用GET HTTP方法进行删除操作是个坏主意。以下是来自" RESTful Java with JAX-RS 2.0,2nd Edition"这解释了原因:
我们不分配至关重要 HTTP方法的功能,取代规范定义的边界 那种方法。例如,特定资源上的HTTP GET应该是只读的。 它不应该更改它正在调用的资源的状态。中级服务 像代理缓存,CDN(Akamai)或您的浏览器依赖您遵循语义 严格的HTTP,以便他们可以有效地执行内置任务,如缓存。如果你 严格遵守每个HTTP方法的定义,客户端和管理 工具无法对您的服务做出假设,您的系统也会变得更多 复杂的
答案 1 :(得分:1)
所以我的问题是在GET中技术上不可能的DELETE或CREATE 服务还是遵守REST原则的规则?
REST使用标准。统一界面约束。其中一个标准是定义HTTP方法的HTTP标准。根据HTTP标准,GET是一种安全的方法:
特别是,已经建立了GET和GET的惯例 HEAD方法不应该具有采取行动的意义 除了检索。应该考虑这些方法"安全"。 这允许用户代理表示其他方法,例如POST,PUT 和DELETE,以一种特殊的方式,使用户了解 事实上,正在要求采取可能不安全的行动。
根据RFC 2119:
- 不应该 - 这句话,或短语" Not WOMOMENDED"意味着在特定情况下,当特定行为可接受或甚至有用时,可能存在正当理由,但在实施此标签所描述的任何行为之前,应理解全部含义并仔细权衡该案例。
醇>
例如,如果你想增加每个请求的访问者数量,写入可以是GET的副作用。
答案 2 :(得分:0)
如何构建服务器软件(API)以及应用什么“规则”有些“随意”。开发人员及其产品经理可以执行“规则”,例如“您不能通过GET操作编写代码或支持DELETE操作”,但在实践中,这并不一定是选择POST而不是GET的主要原因。正如其他人所提到的,可能存在基于其他供应商可能依赖的HTTP协议的假设,但这是一个相当复杂且不一定相关的推理。例如,您的应用程序可能构建为直接连接到服务器应用程序,而其他供应商的规则可能不适用。
在一个更简单的示例中,在万维网上,由于合规性和其他因素,查询字符串的字节长度有限。因此,需要大量数据的操作,例如数据库中DELETE操作可能需要的一些非常长的加密数据字符串,GET可能无法传递足够的数据,因此POST可能是唯一可行的选项。
使用CuRL库的自定义构建的应用程序可能会扩展为包含具有其预期功能的其他RESTful操作,但这将有利于服务器API。在客户端编写更多操作并不一定会使客户视角“更容易”,“更快”或“更安全”,但这样做有助于管理服务器端的资源(帮助)并帮助保持与第三方软件和设备的兼容性。