在 REST API 中使用 GET 将信息发送到服务器

Using GET for sending information to server in REST APIs

直到现在,我一直认为GET 和POST 之间的唯一区别是数据传输的格式。 在其他示例中,我看到在 REST Api 中,发送信息的唯一命令是 POST,而获取信息的命令是 GET...

但是如果我也想用GET来发送信息怎么办?我必须发送一些要处理的数据集名称(通常是一个短数字......)......我不明白为什么GET不适合这种操作。或者这只是一个 "semantic" 原因?

编辑:我不想回答 GET 或 POST 之间的一般差异...我需要知道 GET 是否不应该用于在所有情况下更新服务器信息,特别是关于我的具体情况,或者有一些例外。

I don't understand why GET doesn't fits this operation. Or it's only a "semantic" reason?

是的,但语义才是重点。

REST architectural style is that of a uniform interface的重要制约因素之一;所有组件以相同方式理解消息的想法。这让我们能够使用通用组件完成有用的工作。

在 HTTP(在这种风格的约束下构建的应用程序)中,这意味着我们可以使用浏览器、缓存、反向代理和服务器工具包等,随时混合和匹配。一切正常,因为所有这些组件都明白请求应该按照 RFC 7230 中的描述进行解释,并且 request method token 是“请求语义的主要来源”,等等。

GET 的语义已经定义,我们都认同该定义。定义的措辞与其最早的规范相比有所演变,但基本语义一直保持不变:GET 实际上是只读的,并且(请求的)消息正文没有语义意义。

如果你想使用消息体在语义上很重要的 HTTP 方法,那么你需要放宽 GET 的一些限制(例如,通过使用 POST),选择不同的标准化更适合您的用例的方法(请参阅 IANA HTTP Method Registry), or by defining (and potentially standardizing)您自己的 HTTP 方法。

尝试为 GET 定义有效负载的核心问题 - 虽然您的定制客户端可能知道该做什么,并且您的定制资源可能知道该做什么,但通用中间体可能会做 错误 事情(比如缓存响应而不捕获请求正文中的信息,或者丢弃不需要的正文)。

请注意,编码到目标 uri 中的信息工作正常; HTML 使用 GET 方法和 URI 模板的其他变体的形式可用于从服务器可以解释的本地信息构造目标 uri(当然,目标 uri 长度的实际限制比有效负载大小的实际限制;这不是通用解决方案)。