Questa sezione spiega come i payload dei metodi del servizio vengono mappati agli endpoint HTTP usando il DSL del trasporto HTTP. I tipi di payload definiscono la forma dei dati passati come argomenti ai metodi del servizio, mentre le espressioni HTTP specificano come costruire questi dati da varie parti di una richiesta HTTP in arrivo.
Una richiesta HTTP è composta da quattro parti:
Parametri del Percorso URL
Per esempio, nel percorso /bottle/{id}
, {id}
è un parametro del percorso.
Parametri della Stringa di Query URL
Header HTTP
Body della Richiesta HTTP
Le espressioni HTTP guidano come il codice generato decodifica la richiesta nel payload atteso:
Param
: Carica valori da parametri del percorso o della stringa di query.Header
: Carica valori dagli header HTTP.Body
: Carica valori dal body della richiesta.Le sezioni successive descrivono queste espressioni in dettaglio.
Quando il tipo di payload è un primitivo (es. String
, tipi interi, Float
,
Boolean
, o Bytes
), un array, o una mappa, il valore viene caricato dal primo
elemento definito nel seguente ordine:
Method("show", func() {
Payload(Int)
HTTP(func() {
GET("/{id}")
})
})
Metodo generato | Richiesta di esempio | Chiamata corrispondente |
---|---|---|
Show(int) | GET /1 | Show(1) |
Method("delete", func() {
Payload(ArrayOf(String))
HTTP(func() {
DELETE("/{ids}")
})
})
Metodo generato | Richiesta di esempio | Chiamata corrispondente |
---|---|---|
Delete([]string) | DELETE /a,b | Delete([]string{"a", "b"}) |
Nota: Il nome effettivo del parametro del percorso non è significativo.
Method("list", func() {
Payload(ArrayOf(String))
HTTP(func() {
GET("")
Param("filter")
})
})
Metodo generato | Richiesta di esempio | Chiamata corrispondente |
---|---|---|
List([]string) | GET /?filter=a&filter=b | List([]string{"a", "b"}) |
Method("list", func() {
Payload(Float32)
HTTP(func() {
GET("")
Header("version")
})
})
Metodo generato | Richiesta di esempio | Chiamata corrispondente |
---|---|---|
List(float32) | GET / con header version=1.0 | List(1.0) |
Method("create", func() {
Payload(MapOf(String, Int))
HTTP(func() {
POST("")
})
})
Metodo generato | Richiesta di esempio | Chiamata corrispondente |
---|---|---|
Create(map[string]int) | POST / {"a": 1, "b": 2} | Create(map[string]int{"a": 1, "b": 2}) |
Per payload definiti come oggetti (con attributi multipli), le espressioni HTTP permettono di specificare da dove viene caricato ciascun attributo. Alcuni attributi possono provenire dal percorso URL, altri da parametri di query, header, o il body. Le stesse restrizioni di tipo si applicano:
Body
L’espressione Body
specifica quale attributo del payload corrisponde al body
della richiesta HTTP. Se ometti l’espressione Body
, qualsiasi attributo non mappato a un
percorso, query, o header viene automaticamente assunto provenire dal body.
Dato il payload:
Method("create", func() {
Payload(func() {
Attribute("id", Int)
Attribute("name", String)
Attribute("age", Int)
})
})
La seguente espressione HTTP mappa l’attributo id
a un parametro del percorso e i rimanenti attributi al body della richiesta:
Method("create", func() {
Payload(func() {
Attribute("id", Int)
Attribute("name", String)
Attribute("age", Int)
})
HTTP(func() {
POST("/{id}")
})
})
Metodo generato | Richiesta di esempio | Chiamata corrispondente |
---|---|---|
Create(*CreatePayload) | POST /1 {"name": "a", "age": 2} | Create(&CreatePayload{ID: 1, Name: "a", Age: 2}) |
Body
per Tipi Non-OggettoL’espressione Body
supporta anche casi in cui il body della richiesta non è un oggetto (per esempio, un array o una mappa).
Considera il seguente payload:
Method("rate", func() {
Payload(func() {
Attribute("id", Int)
Attribute("rates", MapOf(String, Float64))
})
})
Usando l’espressione HTTP sotto, l’attributo rates
viene caricato direttamente dal body:
Method("rate", func() {
Payload(func() {
Attribute("id", Int)
Attribute("rates", MapOf(String, Float64))
})
HTTP(func() {
PUT("/{id}")
Body("rates")
})
})
Metodo generato | Richiesta di esempio | Chiamata corrispondente |
---|---|---|
Rate(*RatePayload) | PUT /1 {"a": 0.5, "b": 1.0} | Rate(&RatePayload{ID: 1, Rates: map[string]float64{"a": 0.5, "b": 1.0}}) |
Senza l’espressione Body
, il body della richiesta verrebbe interpretato come un oggetto con un singolo campo chiamato rates
.
Le espressioni Param
, Header
, e Body
permettono di mappare i nomi
degli elementi HTTP (es., chiavi della stringa di query, nomi degli header, o nomi dei campi del body) ai nomi
degli attributi del payload. La sintassi di mappatura è:
"nome attributo:nome elemento"
Per esempio:
Header("version:X-Api-Version")
In questo caso, l’attributo version
verrà caricato dall’header HTTP X-Api-Version
.
L’espressione Body
supporta anche una sintassi alternativa che elenca esplicitamente
gli attributi del body e i loro corrispondenti nomi di campo HTTP. Questo è utile per
specificare una mappatura tra nomi di campo in arrivo e nomi di attributi del payload.