103 Early Hints
Verwendung
Sendet ein Server 103 Early Hints, wertet der Client die Link-Header aus und ruft die angegebenen Ressourcen vorab ab. Das ist besonders dann nützlich, wenn der Server Zeit für die Verarbeitung der Anfrage benötigt, bevor er die endgültige Antwort zusammenstellt. Während der Server arbeitet, nutzt der Client die Zeit, um Stylesheets, Bilder oder Skripte zu laden, die die endgültige Seite benötigt.
Hinweis
Mehrere 103-Early-Hints-Antworten werden vor der endgültigen HTTP-Antwort gesendet.
Hinweise sind keine Garantien
In jedem System, das auf Vorhersagen beruht, schwankt die Treffergenauigkeit. Wenn ein Server 103 Early Hints zurückgibt und dem Client damit nahelegt, bestimmte Ressourcen abzurufen, beruht dieser Vorschlag auf einer plausiblen Annahme. Nur die endgültige HTTP-Antwort liefert maßgebliche Link-Header.
Die Diskrepanz zwischen den Hinweisen und den endgültigen Headern äußert sich auf zwei Arten: Entweder benötigt die endgültige Antwort zusätzliche Ressourcen, die in den Hinweisen nicht genannt wurden, oder als Early Hints abgerufene Ressourcen erweisen sich als überflüssig. Im letzteren Fall hat der Client zusätzliche Arbeit ohne Nutzen geleistet, und die Gesamtdauer der Transaktion steigt.
Auf Basis von Early Hints durchgeführte Operationen sind sicher. Die Verwendung einer GET-Methode verändert beispielsweise den Serverzustand nicht.
SEO-Auswirkung
103 Early Hints ist eine informatorische Antwort, die dem endgültigen Statuscode vorausgeht. Suchmaschinen-Crawler verarbeiten die endgültige Antwort, nicht die zwischengeschalteten informatorischen Antworten. Die Leistungsgewinne durch Early Hints gelten für Browser, nicht für Crawler. Der Statuscode kann gefahrlos eingesetzt werden und beeinträchtigt nicht, wie Google die Seite verarbeitet.
Server Push ersetzen
Der Mechanismus 103 Early Hints ist als Teil des Resource-Hints-Frameworks mit rel=preload dazu bestimmt, den Server-Push-Mechanismus in modernen Browsern zu ersetzen. Anders als Server Push ist 103 Early Hints nicht auf die endgültige Antwort angewiesen, bevor der Browser mit dem Abrufen der angegebenen Ressourcen beginnt.
Hinweis
Aus Sicherheitsgründen beschränken Browser die Verwendung von 103 Early Hints ausschließlich auf HTTP/2- und HTTP/3-Verbindungen.
Beispiel
Der Client fordert eine Datei index.html an, und der Server liefert drei Hinweise auf Ressourcen, die voraussichtlich benötigt werden. Die angeforderte Datei befindet sich nicht im Nachrichtenrumpf, weil der Server die Antwort noch erzeugt. Der Client beginnt, die von jeder Link-Direktive angegebenen Ressourcen zu laden.
Nach einer kurzen Verzögerung liefert der Server die endgültige 200-Antwort zusammen mit den offiziellen Link-Direktiven und index.html im Nachrichtenrumpf. Beachten Sie die Unterschiede zwischen den Early Hints und der endgültigen Ressourcenliste.
Anfrage
GET /index.html HTTP/1.1
Host: example.com
Antwort
HTTP/1.1 103 Early Hints
Link: </style.css>; rel=preload; as=style
Link: </images/logo.svg>; rel=preload; as=image
Link: </videos/instructions_simple.mp4>; rel=preload; as=video
<there is a short pause in the transmission>
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 100
Link: </style.css>; rel=preload; as=style
Link: </images/logo.svg>; rel=preload; as=image
Link: </images/pro_badge.svg>; rel=preload; as=image
Link: </videos/instructions_advanced.mp4>; rel=preload; as=video
<message body will follow>
Die erste Early-Hint-Ressource, style.css, wird vom Client abgerufen und verarbeitet, ebenso das Logo-Bild und das Video instructions_simple.mp4. Sowohl das Stylesheet als auch das Logo sind unverändert verwendbar. Das Bild pro_badge aus der endgültigen Antwort taucht in den Hinweisen nicht auf, daher ruft der Client diese Ressource erst nach Erhalt der endgültigen Antwort ab.
Das Video instructions_advanced.mp4 in den endgültigen Link-Headern weicht vom Early Hint ab. Der Server hatte über die Early Hints instructions_simple.mp4 vorgeschlagen, der Abruf war jedoch unnötig. Das neu angegebene Video muss weiterhin abgerufen und verarbeitet werden, bevor index.html vollständig gerendert wird, was die Ladezeit vermutlich erhöht, weil zwei Videos statt eines abgerufen wurden.
Code-Referenzen
.NET
HttpStatusCode.EarlyHints
Rust
http::StatusCode::EARLY_HINTS
Rails
:early_hints
Go
http.StatusEarlyHints
Symfony
Response::HTTP_EARLY_HINTS
Python3.9+
http.HTTPStatus.EARLY_HINTS
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_EARLY_HINTS
Angular
@angular/common/http/HttpStatusCode.EarlyHints