HTTP-Bereichsanfragen
Eine HTTP Range
Anfrage fordert den Server auf, Teile einer Ressource an einen Client zu senden. Bereichsanfragen sind nützlich für verschiedene Clients, einschließlich Mediaplayern, die zufälligen Zugriff unterstützen, Datentools, die nur einen Teil einer großen Datei benötigen, und Download-Manager, die Nutzern das Anhalten und Fortsetzen eines Downloads ermöglichen.
Überprüfen, ob ein Server Teilanfragen unterstützt
Wenn eine HTTP-Antwort den Accept-Ranges
Header mit einem Wert ungleich none
enthält, unterstützt der Server Bereichsanfragen. Wenn Antworten den Accept-Ranges
Header weglassen, deutet dies darauf hin, dass der Server keine Teilanfragen unterstützt. Wenn Bereichsanfragen nicht unterstützt werden, können Anwendungen sich an diese Bedingung anpassen; zum Beispiel können Download-Manager Anhalten-Schaltflächen deaktivieren, die auf Bereichsanfragen angewiesen sind, um einen Download fortzusetzen.
Um zu überprüfen, ob ein Server Bereichsanfragen unterstützt, können Sie eine HEAD
Anfrage senden, um die Header zu inspizieren, ohne die Ressource vollständig anzufordern. Wenn Sie curl verwenden, können Sie das -I
Flag verwenden, um eine HEAD
Anfrage zu stellen:
curl -I https://i.imgur.com/z4d4kWk.jpg
Dies erzeugt die folgende HTTP-Anfrage:
HEAD /z4d4kWk.jpg HTTP/2
Host: i.imgur.com
User-Agent: curl/8.7.1
Accept: */*
Die Antwort enthält nur Header und keinen Antwortinhalt:
HTTP/2 200
content-type: image/jpeg
last-modified: Thu, 02 Feb 2017 11:15:53 GMT
…
accept-ranges: bytes
content-length: 146515
In dieser Antwort zeigt Accept-Ranges: bytes
an, dass 'bytes' als Einheiten zur Definition eines Bereichs verwendet werden können (derzeit ist keine andere Einheit möglich). Der Content-Length
Header ist ebenfalls hilfreich, da er die Gesamtgröße des Bildes angibt, wenn Sie dieselbe Anfrage stattdessen mit der GET
Methode stellen würden.
Anfordern eines bestimmten Bereichs von einem Server
Wenn der Server Bereichsanfragen unterstützt, können Sie angeben, welchen Teil (oder welche Teile) des Dokuments Sie vom Server zurückgesendet bekommen möchten, indem Sie den Range
Header in einer HTTP-Anfrage einschließen.
Einteilige Bereiche
Wir können einen einzelnen Bereich von einer Ressource anfordern, indem wir zur Veranschaulichung curl verwenden. Die -H
Option hängt eine Headerzeile an die Anfrage an, in diesem Fall den Range
Header, der die ersten 1024 Bytes anfordert. Die letzte Option ist --output -
, die es erlaubt, die binäre Ausgabe im Terminal auszugeben:
curl https://i.imgur.com/z4d4kWk.jpg -i -H "Range: bytes=0-1023" --output -
Die gestellte Anfrage sieht so aus:
GET /z4d4kWk.jpg HTTP/2
Host: i.imgur.com
User-Agent: curl/8.7.1
Accept: */*
Range: bytes=0-1023
Der Server antwortet mit einem 206 Partial Content
Status:
HTTP/2 206
content-type: image/jpeg
content-length: 1024
content-range: bytes 0-1023/146515
…
(binary content)
Der Content-Length
Header gibt die Größe des angeforderten Bereichs an, nicht die volle Größe des Bildes. Der Content-Range
Antwort-Header zeigt an, wo diese Teilnachricht innerhalb der gesamten Ressource steht.
Mehrteilige Bereiche
Der Range
Header ermöglicht es auch, mehrere Bereiche gleichzeitig in einem mehrteiligen Dokument zu erhalten. Die Bereiche sind durch ein Komma getrennt.
curl http://www.example.com -i -H "Range: bytes=0-50, 100-150"
Der Server antwortet mit dem 206 Partial Content
Status, wie unten gezeigt. Die Antwort enthält einen Content-Type
Header, der anzeigt, dass ein mehrteiliger Bytebereich folgt. Die Trennzeichenkette (3d6b6a416f9b5
in diesem Fall) trennt die Körperteile, von denen jeder seine eigenen Content-Type
und Content-Range
Felder hat:
HTTP/1.1 206 Partial Content
Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5
Content-Length: 282
--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 0-50/1270
<!doctype html>
<html lang="en-US">
<head>
<title>Example Do
--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 100-150/1270
eta http-equiv="Content-type" content="text/html; c
--3d6b6a416f9b5--
Bedingte Bereichsanfragen
Beim Fortsetzen der Anfrage nach weiteren Teilen einer Ressource müssen Sie sicherstellen, dass die gespeicherte Ressource seit dem Empfang des letzten Fragments nicht verändert wurde.
Der If-Range
HTTP-Anfrage-Header macht eine Bereichsanfrage bedingt: Wenn die Bedingung erfüllt ist, wird die Bereichsanfrage ausgeführt und der Server sendet eine 206
Partial Content
Antwort mit dem entsprechenden Inhalt zurück. Wenn die Bedingung nicht erfüllt ist, wird die vollständige Ressource mit einem 200
OK
Status zurückgesendet. Dieser Header kann entweder mit einem Last-Modified
Validator oder mit einer ETag
verwendet werden, aber nicht mit beiden.
If-Range: Wed, 21 Oct 2015 07:28:00 GMT
Antworten auf Teilanfragen
Es gibt drei relevante Status, wenn mit Bereichsanfragen gearbeitet wird:
- Eine erfolgreiche Bereichsanfrage führt zu einem
206
Partial Content
Status vom Server. - Eine Bereichsanfrage, die außerhalb des zulässigen Bereichs liegt, resultiert in einem
416
Requested Range Not Satisfiable
Status, was bedeutet, dass keiner der Bereichswerte den Umfang der Ressource überschneidet. Zum Beispiel könnte der erste-Byte-pos jedes Bereichs größer als die Ressourcengröße sein. - Wenn Bereichsanfragen nicht unterstützt werden, wird ein
200
OK
Status zurückgesendet und der gesamte Antwortinhalt wird übertragen.
Vergleich mit chunked Transfer-Encoding
Der Transfer-Encoding
Header ermöglicht chunked Encoding, das nützlich ist, wenn größere Datenmengen an den Client gesendet werden und die Gesamtgröße der Antwort nicht bekannt ist, bis die Anfrage vollständig verarbeitet wurde. Der Server sendet Daten sofort an den Client, ohne die Antwort zu puffern oder die exakte Länge zu bestimmen, was zu einer verbesserten Latenz führt. Bereichsanfragen und Chunking sind kompatibel und können miteinander oder unabhängig voneinander verwendet werden.
Siehe auch
- Verwandte Statuscodes
200
,206
,416
. - Verwandte Header:
Accept-Ranges
,Range
,Content-Range
,If-Range
,Transfer-Encoding
.