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
| Typ | Bereich/Format | Beispiel |
|---|---|---|
| Integer | -999,999,999,999,999 bis 999,999,999,999,999 | 42, -100 |
| Decimal | 12 Ganzzahlziffern, 3 Dezimalziffern | 4.5, -0.123 |
| String | Druckbare ASCII-Zeichen, max 1024 Zeichen | "hello world" |
| Token | Alphanumerisch und Symbole, max 512 Zeichen | foo123/456 |
| Byte Sequence | Base64-Kodierung, max 16384 Oktette | :SGVsbG8=: |
| Boolean | true/false | ?1, ?0 |