具有大量输入数据的 REST 端点 (GET)

标签 rest get

我正在开发一个应用程序,我需要将对象列表传递给 REST 端点,该端点将进行一些计算并将结果返回给调用者。

问题更多是关于如何处理这种情况的哲学问题?

在 GET 请求中传递大量有效负载是一个坏主意。同时它不是真正的 POST/PUT 请求,因为它没有修改服务器上的任何状态。

有没有人遇到过这个问题?

最佳答案

The question is more of a philosophical one as to how to deal with this situation?


Web 的部分理念是,您不需要知道端点是如何实现的:带有预先计算答案的文档、动态计算和重定向到其他人的文档。
所以从纯哲学的角度来看,GET 是正确的答案。
GET 不支持内容主体;您唯一的选择是将这个特定计算的结果表示为资源 - 换句话说,将您的数据放入 URI。
实际上,您可能会遇到 arbitrary limits关于URI可以有多长。因此,取决于客户端(浏览器/库),这可能是个问题。
PUT 会很好;与 POST 相比的优势在于 PUT 应该是幂等的,使用 PUT 跨统一接口(interface)通信您想要的丢失消息语义。
不幸的是,PUT 规范要求用​​消息有效负载替换目标资源。这真的是关于文件传输。也就是说,RFC-7231确实给了你一些回旋的空间。

When a PUT representation is inconsistent with the target resource, the origin server SHOULD either make them consistent, by transforming the representation or changing the resource configuration, or respond with an appropriate error message containing sufficient information to explain why the representation is unsuitable.


因此,您可能会争辩说计算的结果是表示的转换。
这种 PUT 的使用与 Jim Webber 并没有什么不同。谈到。在 RESTbucks演示中,您通过 PUT 方法在系统中创建订单来触发业务领域的副作用,这将创建一个用于跟踪该订单状态的资源。
在这种方法中,每个提交的计算都应该有一个唯一的标识符;您可以将输入放入该计算中,它会返回 201 - Created 和结果。理论上,您可以在资源上支持 GET,在不需要输入的情况下返回结果,或者在资源上支持 DELETE,作为客户端已收到计算结果并且在服务器上不需要它的一种确认更长。
或者不 - 你实际上并不需要它,而且你当然不需要支持每个资源上的所有 http 方法。
如果这种方法 Not Acceptable (例如,如果您使用 HTML 作为您的媒体类型),那么 POST 就是您的神奇包罗万象的方法。它实际上并不适合您想要的东西。但是 POST 必须支持非幂等操作,这意味着统一接口(interface)不会识别您的计算是幂等的。在幸福的道路上,这没什么大不了的。

关于具有大量输入数据的 REST 端点 (GET),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37942148/

相关文章:

php - 将 Linux Curl 转换为 PHP

java - Angular2 HttpClient 使用 Rest API

rest - 如何使用长 URL 实现 RESTful?

jquery - 如何格式化使用 $.load 或 $.get 或 $.ajax 加载的(css)数据?

arduino - 从 URL 读取 GET 请求值到 Arduino WebServer

json - Jersey :JSON对象列表

node.js - 如何为错误测试目的在 rest API 上创建 500 错误?

python - django-rest-swagger 返回内部服务器错误

php - 在 C 中使用 http 设置 PHP super 全局变量

c# - 如何根据内部 json 对象值在 DocumentDB 中查询?