【问题标题】:Web service for retrieving chunks of data用于检索数据块的 Web 服务
【发布时间】:2011-01-07 10:50:04
【问题描述】:

我正计划开发一个 web 服务,我喜欢尝试 RESTful 架构。问题是我不知道该服务是否足以满足它,还是使用 SOAP 更好。

该服务是关于将一​​些数据从服务器下载到本地计算机上的设备。数据将被分成块。该服务将在本地计算机上使用临时客户端运行,该客户端将管理将存储文件的设备。

我想有类似的东西:

/files/{id} --> will inform about the details of the file  
/files--> list all the files  

问题在于行动。在休息时,只定义了 GET、POST 和 (PUT DELETE)。但我想要下载之类的东西。我的想法,虽然不完全平静,但要创造:
/files/{id}/下载 这将返回类似

{ "chunk" : "base64 string with chunk data"  
  "next" : "http://XXX/file/id/download?chunk=1  
}

当 next 为空时,将下载整个块集。

你怎么看?这样做可以吗?还是使用 SOAP 和定义 getFiles()、getFileChunk(chunkNo, file) 等函数的传统方式更好?

非常感谢任何评论。

再见

【问题讨论】:

    标签: java rest web-services


    【解决方案1】:

    听起来您确实有两种不同的资源:@​​987654321@s 和 files。像这样的东西呢:

    /file/{id}          // GET: Retrieve this file's data.
    /file-metadata/{id} // GET: Metadata about a particular file. Contains link to file:
                        // {
                        //    ...
                        //    data: "http://.../file/156",  // Where to find file's data.
                        // }
    /file-metadata      // GET: List metadata for all files.
    

    【讨论】:

      【解决方案2】:

      正如 John 已经提到的,您可能希望将文件资源和文件资源元数据(有关文件的任何信息)分开。此外,访问块的更 RESTful 方式可能如下所示:

      http://url/files/{id}/chunks
      
      {
          "complete" : false,
          "chunks": [
              "http://url/files/<fileid>/chunks/1",
              "http://url/files/<fileid>/chunks/2",
              "http://url/files/<fileid>/chunks/3",
          ]
      }
      

      基本上,在这里,您返回所有文件块的 RESTFUL URI 列表以及文件的所有块是否已完成的信息。我不认为 SOAP 在那里可能有任何优势,因为您将定义 REST 动词 GET 已经涵盖的相同方法(getFile 和 getChunks)。

      【讨论】:

      • 感谢大家的回答。 @Daff 想法是我最初的想法。您能否进一步解释“完整”标签?问题是我可能没有完全描述服务的想法。问题是我需要将数据加载到设备中的结果发送回服务器。然后服务器将检查是否发生错误并返回下一个块或错误指示客户端应停止向设备发送数据并关闭与设备的连接。希望你仍然可以帮助我。我喜欢这个正在休息的想法,但仍然对使用它可以实现什么有一些疑问。
      • 嗯,我不确定我是否完全得到你想要做的。但是 Kevin 可能是对的,这就是 HTTP 范围标头的用途,如果服务器发现错误,它将返回 HTTP 错误代码之一。因此,您应该检查客户端是否可以将有关成功处理的信息打包到请求标头中,或者(如果这不起作用)也可以作为下一个块的 URI 参数。
      • 问题是设备只接受块,服务器需要验证块已正确上传到设备中。从这个意义上说,在向设备发送数据时,设备的响应必须发送到服务器,服务器将检查数据是否正确(中间存在一些密码问题)。
      • 因此设备将在请求中将更多信息发送回服务器,而不仅仅是“接收并处理的块 #123”或“错误处理块 #123”(我猜这将与 If -请求中的范围标头,见en.wikipedia.org/wiki/HTTP_header)?
      • 就是这样。设备响应将是服务器需要解密的值,以验证数据是否已正确加载。如果已正确加载,它将发送下一个块,否则将终止。非常感谢您的帮助。我认为我们正在趋同,您的经验将有很大帮助。想象一下,设备连接到串行端口,服务器正在发送客户端必须发送到串行端口的数据。然后答案将被发送回服务器,检查并在正确的情况下发送下一个命令。这或多或少是个想法。
      【解决方案3】:

      如果使用 REST,您不需要定义自己的“分块”协议,因为 HTTP 标头 Content-Length、Content-Range 和 Transfer-Encoding 都用于发送分块数据。

      请参阅RFC 获取 HTTP 标头字段

      【讨论】:

        猜你喜欢
        • 2017-01-09
        • 1970-01-01
        • 1970-01-01
        • 2014-03-15
        • 2012-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多