rest - 如何将大量数据发送到无状态 RESTful 检索服务

标签 rest http request stateless http-verbs

这似乎是一个非常基本的问题,所以如果之前有人问过这个问题,我们深表歉意;请为我指明任何有用资源的方向。

所以我有一个 RESTful 服务来检索一些数据。然而,RESTful 服务需要一定量的数据才能进行检索。这些数据可以粗略地概括为“用户上下文”数据 - 有关用户的信息(无论是由调用应用程序存储还是之前从另一个应用程序检索),服务需要使用该信息来执行检索。

由于 REST 在语义上起作用,因此检索某些内容的正确动词(HTTP 方法)是 GET 请求。我见过的大多数示例 GET 请求仅使用少量数据,并且数据在 URL 上传递。然而,一旦我们进入需要大量数据才能进行检索的服务领域,将所有这些信息放在 URL 中似乎是错误的。不仅如此,某些组件对 URL 长度也存在已知限制(通常为 255 个字符左右,IIRC)。

似乎可用的选项是:

  • 使用 POST 发送请求正文中的数据。但是,这不是语义,因为我们不要求服务更新任何内容,而只是检索。
  • 将大部分信息(在我的例子中为“用户上下文”)放入 HTTP header 中。然而,这“感觉不对”,因为 header 应该用于 header ,而不是数据。
  • 发出多个请求以发送多个网址中的数据。然而,这似乎打破了无状态目标,因为服务必须维护某种状态才能将请求绑定(bind)在一起。
  • 将数据写入数据库,然后向服务传递一个 key 以从数据库检索数据。然而,这会导致请求不是独立的,并且还会引入性能瓶颈。

还有其他选择吗?这里的最佳实践是什么?

最佳答案

如果您的目标是想要执行一些复杂的读取操作,您想要传递大量数据来执行此操作,并且想要使用适当的 HTTP 方法,那么这些可能是您最好的 2 个选择:

  1. 执行 POST 请求来创建“查询资源”,然后执行单独的 GET 请求来接收该查询的结果。
  2. 使用专门为此目的而设计的 HTTP QUERY 方法。 QUERY 基本上是一个类似 POST 的方法,但它用于安全、幂等的读取操作并支持主体。它相对较新,但大多数 HTTP 客户端和服务器都接受任何已知或未知的 HTTP 方法。

选项 1 有效地为您提供了一个可以重复使用、链接到并执行 GET 操作的 URL,这在超媒体应用程序中特别有用。缺点是服务器需要记住更多,它需要 2 个 http 请求,并且您可能需要某种清理,这使得选项 2 更容易实现。

关于rest - 如何将大量数据发送到无状态 RESTful 检索服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27867987/

相关文章:

rest - 获取 ALM REST API 中给定测试集文件夹路径的所有测试集

Git LDAP 身份验证

php - Google Closure Compiler 和 multipart/form-data 不工作

javascript - 如何将 IPv6 与 NodeJS https.request() 一起使用

security - 在 HEADER 或 URL 中传递 API key ?

java - REST 客户端 InboundJaxrsResponse Status 500 ,当尝试 POST 时

api - 如何安静地暴露相关的父子资源?

c - Http POST..为什么不打印任何内容?

node.js - 请求无效,错误 : Invalid protocol: 127. 0.0.1 :?

django - 使用 django CSRF 中间件和返回 JsonResponse 的 View