我正在开发http客户端/服务器框架,并寻找处理部分上传的正确方法(与使用带有Range标头的GET方法的下载相同)。
但是,HTTP PUT不打算恢复。 我知道,PATCH方法不接受Range标头。
有没有办法通过HTTP标准处理这个(不使用扩展标题或其他)?
提前致谢。
我正在开发http客户端/服务器框架,并寻找处理部分上传的正确方法(与使用带有Range标头的GET方法的下载相同)。
但是,HTTP PUT不打算恢复。 我知道,PATCH方法不接受Range标头。
有没有办法通过HTTP标准处理这个(不使用扩展标题或其他)?
提前致谢。
我认为部分上传没有标准:
如果你看看Dropbox,谷歌驱动器等的协议,他们都会推出自己的协议,以便在多个块中传输单个文件。恢复上传所需的是
使用Range xxxx-yyyy标头或带有PUT的Range xxxx-标头来更新文件的一部分。它受Apache支持。
不要被RFC 7231中的语句混淆,即不能使用Content-Range。这是为了防止客户端从服务器接收标头并使用PUT将它们发送回服务器。该警告通知与部分PUT问题无关。
正如一些评论中所指出的,HTTP规范的较新版本在某种程度上澄清了这一点。每 RFC 7231的4.3.4节:
允许PUT在给定目标资源上的原始服务器必须发送 对包含a的PUT请求的400(错误请求)响应 内容范围标题字段([RFC7233]的第4.2节),因为有效载荷 可能是部分内容被错误地作为一个完整的PUT 表示。通过定位a,可以进行部分内容更新 单独识别的资源与状态重叠的部分 更大的资源,或者使用具体的不同方法 为部分更新定义(例如,在中定义的PATCH方法) [RFC5789])。
不幸的是,讨论范围标题出现在 RFC 7233 或多或少完全关注GET请求,RFC 5789几乎没有定义任何关于PATCH的内容,除了特别不需要传输整个内容(但允许),也不要求它是幂等的(但允许) 。
好的一面是,因为PATCH的定义非常松散,所以它确实适应了相关问题答案中给出的方法(https://stackoverflow.com/a/6711496/7467189):只需将“PUT”更改为“PATCH”。虽然不要求服务器以这种方式解释具有Content-Range头的PATCH请求,但它肯定是一种有效的解释,而不是任何可以依赖于任意服务器或客户端的解释。但在诸如原始问题的情况下,两端的控制都是可用的,这至少是一种明显的方法,并且不违反现行标准。
另外一个考虑因素是Content-Type应该表达正在传输的内容,而不是整个实体的内容类型(RFC在这方面提供了一些示例)。对于以任意块“修补”的内容,这将意味着应用程序/八位字节流,尽管有些情况下客户端和服务器可能更具内容感知并且选择将补丁作为具有更具体定义的实体发送(例如,单页的多页图像格式)。