当 GET 请求需要相当大的 JSON 负载时,如何保持 API Restful?
How to keep API Restful when GET request requires sizable JSON payload?
我正在使用 JAX-RS 构建 java REST API 并完成对 zip 文件的 GET 请求,我需要相当大的 JSON 块来完成它.我对 REST 不是很熟悉,但我知道 GET
请求不应该有请求主体,POST
不应该返回资源。所以我想我的问题是,如何完成包含 JSON(当前在消息正文中)的请求,并期望在响应中包含一个 zip 文件,同时保持应用程序 RESTful?可能值得注意的是 JSON 也可能包含密码
我已将 POST 用于类似的场景。这是 SEARCH 操作的常见场景,需要在请求中发送 json 数据。虽然使用 POST 获取对象不符合 REST 标准,但我发现在可用选项下它是最合适的。
您可以在 GET 请求中发送正文,但并非所有 frameworks/tools/servers 都支持。 link 对此进行了详细讨论。
如果您使用POST进行操作,您可以使用https在正文中发送机密信息。
您可以认为您的 REST API 公开了一个虚拟文件系统,您提到的 zip 文件只是该 VFS 中的一个资源,并且在某个目录中有文件来表示对该文件系统的查询。然后,您可以通过向查询目录发送 POST 请求来创建一个新的查询对象,指定您需要的所有查询参数,例如块大小和 VFS 中的 zip 文件的路径。
我所指的虚拟文件系统实际上是一个包含其他目录和文件的目录,这些目录和文件可以代表磁盘上的真实文件或数据库中的元数据记录。
例如,假设您从 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
最后一点,您还应该知道查询资源可以建模以适应其他场景,例如某个文件的动态范围。
P.S。我知道答案并不明确,对此我深表歉意。时间允许的话我会尽量回来完善的
我正在使用 JAX-RS 构建 java REST API 并完成对 zip 文件的 GET 请求,我需要相当大的 JSON 块来完成它.我对 REST 不是很熟悉,但我知道 GET
请求不应该有请求主体,POST
不应该返回资源。所以我想我的问题是,如何完成包含 JSON(当前在消息正文中)的请求,并期望在响应中包含一个 zip 文件,同时保持应用程序 RESTful?可能值得注意的是 JSON 也可能包含密码
我已将 POST 用于类似的场景。这是 SEARCH 操作的常见场景,需要在请求中发送 json 数据。虽然使用 POST 获取对象不符合 REST 标准,但我发现在可用选项下它是最合适的。
您可以在 GET 请求中发送正文,但并非所有 frameworks/tools/servers 都支持。 link 对此进行了详细讨论。
如果您使用POST进行操作,您可以使用https在正文中发送机密信息。
您可以认为您的 REST API 公开了一个虚拟文件系统,您提到的 zip 文件只是该 VFS 中的一个资源,并且在某个目录中有文件来表示对该文件系统的查询。然后,您可以通过向查询目录发送 POST 请求来创建一个新的查询对象,指定您需要的所有查询参数,例如块大小和 VFS 中的 zip 文件的路径。
我所指的虚拟文件系统实际上是一个包含其他目录和文件的目录,这些目录和文件可以代表磁盘上的真实文件或数据库中的元数据记录。
例如,假设您从 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
最后一点,您还应该知道查询资源可以建模以适应其他场景,例如某个文件的动态范围。
P.S。我知道答案并不明确,对此我深表歉意。时间允许的话我会尽量回来完善的