Zum Hauptinhalt springen

3. Structured Data Types (Strukturierte Datentypen)

Dieser Abschnitt definiert die abstrakten Typen von strukturierten Feldern. Die bereitgestellte ABNF stellt das Übertragungsformat in HTTP-Feldwerten dar.

Überblick​

  • Es gibt drei Typen der obersten Ebene, die zur Definition von HTTP-Feldern verwendet werden können: Lists (Listen), Dictionaries (Wörterbücher) und Items (Elemente)

  • Lists und Dictionaries sind Container; ihre Mitglieder können Items oder Inner Lists sein (Inner Lists sind selbst Arrays von Items)

  • Sowohl Items als auch Inner Lists können mit Schlüssel-Wert-Paaren parametrisiert (Parameterized) werden


3.1 Lists (Listen)​

Lists sind Arrays, die null oder mehr Mitglieder enthalten, wobei jedes Mitglied ein Item (Abschnitt 3.3) oder eine Inner List (Abschnitt 3.1.1) sein kann, beide können parametrisiert werden (Abschnitt 3.1.2).

ABNF-Syntax​

sf-list       = list-member *( OWS "," OWS list-member )
list-member = sf-item / inner-list

Formatbeschreibung​

Jedes Mitglied ist durch ein Komma und optionale Leerzeichen getrennt.

Beispiel​

Example-List: sugar, tea, rum

Als Token-Liste definiertes Feld

Leere Liste​

Eine leere List wird dargestellt, indem das Feld überhaupt nicht serialisiert wird. Dies bedeutet, dass als Lists definierte Felder standardmäßig einen leeren Wert haben.

Mehrzeilige Aufteilung​

Die Mitglieder von Lists können über mehrere Zeilen im selben Header- oder Trailer-Abschnitt aufgeteilt werden (gemäß [RFC7230] Abschnitt 3.2.2); zum Beispiel sind die folgenden äquivalent:

Example-List: sugar, tea, rum

Äquivalent zu:

Example-List: sugar, tea
Example-List: rum

Hinweis: Einzelne Mitglieder einer List können nicht sicher zwischen Zeilen aufgeteilt werden; siehe Abschnitt 4.2 für Details.

Implementierungsanforderungen​

Parser müssen (MUST) Lists unterstützen, die mindestens 1024 Mitglieder enthalten. Feldspezifikationen können die Typen und die Kardinalität einzelner List-Werte nach Bedarf einschränken.


3.1.1 Inner Lists (Innere Listen)​

Eine Inner List ist ein Array, das null oder mehr Items (Abschnitt 3.3) enthält. Sowohl einzelne Items als auch die Inner List selbst können parametrisiert werden (Abschnitt 3.1.2).

ABNF-Syntax​

inner-list    = "(" *SP [ sf-item *( 1*SP sf-item ) *SP ] ")"
parameters

Formatbeschreibung​

Inner Lists sind von Klammern umgeben, ihre Werte sind durch ein oder mehrere Leerzeichen getrennt.

Beispiel 1: Einfache Inner Lists​

Example-List: ("foo" "bar"), ("baz"), ("bat" "one"), ()

Als Liste von inneren Listen von Strings definiertes Feld. Beachten Sie, dass das letzte Mitglied eine leere Inner List ist.

Beispiel 2: Inner Lists mit Parametern​

Example-List: ("foo"; a=1;b=2);lvl=5, ("bar" "baz");lvl=1

Als Liste von inneren Listen mit Parametern definiertes Feld (mit Parametern auf zwei Ebenen).

Implementierungsanforderungen​

Parser müssen (MUST) Inner Lists unterstützen, die mindestens 256 Mitglieder enthalten. Feldspezifikationen können die Typen und die Kardinalität einzelner Inner List-Mitglieder nach Bedarf einschränken.


3.1.2 Parameters (Parameter)​

Parameters sind eine geordnete Zuordnung von Schlüssel-Wert-Paaren, die mit einem Item (Abschnitt 3.3) oder einer Inner List (Abschnitt 3.1.1) verknüpft sind. Schlüssel sind im Geltungsbereich der Parameters, in denen sie erscheinen, eindeutig, und Werte sind nackte Elemente (bare items) (d.h. sie können selbst nicht parametrisiert werden; siehe Abschnitt 3.3).

Implementierungen müssen (MUST) Zugriff auf Parameters sowohl per Index als auch per Schlüssel bereitstellen. Spezifikationen können (MAY) eine der beiden Zugriffsmethoden verwenden.

ABNF-Syntax​

parameters    = *( ";" *SP parameter )
parameter = param-key [ "=" param-value ]
param-key = key
key = ( lcalpha / "*" )
*( lcalpha / DIGIT / "_" / "-" / "." / "*" )
lcalpha = %x61-7A ; a-z
param-value = bare-item

Formatbeschreibung​

  • Parameter sind in Serialisierungsreihenfolge angeordnet
  • Parameterschlüssel können keine Großbuchstaben enthalten
  • Parameter sind durch Semikolons von ihrem Item oder Inner List und anderen Parametern getrennt

Beispiel​

Example-List: abc;a=1;b=2; cde_456, (ghi;jk=4 l);q="9";r=w

Spezielle Regel für Boolean-Parameter​

Parameter mit einem Boolean-Wert (siehe Abschnitt 3.3.6) true müssen (MUST) diesen Wert bei der Serialisierung weglassen.

Beispiel:

Example-Integer: 1; a; b=?0

Hier ist der Parameter a true, während der Parameter b false ist.

Hinweis: Diese Anforderung gilt nur für die Serialisierung; Parser müssen true-Werte, die in Parametern erscheinen, weiterhin korrekt verarbeiten.

Implementierungsanforderungen​

Implementierungen müssen (MUST) Parameterlisten mit mindestens 256 Parametern unterstützen. Feldspezifikationen können die Kardinalität einzelner Parameters nach Bedarf einschränken.


3.2 Dictionaries (Wörterbücher)​

Dictionaries sind geordnete Zuordnungen benannter Mitglieder, wobei der Name jedes Mitglieds ein Schlüssel ist und der Wert entweder ein Item (Abschnitt 3.3) oder ein Array von Inner Lists (Abschnitt 3.1.1) ist. Beide können parametrisiert werden (Abschnitt 3.1.2).

ABNF-Syntax​

sf-dictionary  = dict-member *( OWS "," OWS dict-member )
dict-member = member-key ( parameters / ( "=" member-value ))
member-key = key
member-value = sf-item / inner-list

Formatbeschreibung​

  • Mitglieder sind durch Kommas und optionale Leerzeichen getrennt
  • Mitgliedsnamen müssen innerhalb dieses Dictionary eindeutig sein
  • Wenn doppelte Mitgliedsnamen geparst werden, wird nur der letzte verwendet

Beispiel​

Example-Dict: en="Applepie", da=:w4ZibGV0w6ZydGU=:

Als Dictionary mit Strings- und Byte-Sequence-Werten definiertes Feld.

Spezielle Regel für Boolean-Werte​

Dictionary-Mitglieder mit einem Boolean-true-Wert (Abschnitt 3.3.6) werden serialisiert, indem das "=" und sein Wert weggelassen werden.

Beispiel:

Example-Dict: a=?0, b, c; foo=bar

Hier ist der Wert von b Boolean true, und der Wert von c ist ebenfalls Boolean true mit einem Parameter foo.

Implementierungsanforderungen​

Parser müssen (MUST) Dictionaries unterstützen, die mindestens 1024 Mitglieder enthalten. Feldspezifikationen können die Typen und die Kardinalität einzelner Dictionary-Werte nach Bedarf einschränken.


3.3 Items (Elemente)​

Ein Item besteht aus einem nackten Element (bare item, Abschnitte 3.3.1 bis 3.3.6) und optionalen Parametern (Abschnitt 3.1.2).

ABNF-Syntax​

sf-item    = bare-item parameters
bare-item = sf-integer / sf-decimal / sf-string / sf-token
/ sf-binary / sf-boolean

3.3.1 Integers (Ganzzahlen)​

Integers sind Zahlen mit einem Bereich von -999,999,999,999,999 bis 999,999,999,999,999 (einschließlich).

ABNF-Syntax​

sf-integer = ["-"] 1*15DIGIT

Beispiele​

Example-Integer: 42
Example-Integer: -42
Example-Integer: 0

Implementierungsanforderungen​

Implementierungen müssen (MUST) alle Integers im angegebenen Bereich unterstützen.


3.3.2 Decimals (Dezimalzahlen)​

Decimals sind Zahlen mit bis zu 3 signifikanten Ziffern rechts vom Dezimalpunkt.

ABNF-Syntax​

sf-decimal  = ["-"] 1*12DIGIT "." 1*3DIGIT

Beispiele​

Example-Decimal: 4.5
Example-Decimal: -4.5
Example-Decimal: 123.456

Implementierungsanforderungen​

  • Links vom Dezimalpunkt: maximal 12 signifikante Ziffern
  • Rechts vom Dezimalpunkt: maximal 3 signifikante Ziffern

3.3.3 Strings (Zeichenketten)​

Strings sind Sequenzen druckbarer ASCII-Zeichen (VCHAR, SP).

ABNF-Syntax​

sf-string = DQUOTE *( %x20-21 / %x23-5B / %x5D-7E / "\" ( DQUOTE / "\" )) DQUOTE

Escape-Zeichen​

  • Nur Backslash (\) und doppelte Anführungszeichen (") können escaped werden
  • Ein Backslash nach diesen anderen Zeichen muss zu einem Parse-Fehler führen

Beispiele​

Example-String: "hello world"
Example-String: "say \"hi\""

Implementierungsanforderungen​

Parser müssen (MUST) Strings von mindestens 1024 Zeichen (nach Dekodierung) unterstützen.


3.3.4 Tokens (Token)​

Tokens sind kurze Textwörter. Ihr abstraktes Modell ist identisch mit ihrer Darstellung in der HTTP-Feldwert-Serialisierung.

ABNF-Syntax​

sf-token = ( ALPHA / "*" ) *( tchar / ":" / "/" )

Beispiele​

Example-Token: foo123/456
Example-Token: *

Implementierungsanforderungen​

Parser müssen (MUST) Tokens von mindestens 512 Zeichen unterstützen.


3.3.5 Byte Sequences (Byte-Sequenzen)​

Byte Sequences können in strukturierten Feldern übertragen werden.

ABNF-Syntax​

sf-binary = ":" *(base64) ":"
base64 = ALPHA / DIGIT / "+" / "/" / "="

Beispiel​

Example-ByteSequence: :cHJldGVuZCB0aGlzIGlzIGJpbmFyeSBjb250ZW50Lg==:

Implementierungsanforderungen​

Parser müssen (MUST) Byte Sequences von mindestens 16384 Oktetten nach Dekodierung unterstützen.


3.3.6 Booleans (Boolesche Werte)​

Boolesche Werte können in strukturierten Feldern übertragen werden.

ABNF-Syntax​

sf-boolean = "?" boolean
boolean = "0" / "1"

Beispiele​

Example-Boolean: ?1
Example-Boolean: ?0

Formatbeschreibung​

  • Booleans werden durch ein führendes "?"-Zeichen angezeigt
  • "1" zeigt true an
  • "0" zeigt false an

Spezielles Verhalten in Dictionary und Parameters​

In Dictionary (Abschnitt 3.2) und Parameter (Abschnitt 3.1.2) Werten wird Boolean true durch Weglassen des Werts angezeigt.


Zusammenfassung der Datentypen​

TypBereich/FormatBeispiel
Integer-999,999,999,999,999 bis 999,999,999,999,99942, -100
Decimal12 Ganzzahlziffern, 3 Dezimalziffern4.5, -0.123
StringDruckbare ASCII-Zeichen, max 1024 Zeichen"hello world"
TokenAlphanumerisch und Symbole, max 512 Zeichenfoo123/456
Byte SequenceBase64-Kodierung, max 16384 Oktette:SGVsbG8=:
Booleantrue/false?1, ?0