【问题标题】:How to keep API Restful when GET request requires sizable JSON payload?当 GET 请求需要相当大的 JSON 负载时,如何保持 API Restful?
【发布时间】:2015-10-28 22:34:41
【问题描述】:

我正在使用 JAX-RS 构建一个 java REST API,为了完成对 zip 文件的 GET 请求,我需要相当大的 JSON 块来完成它。我对 REST 的经验并不丰富,但我知道 GET 请求不应该有请求正文,POST 不应该返回资源。所以我想我的问题是,我如何完成一个包含 JSON 的请求(当前在消息正文中)并在响应中期望一个 zip 文件,同时保持应用程序 RESTful?值得注意的是,JSON 还可以包含密码

【问题讨论】:

  • 基于这些要求,让您的应用程序完全 RESTful 可能并不谨慎。 GET 请求必须将 URL 中的数据作为 URL 参数发送,我相信它有长度限制。我建议只使用 POST,即使你觉得它破坏了它的 RESTful 特性。最终它可能会更有意义。

标签: java json rest jax-rs


【解决方案1】:

我在类似的场景中使用过 POST。这是 SEARCH 操作的常见场景,需要在请求中发送 json 数据。虽然使用 POST 获取对象不符合 REST 标准,但我发现考虑到可用选项,这是最合适的。

您可以在 GET 请求中发送正文,但并非所有框架/工具/服务器都支持。 link 对此进行了详细讨论。

如果使用 POST 进行操作,可以使用 https 发送正文中的机密信息。

【讨论】:

  • 接受的答案实际上是不正确的,因为问题是关于如何为该问题保持 API RESTful,而不是关于解决方法......
【解决方案2】:

您可以认为您的 REST API 公开了一个虚拟文件系统,而您提到的 zip 文件只是该 VFS 中的一个资源,并且在某个目录中有文件来表示对该文件系统的查询。然后您可以通过向查询目录发送 POST 请求来创建一个新的查询对象,指定您需要的所有查询参数,例如块大小和 zip 文件在 VFS 中的路径。

我所指的虚拟文件系统实际上是一个目录,其中包含其他目录和文件,这些目录和文件可以代表磁盘上的真实文件或数据库中的元数据记录。

例如,假设您从 VFS 中的以下目录布局开始:

/myvfs
    /files
        /archive.zip
    /queries

要下载 archive.zip 文件,您可以发送一个简单的 GET 请求:

// Request:
GET /myvfs/files/archive.zip

但这会立即流式传输整个文件。为了将其分成几部分,您可以创建一个查询,在其中下载 1MB 的块:

// Request:
POST /myvfs/queries/archive.zip

{
    chunk_size: 1048576
}

// Response:
{
    query_id: 42,
    chunks: 139
}

新查询位于地址 /myvfs/queries/archive.zip/42,可以通过向该 URL 发送 DELETE 请求来删除。

现在,您可以分段下载 zip 文件。请注意,查询的创建实际上并没有为每个部分创建更小的文件,它只提供有关偏移量和块大小的信息,这些信息可以在任何地方持久保存,从 RAM 到数据库或纯文本文件。

要下载 zip 文件的前 1MB 块,您可以发送 GET 请求:

GET /myvfs/queries/archive.zip/42/0

最后一点,您还应该注意,可以对查询资源进行建模以适应其他场景,例如某个文件的动态范围。

附:我知道答案并不像应有的那么清楚,对此我深表歉意。如果时间允许,我会尝试回来完善它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2021-02-03
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    相关资源
    最近更新 更多