假设我正在创建一个服务来管理带有元数据的文件。正如SO another thread中已经讨论的那样,首选的方法是创建两个资源:
问题是 - 允许客户上传包含元数据的文件的最佳方式是什么?以下方法如何:
POST / files - 客户端上传二进制文件,该服务创建一个新的文件资源和相应的新的,空的(即默认值),元数据资源并返回文件资源的ID(即fileId)
PUT / files / {fileId} / metadata - 客户端设置元数据。
我认为这种方法有一个缺点 - 让我们说一些元数据是强制性的。使用此流程,客户端可能仅上载文件但不填写元数据,从而使数据处于不一致状态。
另一方面,允许客户端同时发送文件和元数据似乎很奇怪,因为它是两种不同的资源。
你会怎么处理这个?
答案 0 :(得分:1)
另一方面,允许客户端同时发送文件和 元数据同时显得很奇怪,因为它有两个不同 资源。
内容和元数据可能表示为服务器中的不同资源,但它们彼此密切相关,创建一个没有另一个是没有意义的。例如,可能有客户端只需要元数据,因此他们可以显示文件列表或单个文件的详细信息。另一方面,您需要元数据,以便客户端至少知道他们下载的文件的名称。所以你需要它们。
这就是为什么在单个multipart http请求中上传文件/内容和元数据的最佳原因。在单个请求中上传所有内容会使您的系统更加一致,因为它消除了上载内容但元数据不是(或反过来)的各种情况。
多部分请求基本上是一个具有元数据(作为字符串)和其主体内容的请求。唯一困难的部分是标题。请查看上面的链接,了解有关多部分请求的更多信息,此外,您可能希望找到一个类(或类系列)来处理多部分标题(取决于您的平台/语言)。
此外 - 将元数据和内容作为不同的资源对客户端有益 - 他们可能只下载两个中的一个,在大文件的情况下节省网络流量(时间)。