Un attivatore https.onCall
per Cloud Functions è un attivatore HTTPS con un formato specifico per la richiesta e la risposta. Questa sezione fornisce una specifica per i formati di richiesta e risposta HTTPS utilizzati dagli SDK client per implementare l'API. Queste informazioni possono esserti utili se i tuoi requisiti
non possono essere soddisfatti utilizzando le piattaforme Android, Apple o gli SDK web.
Formato della richiesta: intestazioni
La richiesta HTTP a un endpoint di trigger chiamabile deve essere un POST
con le seguenti intestazioni:
- Obbligatorio:
Content-Type: application/json
- È consentito un
; charset=utf-8
facoltativo.
- È consentito un
- (Facoltativo)
Authorization: Bearer <token>
- Un token ID utente Firebase Authentication per l'utente che ha eseguito l'accesso e che effettua la richiesta. Il backend verifica automaticamente questo token e lo rende disponibile in
context
dell'handler. Se il token non è valido, la richiesta viene rifiutata.
- Un token ID utente Firebase Authentication per l'utente che ha eseguito l'accesso e che effettua la richiesta. Il backend verifica automaticamente questo token e lo rende disponibile in
- (Facoltativo)
Firebase-Instance-ID-Token: <iid>
- Il token di registrazione FCM dell'SDK del client Firebase. Deve essere una stringa. Questa opzione è disponibile in
context
dell'handler. È utilizzato per il targeting delle notifiche push.
- Il token di registrazione FCM dell'SDK del client Firebase. Deve essere una stringa. Questa opzione è disponibile in
- Facoltativo:
X-Firebase-AppCheck: <token>
- Il token Firebase App Check fornito dall'app del cliente che effettua la
richiesta. Il backend verifica automaticamente questo token e lo decodifica,
iniettando
appId
incontext
dell'handler. Se il token non può essere verificata, la richiesta viene rifiutata. (Disponibile per SDK >=3.14.0)
- Il token Firebase App Check fornito dall'app del cliente che effettua la
richiesta. Il backend verifica automaticamente questo token e lo decodifica,
iniettando
Se sono incluse altre intestazioni, la richiesta viene rifiutata, come descritto nella documentazione di risposta riportata di seguito.
Nota: nei client JavaScript, queste richieste attivano un preflight OPTIONS
CORS, perché:
- Non consentito:
application/json
. Deve esseretext/plain
oapplication/x-www-form-urlencoded
. - L'intestazione
Authorization
non è un'intestazione richiesta nell'elenco degli utenti sicuri CORS. - Analogamente, non sono consentite altre intestazioni.
Il trigger richiamabile gestisce automaticamente queste richieste OPTIONS
.
Corpo della richiesta
Il corpo della richiesta HTTP deve essere un oggetto JSON con uno dei seguenti campi:
- Obbligatorio:
data
. L'argomento passato alla funzione. Può essere qualsiasi valore JSON valido. Viene decodificato automaticamente in tipi JavaScript nativi in base al formato di serializzazione descritto di seguito.
Se nella richiesta sono presenti altri campi, il backend la considera non formattata e la rifiuta.
Formato della risposta: codici di stato
Esistono diversi casi che potrebbero comportare diversi codici di stato HTTP e codici di stato delle stringhe per gli errori nella risposta.
Nel caso di un errore HTTP prima di richiamare il trigger
client
, la risposta non viene gestita come una funzione client. Ad esempio, se un client cerca di richiamare una funzione inesistente, riceve una risposta404 Not Found
.Se il trigger del client viene richiamato, ma la richiesta è nel formato errato, ad esempio non è JSON, presenta campi non validi o manca il campo
data
, la richiesta viene rifiutata con400 Bad Request
, con un codice di erroreINVALID_ARGUMENT
.Se il token di autenticazione fornito nella richiesta non è valido, la richiesta viene rifiutata con
401 Unauthorized
, con un codice di erroreUNAUTHENTICATED
.Se il token di registrazione FCM fornito nella richiesta non è valido, il comportamento non è definito. Il token non viene controllato in ogni richiesta, tranne quando viene utilizzato per inviare una notifica push con FCM.
Se il trigger richiamabile viene richiamato, ma non va a buon fine con un'eccezione non gestita o restituisce una promessa non riuscita, la richiesta viene rifiutata e viene restituito
500 Internal Server Error
, con un codice di erroreINTERNAL
. In questo modo si evita che gli errori di programmazione vengano esposti accidentalmente agli utenti finali.Se la funzione richiamabile viene richiamata e restituisce una condizione di errore esplicita utilizzando l'API fornita per le funzioni richiamabili, la richiesta non va a buon fine. Il codice di stato HTTP restituito si basa sulla mappatura ufficiale dello stato di errore allo stato HTTP, come definito in code.proto. Il codice di errore, il messaggio e i dettagli specifici restituiti sono codificati nel corpo della risposta come descritto di seguito. Ciò significa che se la funzione restituisce un errore esplicito con lo stato
OK
, la risposta avrà lo stato200 OK
, ma il campoerror
è impostato nella risposta.Se l'attivatore del client ha esito positivo, lo stato della risposta è
200 OK
.
Formato della risposta: intestazioni
La risposta ha le seguenti intestazioni:
Content-Type: application/json
- È consentito un
; charset=utf-8
facoltativo.
Corpo della risposta
La risposta di un endpoint client è sempre un oggetto JSON. Contiene almeno result
o error
, insieme a eventuali campi facoltativi. Se
la risposta non è un oggetto JSON o non contiene data
o error
,
l'SDK del client deve considerare la richiesta come non riuscita
con il codice di errore Google INTERNAL (13)
.
error
: se questo campo è presente, la richiesta viene considerata non riuscita, indipendentemente dal codice di stato HTTP o dal fatto che sia presente anchedata
. Il valore di questo campo deve essere un oggetto JSON nel formato standard Google Cloud HTTP Mapping per gli errori, con i campi perstatus
,message
e (facoltativamente)details
. Il campocode
non deve essere incluso. Se il campostatus
non viene configurato o se è un valore non valido, il cliente deve considerare lo statoINTERNAL
, in conformità con code.proto. Se è presentedetails
, viene incluso in tutte le informazioni utente allegate all'errore nell'SDK del client, se applicabile.
Nota: il campodetails
qui è un valore fornito dall'utente. Non si tratta necessariamente di un elenco di valori associati al tipo di protocollo, come nel formatoStatus
di Google.result
: il valore restituito dalla funzione. Può essere qualsiasi valore JSON valido. L'SDK firebase-functions codifica automaticamente il valore restituito dall'utente in questo formato JSON. Gli SDK client decodificano automaticamente questi parametri in tipi nativi in base al formato di serializzazione descritto di seguito.
Se sono presenti altri campi, devono essere ignorati.
Serializzazione
Il formato di serializzazione per i payload di dati arbitrari è lo stesso sia per la richiesta che per la risposta.
Per la coerenza della piattaforma, questi valori vengono codificati in JSON come se fossero il valore di un campo Any
in un buffer del protocollo proto3, utilizzando la mappatura JSON standard. I valori di tipi semplici come null
, int
, double
o string
vengono codificati direttamente e non includono il tipo esplicito. Pertanto, float
e double
sono codificati allo stesso modo e potresti non sapere quale viene ricevuto all'altro capo della chiamata. Per i tipi non nativi di JSON, viene utilizzata la codifica proto3 digitata per il valore. Per ulteriori informazioni, consulta la documentazione relativa alla codifica con qualsiasi formato JSON.
Sono consentiti i seguenti tipi:
- null -
null
- int (firmato o non firmato, fino a 32 bit), ad esempio
3
o-30
. - float, ad es.
3.14
- Doppio: ad es.
3.14
- booleano:
true
ofalse
- stringa: ad es.
"hello world"
- mappa<string, any=""> ad es.
{"x": 3}
</string,> - list
, ad es. [1, 2, 3]
- lunga (con o senza firma, fino a 64 bit) [vedi sotto per i dettagli]
I valori NaN
e Infinity
per float
e double
non sono supportati.
Tieni presente che long
è un tipo speciale non normalmente consentito in JSON, ma è coperto dalla specifica proto3. Ad esempio, vengono codificati come:
Lungo
{
'@type': 'type.googleapis.com/google.protobuf.Int64Value',
'value': '-123456789123456'
}
senza contratto
{
'@type': 'type.googleapis.com/google.protobuf.UInt64Value',
'value': '123456789123456'
}
In generale, la chiave @type
deve essere considerata riservata e non deve essere utilizzata per le mappe passate.
Poiché il tipo non è specificato per i tipi semplici, alcuni valori cambieranno tipo dopo il passaggio sulla rete. Un float
trasmesso diventa double
. Un short
diventa un int
e così via. In Android, sia List
che JSONArray
sono supportati per i valori dell'elenco. In questi casi, il passaggio di un JSONArray produrrà un List
.
Se una mappa con un campo @type
sconosciuto viene deserializzata, viene lasciata sotto forma di mappa. In questo modo gli sviluppatori possono aggiungere campi con nuovi tipi ai valori restituiti senza danneggiare i client precedenti.
Esempi di codice
Gli esempi in questa sezione illustrano come codificare quanto segue:
- Un esempio di callable.call in Swift
- Una risposta positiva per la chiamata
- Una risposta di errore per la chiamata
Esempio di Callable.call in Swift per la codifica
callable.call([
"aString": "some string",
"anInt": 57,
"aFloat": 1.23,
"aLong": -123456789123456 as Int64
])
Intestazione della richiesta:
Method: POST
Content-Type: application/json; charset=utf-8
Authorization: Bearer some-auth-token
Firebase-Instance-ID-Token: some-iid-token
Corpo della richiesta:
{
"data": {
"aString": "some string",
"anInt": 57,
"aFloat": 1.23,
"aLong": {
"@type": "type.googleapis.com/google.protobuf.Int64Value",
"value": "-123456789123456"
}
}
}
Risposta per la codifica
return {
"aString": "some string",
"anInt": 57,
"aFloat": 1.23
};
Intestazione di risposta riuscita:
200 OK
Content-Type: application/json; charset=utf-8
Corpo della risposta corretta:
{
"response": {
"aString": "some string",
"anInt": 57,
"aFloat": 1.23
}
}
Risposta di errore alla codifica
throw new HttpsError("unauthenticated", "Request had invalid credentials.", {
"some-key": "some-value"
});
Intestazione di risposta non riuscita:
401 UNAUTHENTICATED
Content-Type: application/json; charset=utf-8
Corpo della risposta non riuscita:
{
"error": {
"message": "Request had invalid credentials.",
"status": "UNAUTHENTICATED",
"details": {
"some-key": "some-value"
}
}
}