3. Structured Data Types (Tipi di dati strutturati)
Questa sezione definisce i tipi astratti dei campi strutturati. L'ABNF fornita rappresenta il formato di trasmissione nei valori dei campi HTTP.
Panoramica
-
Ci sono tre tipi di livello superiore utilizzabili per definire campi HTTP: Lists (liste), Dictionaries (dizionari) e Items (elementi)
-
Lists e Dictionaries sono contenitori; i loro membri possono essere Items o Inner Lists (le Inner Lists sono esse stesse array di Items)
-
Sia Items che Inner Lists possono essere parametrizzati (Parameterized) con coppie chiave-valore
3.1 Lists (Liste)
Le Lists sono array contenenti zero o più membri, dove ogni membro può essere un Item (sezione 3.3) o una Inner List (sezione 3.1.1), entrambi possono essere parametrizzati (sezione 3.1.2).
Sintassi ABNF
sf-list = list-member *( OWS "," OWS list-member )
list-member = sf-item / inner-list
Descrizione del formato
Ogni membro è separato da una virgola e spazi bianchi opzionali.
Esempio
Example-List: sugar, tea, rum
Campo definito come lista di Token
Lista vuota
Una List vuota è rappresentata non serializzando affatto il campo. Ciò significa che i campi definiti come Lists hanno un valore vuoto per impostazione predefinita.
Suddivisione su più righe
I membri delle Lists possono essere suddivisi su più righe nella stessa sezione di intestazione o coda (secondo [RFC7230] sezione 3.2.2); ad esempio, i seguenti sono equivalenti:
Example-List: sugar, tea, rum
Equivalente a:
Example-List: sugar, tea
Example-List: rum
Nota: I singoli membri di una List non possono essere suddivisi in modo sicuro tra le righe; vedere la sezione 4.2 per i dettagli.
Requisiti di implementazione
I parser devono (MUST) supportare Lists contenenti almeno 1024 membri. Le specifiche dei campi possono vincolare i tipi e la cardinalità dei valori di List individuali secondo necessità.
3.1.1 Inner Lists (Liste interne)
Una Inner List è un array contenente zero o più Items (sezione 3.3). Sia gli Items individuali che l'Inner List stessa possono essere parametrizzati (sezione 3.1.2).
Sintassi ABNF
inner-list = "(" *SP [ sf-item *( 1*SP sf-item ) *SP ] ")"
parameters
Descrizione del formato
Le Inner Lists sono circondate da parentesi, i loro valori sono separati da uno o più spazi.
Esempio 1: Inner Lists semplici
Example-List: ("foo" "bar"), ("baz"), ("bat" "one"), ()
Campo definito come lista di liste interne di Strings. Si noti che l'ultimo membro è una Inner List vuota.
Esempio 2: Inner Lists con parametri
Example-List: ("foo"; a=1;b=2);lvl=5, ("bar" "baz");lvl=1
Campo definito come lista di liste interne con parametri (aventi parametri a due livelli).
Requisiti di implementazione
I parser devono (MUST) supportare Inner Lists contenenti almeno 256 membri. Le specifiche dei campi possono vincolare i tipi e la cardinalità dei membri di Inner List individuali secondo necessità.
3.1.2 Parameters (Parametri)
I Parameters sono una mappatura ordinata di coppie chiave-valore associate a un Item (sezione 3.3) o a una Inner List (sezione 3.1.1). Le chiavi sono univoche nell'ambito dei Parameters in cui appaiono, e i valori sono elementi nudi (bare items) (cioè non possono essere essi stessi parametrizzati; vedere sezione 3.3).
Le implementazioni devono (MUST) fornire accesso ai Parameters sia per indice che per chiave. Le specifiche possono (MAY) utilizzare uno dei due metodi di accesso.
Sintassi ABNF
parameters = *( ";" *SP parameter )
parameter = param-key [ "=" param-value ]
param-key = key
key = ( lcalpha / "*" )
*( lcalpha / DIGIT / "_" / "-" / "." / "*" )
lcalpha = %x61-7A ; a-z
param-value = bare-item
Descrizione del formato
- I parametri sono ordinati nell'ordine di serializzazione
- Le chiavi dei parametri non possono contenere lettere maiuscole
- I parametri sono separati dal loro Item o Inner List e dagli altri parametri da punti e virgola
Esempio
Example-List: abc;a=1;b=2; cde_456, (ghi;jk=4 l);q="9";r=w
Regola speciale per i parametri Boolean
I parametri con un valore Boolean (vedere sezione 3.3.6) true devono (MUST) omettere quel valore durante la serializzazione.
Esempio:
Example-Integer: 1; a; b=?0
Qui, il parametro a è true, mentre il parametro b è false.
Nota: Questo requisito si applica solo alla serializzazione; i parser devono comunque gestire correttamente i valori true che appaiono nei parametri.
Requisiti di implementazione
Le implementazioni devono (MUST) supportare elenchi di parametri con almeno 256 parametri. Le specifiche dei campi possono vincolare la cardinalità dei Parameters individuali secondo necessità.
3.2 Dictionaries (Dizionari)
I Dictionaries sono mappature ordinate di membri denominati, dove il nome di ogni membro è una chiave e il valore è un Item (sezione 3.3) o un array di Inner Lists (sezione 3.1.1). Entrambi possono essere parametrizzati (sezione 3.1.2).
Sintassi ABNF
sf-dictionary = dict-member *( OWS "," OWS dict-member )
dict-member = member-key ( parameters / ( "=" member-value ))
member-key = key
member-value = sf-item / inner-list
Descrizione del formato
- I membri sono separati da virgole e spazi bianchi opzionali
- I nomi dei membri devono essere univoci all'interno di quel Dictionary
- Se vengono parsati nomi di membri duplicati, viene utilizzato solo l'ultimo
Esempio
Example-Dict: en="Applepie", da=:w4ZibGV0w6ZydGU=:
Campo definito come Dictionary con valori Strings e Byte Sequences.
Regola speciale per i valori Boolean
I membri di Dictionary con un valore Boolean true (sezione 3.3.6) sono serializzati omettendo il "=" e il suo valore.
Esempio:
Example-Dict: a=?0, b, c; foo=bar
Qui, il valore di b è Boolean true, e il valore di c è anch'esso Boolean true con un parametro foo.
Requisiti di implementazione
I parser devono (MUST) supportare Dictionaries contenenti almeno 1024 membri. Le specifiche dei campi possono vincolare i tipi e la cardinalità dei valori di Dictionary individuali secondo necessità.
3.3 Items (Elementi)
Un Item è composto da un elemento nudo (bare item, sezioni 3.3.1 a 3.3.6) e parametri opzionali (sezione 3.1.2).
Sintassi ABNF
sf-item = bare-item parameters
bare-item = sf-integer / sf-decimal / sf-string / sf-token
/ sf-binary / sf-boolean
3.3.1 Integers (Interi)
Gli Integers sono numeri con un intervallo da -999,999,999,999,999 a 999,999,999,999,999 (inclusi).
Sintassi ABNF
sf-integer = ["-"] 1*15DIGIT
Esempi
Example-Integer: 42
Example-Integer: -42
Example-Integer: 0
Requisiti di implementazione
Le implementazioni devono (MUST) supportare tutti gli Integers nell'intervallo specificato.
3.3.2 Decimals (Decimali)
I Decimals sono numeri con fino a 3 cifre significative a destra del punto decimale.
Sintassi ABNF
sf-decimal = ["-"] 1*12DIGIT "." 1*3DIGIT
Esempi
Example-Decimal: 4.5
Example-Decimal: -4.5
Example-Decimal: 123.456
Requisiti di implementazione
- A sinistra del punto decimale: massimo 12 cifre significative
- A destra del punto decimale: massimo 3 cifre significative
3.3.3 Strings (Stringhe)
Le Strings sono sequenze di caratteri ASCII stampabili (VCHAR, SP).
Sintassi ABNF
sf-string = DQUOTE *( %x20-21 / %x23-5B / %x5D-7E / "\" ( DQUOTE / "\" )) DQUOTE
Escape
- Solo il backslash (
\) e le virgolette doppie (") possono essere escape - Un backslash dopo questi altri caratteri deve causare un fallimento del parsing
Esempi
Example-String: "hello world"
Example-String: "say \"hi\""
Requisiti di implementazione
I parser devono (MUST) supportare Strings di almeno 1024 caratteri (dopo la decodifica).
3.3.4 Tokens (Token)
I Tokens sono brevi parole testuali. Il loro modello astratto è identico alla loro rappresentazione nella serializzazione del valore del campo HTTP.
Sintassi ABNF
sf-token = ( ALPHA / "*" ) *( tchar / ":" / "/" )
Esempi
Example-Token: foo123/456
Example-Token: *
Requisiti di implementazione
I parser devono (MUST) supportare Tokens di almeno 512 caratteri.
3.3.5 Byte Sequences (Sequenze di byte)
Le Byte Sequences possono essere trasmesse in campi strutturati.
Sintassi ABNF
sf-binary = ":" *(base64) ":"
base64 = ALPHA / DIGIT / "+" / "/" / "="
Esempio
Example-ByteSequence: :cHJldGVuZCB0aGlzIGlzIGJpbmFyeSBjb250ZW50Lg==:
Requisiti di implementazione
I parser devono (MUST) supportare Byte Sequences di almeno 16384 ottetti dopo la decodifica.
3.3.6 Booleans (Booleani)
I valori Boolean possono essere trasmessi in campi strutturati.
Sintassi ABNF
sf-boolean = "?" boolean
boolean = "0" / "1"
Esempi
Example-Boolean: ?1
Example-Boolean: ?0
Descrizione del formato
- I Booleans sono indicati da un carattere "?" iniziale
- "1" indica true
- "0" indica false
Comportamento speciale in Dictionary e Parameters
Nei valori Dictionary (sezione 3.2) e Parameter (sezione 3.1.2), Boolean true è indicato omettendo il valore.
Riepilogo dei tipi di dati
| Tipo | Intervallo/Formato | Esempio |
|---|---|---|
| Integer | -999,999,999,999,999 a 999,999,999,999,999 | 42, -100 |
| Decimal | 12 cifre intere, 3 cifre decimali | 4.5, -0.123 |
| String | Caratteri ASCII stampabili, max 1024 caratteri | "hello world" |
| Token | Alfanumerico e simboli, max 512 caratteri | foo123/456 |
| Byte Sequence | Codifica Base64, max 16384 ottetti | :SGVsbG8=: |
| Boolean | true/false | ?1, ?0 |