Was ist das Feld "Inhaltslänge" im HTTP-Header?

282

Was bedeutet das?

  1. Byteanzahl der codierten Inhaltszeichenfolge mit der im Header angegebenen Codierung.
  2. Zeichenanzahl der Inhaltszeichenfolge.

Besonders im Fall von Content-Type: application/x-www-form-urlencoded.

Eonil
quelle

Antworten:

239

rfc2616

Das Feld Content-Length-Entity-Header gibt die Größe des Entity-Body in Dezimalzahlen der OCTETs an, die an den Empfänger gesendet wurden, oder im Fall der HEAD-Methode die Größe des Entity-Body, der gesendet worden wäre Die Anfrage war ein GET.

Es spielt keine Rolle, um welchen Inhaltstyp es sich handelt.

Erweiterung am Post unten .

Wirbelwind
quelle
14
Kombinieren Sie diese Antwort mit der Antwort von Tom Cabanski und Sie haben alle Informationen, die Sie benötigen. Bei Text können Sie die Anzahl der Zeichen zählen, da ASCII 8 Bit beträgt.
hcpl
9
@hcpl: aber Text ist nicht unbedingt immer ASCII, auch ASCII ist 7-Bit, nicht 8.
Lie Ryan
2
Ersetzen Sie ASCII durch die von Ihnen verwendete Codierung und ermitteln Sie die Anzahl der für die Codierung erforderlichen Bits. Für die 7 vs 8 Bit Antwort; Ursprünglich war es 7 Bit, also hast du wieder Recht. Aufgrund der Art und Weise, wie der Computerspeicher organisiert ist, werden heute in den meisten (wenn nicht allen) Fällen 8 Bit verwendet. edit: Wenn ich meine Antwort noch einmal lese, sehe ich, wohin du gehst. Ich sollte meinen ursprünglichen Kommentar umformulieren.
hcpl
6
@hcpl: Der gesamte Grund, warum das Problem mit Bytes und Zeichen von Bedeutung ist, liegt in Codierungen mit variabler Breite wie UTF-8 und UTF-16, bei denen die "Anzahl der Bits" nicht festgelegt ist.
StefanKarpinski
2
Könnten Sie diese Nummer fälschen? wie POST einen String-Parameter mit großer Länge, aber setzen Sie Ihre Inhaltslänge auf 1?
Shih-Min Lee
260

Dies ist die Anzahl der Datenbytes im Hauptteil der Anforderung oder Antwort. Der Körper ist der Teil, der nach der Leerzeile unter den Überschriften steht.

Tom Cabanski
quelle
1
Ist es nicht NUR "der Text der Antwort" anstatt "Anfrage oder Antwort"? Die Anforderung enthält keine Leerzeile zwischen Header und Daten.
Ajfbiw.s
kann ich die HTTP - Response - Header Inhaltslänge in einem Java - Filter abgelegt ändern
Kitis
2
@ ajfbiw.s Betrachten Sie eine http-Post-Anfrage. "Das Vorhandensein eines Nachrichtentexts in einer Anforderung wird durch die Aufnahme eines Headerfelds für Inhaltslänge
Roy Guanyu
68

Der Content-LengthHeader ist eine Zahl, die die genaue Bytelänge des HTTP-Körpers angibt. Der HTTP-Body beginnt unmittelbar nach der ersten leeren Zeile, die nach der Startzeile und den Headern gefunden wird.

Im Allgemeinen wird der Content-LengthHeader für HTTP 1.1 verwendet, damit der Empfänger weiß, wann die aktuelle Antwort * beendet ist, sodass die Verbindung für eine andere Anforderung wiederverwendet werden kann .

* ... oder Anfrage bei Anforderungsmethoden mit einem Textkörper wie POST, PUT oder PATCH

Alternativ kann der Content-LengthHeader weggelassen und ein Chunked- Transfer-EncodingHeader verwendet werden.

Wenn sowohl Content-Lengthals auch Transfer-EncodingHeader fehlen, muss am Ende der Antwort die Verbindung geschlossen werden.

Die folgende Ressource ist eine Anleitung, die ich beim Erlernen von HTTP als sehr nützlich empfunden habe:

HTTP wirklich einfach gemacht .

Spender
quelle
45

Ein Oktett besteht aus 8 Bits. Die Inhaltslänge ist die Anzahl der Oktette, die der Nachrichtentext darstellt.

itsproject
quelle
37
Oktett = AKA-Byte?
ViniciusPires
77
@ ViniciusPires 'Byte' wird üblicherweise verwendet, um die kleinste adressierbare Speichereinheit zu beschreiben, die nicht unbedingt 8 Bit auf allen Architekturen beträgt. Deshalb wird 'Oktett' verwendet, um Mehrdeutigkeiten zu vermeiden
PJK
6
@PJK, Nein, nicht genau richtig. OCTETHier hat eine sehr spezifische Bedeutung, was <jede 8-Bit-Folge von Daten> bedeutet. Siehe die Definition unter w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2
Pacerier
28

Von hier aus :

Das Feld Content-Length-Entity-Header gibt die Größe des Entity-Body in Dezimalzahlen der OCTETs an, die an den Empfänger gesendet wurden, oder im Fall der HEAD-Methode die Größe des Entity-Body, der gesendet worden wäre Die Anfrage war ein GET.

   Content-Length    = "Content-Length" ":" 1*DIGIT

Ein Beispiel ist

   Content-Length: 3495

Anwendungen sollten dieses Feld verwenden, um die Übertragungslänge des Nachrichtentexts anzugeben, es sei denn, dies ist durch die Regeln in Abschnitt 4.4 verboten .

Jede Inhaltslänge größer oder gleich Null ist ein gültiger Wert. In Abschnitt 4.4 wird beschrieben, wie die Länge eines Nachrichtentexts bestimmt wird, wenn keine Inhaltslänge angegeben wird.

Beachten Sie, dass sich die Bedeutung dieses Felds erheblich von der entsprechenden Definition in MIME unterscheidet, wo es sich um ein optionales Feld handelt, das im Inhaltstyp "Nachricht / externer Körper" verwendet wird. In HTTP sollte es gesendet werden, wenn die Länge der Nachricht vor der Übertragung bestimmt werden kann, es sei denn, dies ist durch die Regeln in Abschnitt 4.4 verboten.

Meine Interpretation ist, dass dies die Länge "auf dem Draht" bedeutet, dh die Länge des * codierten "Inhalts

Daniel Renshaw
quelle
7
"Auf dem Draht" würde die Länge abhängig von der Komprimierung geändert, aber es ist richtig, die Länge vor dem Komprimieren anzugeben.
BayssMekanique
Wird sich die Inhaltslänge auf verschiedenen Computertypen wie Mac / Linux unterscheiden? ODER wird es anders sein, wenn Sie einen anderen Client wie Curl / Postman verwenden ...?
Kanagavelu Sugumar
1
Unter der Annahme, dass alles andere gleich bleibt (z. B. Codierung, Komprimierung usw.), sollte die Inhaltslänge plattformunabhängig sein. Dies ist ein Header vom Server. Unter der Annahme, dass er den Benutzeragenten nicht beschnüffelt und sich nicht anders verhält, sollte der Client keinen Unterschied machen.
Daniel Renshaw
Typoskript wirft einen Fehler auf. Der Typ 'number' kann nicht dem Typ 'string | zugewiesen werden string [] 'so wäre das Beispiel"Content-length": "3495"
A. D'Alfonso vor
8

Von dieser Seite

POST wird bei weitem am häufigsten verwendet, um HTML-Formulardaten an CGI-Skripte zu senden. In diesem Fall lautet der Header "Content-Type:" normalerweise application / x-www-form-urlencoded, und der Header "Content-Length:" gibt die Länge der URL-codierten Formulardaten an (hier ein Hinweis zur URL-Codierung). Das CGI-Skript empfängt den Nachrichtentext über STDIN und decodiert ihn. Hier ist eine typische Formularübermittlung mit POST:

POST /path/script.cgi HTTP/1.0
From: [email protected]
User-Agent: HTTPTool/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 32
Da ist ein
quelle
5

Nach der Spezifikation :

Das Feld Content-Length-Entity-Header gibt die Größe des Entity-Body in Dezimalzahlen der OCTETs an, die an den Empfänger gesendet wurden, oder im Fall der HEAD-Methode die Größe des Entity-Body, der gesendet worden wäre Die Anfrage war ein GET.

Content-Length    = "Content-Length" ":" 1*DIGIT

Ein Beispiel ist

Content-Length: 3495

Anwendungen sollten dieses Feld verwenden, um die Übertragungslänge des Nachrichtentexts anzugeben, es sei denn, dies ist durch die Regeln in Abschnitt 4.4 verboten.

Jede Inhaltslänge größer oder gleich Null ist ein gültiger Wert. In Abschnitt 4.4 wird beschrieben, wie die Länge eines Nachrichtentexts bestimmt wird, wenn keine Inhaltslänge angegeben wird.

Beachten Sie, dass sich die Bedeutung dieses Felds erheblich von der entsprechenden Definition in MIME unterscheidet, wo es sich um ein optionales Feld handelt, das im Inhaltstyp "Nachricht / externer Körper" verwendet wird. In HTTP sollte es gesendet werden, wenn die Länge der Nachricht vor der Übertragung bestimmt werden kann, es sei denn, dies ist durch die Regeln in Abschnitt 4.4 verboten.

Bozhidar Batsov
quelle
2

Das Feld Content-Length-Entity-Header gibt die Größe des Entity-Body in Dezimalzahlen der OCTETs an, die an den Empfänger gesendet wurden, oder im Fall der HEAD-Methode die Größe des Entity-Body, der gesendet worden wäre Die Anfrage war ein GET.

Content-Length = "Content-Length" ":" 1 * DIGIT

Ein Beispiel ist

Inhaltslänge: 1024

Anwendungen MÜSSEN dieses Feld verwenden, um die Übertragungslänge des Nachrichtentexts anzugeben.

In PHP würden Sie so etwas verwenden.

header("Content-Length: ".filesize($filename));

Im Fall von "Content-Type: application / x-www-form-urlencoded" werden die codierten Daten an den angegebenen Verarbeitungsagenten gesendet, damit Sie die Länge oder Größe der Daten festlegen können, die Sie veröffentlichen möchten.

Gaurav Jassal
quelle
0

Überlegen Sie, ob Sie Überschriften haben wie:

content-encoding: gzip
content-length: 52098
content-type: text/javascript; charset=UTF-8

Die Inhaltslänge ist die Größe des komprimierten Nachrichtentexts in "Oktetten" (dh in Einheiten von 8 Bits, die zufällig "Bytes" für alle modernen Computer sind).

Die Größe des tatsächlichen Nachrichtentexts kann etwas anderes sein, vielleicht 150280 Bytes.

Die Anzahl der Zeichen kann wieder unterschiedlich sein, möglicherweise 150231 Zeichen, da einige Unicode-Zeichen mehrere Bytes verwenden (Hinweis UTF-8 ist eine Standardcodierung).

Unterschiedliche Zahlen, je nachdem, ob es Ihnen wichtig ist, wie viele Daten übertragen werden, wie viele Daten gespeichert sind oder wie viele Symbole angezeigt werden. Natürlich gibt es keine Garantie dafür, dass diese Header bereitgestellt werden.

benjimin
quelle