我正在使用JAX-RS构建一个java REST API并完成对zip文件的GET请求我需要一个相当大的JSON块才能完成它。我对REST并不十分熟悉,但我知道GET
请求不应该有请求正文,而POST
不应该返回资源。所以我想我的问题是,我如何完成包含JSON的请求(当前在消息体中)并且在保持应用程序RESTful的同时期望响应中的zip文件?值得注意的是,JSON还可以包含密码
答案 0 :(得分:1)
我已经将POST用于类似的场景。这是SEARCH操作的常见方案,其中需要在请求中发送json数据。尽管使用POST来获取对象并不符合REST标准,但我发现这是最合适的选项。
您可以在GET请求中发送正文,但所有框架/工具/服务器都不支持。这个link详细讨论了这个问题。
如果您使用POST进行操作,则可以使用https在机构中发送机密信息。
答案 1 :(得分:0)
您可以认为您的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
,可以通过向该网址发送DELETE请求来删除。
现在,您可以部分下载zip文件。请注意,创建查询实际上并不会为每个部分创建较小的文件,它只提供有关偏移量和块大小的信息,可以保存在任何位置的信息,从RAM到数据库或纯文本文件。
要下载zip文件的第一个1MB块,您可以发送GET请求:
GET /myvfs/queries/archive.zip/42/0
作为最后一点,您还应该知道查询资源可以建模以适应其他方案,例如某个文件的动态范围。
P.S。我知道答案并不是那么清楚,我为此道歉。在时间允许的情况下,我会尽力回来改进它。