Questa pagina spiega quali combinazioni di trasporto un servizio Goa e i suoi metodi possono esporre e quali modalità di streaming sono valide per ogni trasporto. L’obiettivo è fornire a nuovi utenti ed esperti un riferimento unico e autorevole su cosa significhi “mescolare i trasporti” in Goa e quali combinazioni sono consentite o vietate.
Contenuti:
Result
sia StreamingResult
con
tipi diversi. Abilita la negoziazione tra una risposta normale e una risposta
in streaming (supportata solo da SSE).Nella tabella seguente, “sì” indica che i trasporti possono coesistere nello stesso servizio Goa. Le note spiegano i vincoli.
Trasporto nello stesso servizio | Con HTTP (plain) | Con HTTP (WS) | Con HTTP (SSE) | Con JSON‑RPC (HTTP) | Con JSON‑RPC (WS) | Con JSON‑RPC (SSE) | Con gRPC |
---|---|---|---|---|---|---|---|
HTTP (plain) | — | sì | sì | sì | no [S2] | sì | sì |
HTTP (WebSocket) | sì | — | sì | sì | no [S2] | sì | sì |
HTTP (SSE) | sì | sì | — | sì | no [S2] | sì | sì |
JSON‑RPC (HTTP) | sì | sì | sì | — | no [S1] | sì | sì |
JSON‑RPC (WebSocket) | no [S2] | no [S2] | no [S2] | no [S1] | — | no [S1] | sì |
JSON‑RPC (SSE) | sì | sì | sì | sì | no [S1] | — | sì |
gRPC | sì | sì | sì | sì | sì | sì | — |
Note:
Comportamenti a livello servizio:
Accept
(es. text/event-stream
vs.
application/json
).Nella tabella seguente, “sì” indica che la modalità è valida per un metodo su
quel trasporto. “sì (misti)” è valido se il metodo usa risultati misti (tipi
Result
e StreamingResult
diversi) e l’endpoint abilita SSE. “no” è vietato.
Trasporto | Nessuno | Client‑stream | Server‑stream | Bidirezionale |
---|---|---|---|---|
HTTP (plain) | sì | no | sì (misti) [M1] | no |
HTTP (SSE) | sì (misti) [M2] | no | sì [M3] | no |
HTTP (WebSocket) | no | sì [M4] | sì [M4] | sì [M4] |
JSON‑RPC (HTTP) | sì | no | sì (misti) [M1,M5] | no |
JSON‑RPC (SSE) | sì (misti) [M2,M5] | no | sì [M6] | no |
JSON‑RPC (WebSocket) | no | sì [M7] | sì [M8] | sì [M7] |
gRPC | sì | sì | sì | sì |
Note:
StreamingPayload
. Si usa per negoziare tra risposta normale e flusso SSE.Accept
.id
di SSE
mappa l’attributo ID del risultato.Payload
e non
anche in StreamingPayload
.WebSocket:
StreamingPayload()
(notifiche client‑to‑server).StreamingResult()
(notifiche server‑to‑client, senza id
).HTTP e SSE:
Accept
.Gestione degli ID:
id
della richiesta nel campo ID del
risultato se non impostato dall’utente.id
originale; le
notifiche server‑initiated non hanno id
.SendAndClose
invia una risposta JSON‑RPC; l’id
è l’ID del
risultato se presente, altrimenti l’id
della richiesta.gRPC non impone vincoli aggiuntivi rispetto a HTTP/JSON‑RPC in Goa. Unario, client streaming, server streaming e bidirezionale sono tutti supportati e combinabili liberamente con gli altri trasporti.
expr/method.go
: helper sul tipo di stream; rilevamento risultati misti.dsl/payload.go
, dsl/result.go
: come StreamingPayload
/StreamingResult
impostano il tipo di stream.expr/http_endpoint.go
: vincoli SSE; requisiti risultati misti; validazioni
WS HTTP puro; validazioni endpoint JSON‑RPC.expr/http_service.go
: regole di mixing JSON‑RPC; conflitto JSON‑RPC WS vs.
HTTP WS; preparazione route JSON‑RPC e metodi (GET per WS, POST altrimenti).dsl/jsonrpc.go
, jsonrpc/README.md
: comportamento trasporti JSON‑RPC
(batching, notifiche, semantica WS/SSE), inclusi “WS richiede streaming” e
“HTTP+SSE content negotiation”.