HTTP协议中的If-Range头部用于条件性请求,它可以指示服务器在客户端的资源未发生变化时仅返回部分内容或返回304 Not Modified响应。在HTTP/1.1中,If-Range通常结合Range头部一起使用,可用于实现断点续传和局部更新等功能。
If-Range头部一般用于GET和HEAD请求中,格式为If-Range: entity-tag或If-Range: HTTP-date。其中,entity-tag对应资源的实体标签,HTTP-date对应资源的修改日期,两者可以任选其一。
当服务器收到带有If-Range头部的请求时,如果所请求的资源未发生变化,则服务器会返回包含请求范围(如Range头部指定的部分)的200 OK响应;否则服务器会返回完整的200 OK响应或带有新的ETag或Last-Modified头部的304 Not Modified响应,请求者可根据响应头部判断是否需要重新请求完整资源。
示例1:使用If-Range实现断点续传
客户端向服务器请求一个文件的某个范围:
GET /file.txt HTTP/1.1
Host: example.com
Range: bytes=0-999
服务器返回部分响应和对应的实体标签:
HTTP/1.1 206 Partial Content
Content-Length: 1000
Content-Range: bytes 0-999/5000
ETag: "abc012xyz345"
Content-Type: text/plain
<first 1000 bytes of file.txt>
客户端收到响应后,继续请求文件的后续部分,这时可以在请求头中带上If-Range头部,告诉服务器,如果文件内容未发生变化,则只需要返回所请求的范围,否则返回整个文件:
GET /file.txt HTTP/1.1
Host: example.com
Range: bytes=1000-
If-Range: "abc012xyz345"
如果服务器确认文件内容未发生变化,则返回部分响应:
HTTP/1.1 206 Partial Content
Content-Length: 4000
Content-Range: bytes 1000-4999/5000
Content-Type: text/plain
<second 4000 bytes of file.txt>
如果服务器发现文件内容已经更新了,则返回完整的响应和新的实体标签:
HTTP/1.1 200 OK
Content-Length: 5000
ETag: "efg456hij789lmn"
Content-Type: text/plain
<complete file.txt>
示例2:使用If-Range实现有效性验证
客户端向服务器发出一次GET请求:
GET /file.txt HTTP/1.1
Host: example.com
服务器返回完整的响应和对应的实体标签(假设当前ETag为"abc012xyz345"):
HTTP/1.1 200 OK
Content-Length: 5000
ETag: "abc012xyz345"
Content-Type: text/plain
<complete file.txt>
客户端再次请求同一资源,带上If-Range头部和上次响应的ETag:
GET /file.txt HTTP/1.1
Host: example.com
If-Range: "abc012xyz345"
如果服务器确认资源未发生变化,则返回304 Not Modified响应:
HTTP/1.1 304 Not Modified
ETag: "abc012xyz345"
如果服务器发现资源已经更新,则返回完整的响应和新的ETag:
HTTP/1.1 200 OK
Content-Length: 6000
ETag: "def123uvw678"
Content-Type: text/plain
<complete file.txt with additional content>
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:HTTP的If-Range头部有什么作用? - Python技术站