我正在开发 http 客户端/服务器框架,并寻找处理部分上传的正确方法(与使用带有 Range 标头的 GET 方法下载相同)。
但是,HTTP PUT 并不打算恢复。 据我所知,PATCH 方法不接受 Range 标头。
有没有办法通过 HTTP 标准来处理这个问题(不使用扩展头等)?
我认为部分上传没有标准:
PATCH /document HTTP/1.1
Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
--THIS_STRING_SEPARATES
Content-Type: text/plain
Content-Range: bytes 10-21/22
1234567890
--THIS_STRING_SEPARATES--
此示例以 10 字节偏移量上传 12 字节。 THIS_STRING_SEPARATES
是任意的、用户选择的分隔符,并且应该是随机生成的。为了简洁起见,省略了一些标题,每行以 ␍␊ 结尾。
第 4.3.4 节:
允许对给定目标资源进行 PUT 的源服务器必须发送 对包含以下内容的 PUT 请求的 400(错误请求)响应 Content-Range 标头字段(不幸的是,[RFC7233]第 4.2 节),因为有效负载 可能是部分内容被错误地 PUT 为完整内容 表示。通过定位可以进行部分内容更新 单独标识的资源的状态与部分资源重叠 更大的资源,或者使用专门的不同方法 为部分更新定义(例如,在 [RFC5789])。
RFC 7233中出现的范围标头的讨论或多或少完全集中在 GET 请求上,而 RFC 5789 几乎没有定义任何有关 PATCH 的内容,除了明确不要求传输整个内容(但允许),也不要求是幂等的(但允许)。
好的一面是,由于 PATCH 的定义如此松散,它确实适应了相关问题的答案中给出的方法(https://stackoverflow.com/a/6711496/7467189):只需将“PUT”更改为“修补”。虽然不要求服务器以这种方式解释带有 Content-Range 标头的 PATCH 请求,但这肯定是一种有效的解释,只是不能被任意服务器或客户端依赖。但在像最初的问题这样的情况下,两端都可以控制,这至少是一种显而易见的方法,并且不违反现行标准。
一个额外的考虑因素是 Content-Type 应该表达正在传输的内容,而不是整个实体的内容类型(RFC 给出了这方面的一些示例)。对于以任意块“修补”的内容,这将意味着应用程序/八位字节流,尽管在某些情况下客户端和服务器可能更了解内容并选择将补丁作为具有更具体定义的实体发送(例如多页图像格式的单页)。
不要对 RFC 7231 中不能使用 Content-Range 的声明感到困惑。这是为了防止客户端获取从服务器接收的标头并使用 PUT 将它们发送回服务器而造成不良后果。此警告通知与部分 PUT 问题无关。