Passa al contenuto principale

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​

TipoIntervallo/FormatoEsempio
Integer-999,999,999,999,999 a 999,999,999,999,99942, -100
Decimal12 cifre intere, 3 cifre decimali4.5, -0.123
StringCaratteri ASCII stampabili, max 1024 caratteri"hello world"
TokenAlfanumerico e simboli, max 512 caratterifoo123/456
Byte SequenceCodifica Base64, max 16384 ottetti:SGVsbG8=:
Booleantrue/false?1, ?0