L'Firebase HostingAPI REST consente di eseguire deployment programmatici e personalizzabili sui siti ospitati su Firebase. Utilizza questa API REST per eseguire il deployment di contenuti Hosting e configurazioni nuovi o aggiornati.
In alternativa all'utilizzo della Firebase CLI per
i deployment, puoi utilizzare l'API REST Firebase Hosting per creare in modo programmatico
una nuova version degli asset del tuo sito, caricare i file nella versione e poi eseguire il deployment della versione sul
tuo sito.
Ad esempio, con l'API REST Firebase Hosting puoi:
Pianificare i deployment. Utilizzando l'API REST in combinazione con un cron job, puoi modificare i contenuti ospitati su Firebase in base a una pianificazione regolare (ad esempio, per fare il deployment di una versione speciale dei contenuti per una festività o un evento).
Eseguire l'integrazione con gli strumenti per sviluppatori. Puoi creare un'opzione nello strumento per eseguire il deployment dei progetti di app web su Firebase Hosting con un solo clic (ad esempio, facendo clic su un pulsante di deployment all'interno di un IDE).
Automatizzare i deployment quando vengono generati contenuti statici. Quando un processo genera contenuti statici in modo programmatico (ad esempio, contenuti generati dagli utenti come un wiki o un articolo di notizie), puoi eseguire il deployment dei contenuti generati come file statici anziché pubblicarli in modo dinamico. In questo modo risparmi costosa potenza di calcolo e pubblichi i file in modo più scalabile.
Questa guida descrive innanzitutto come abilitare, autenticare e autorizzare l'API. Poi, illustra un esempio per creare una Firebase Hosting versione, caricare i file richiesti nella versione e infine eseguire il deployment della versione.
Puoi anche scoprire di più su questa API REST nella documentazione di riferimento completa dell'API REST Hosting.
Prima di iniziare: abilita l'API REST
Devi abilitare l'API REST Firebase Hosting nella console Google APIs:
Apri la pagina dell'API Firebase Hosting nella console Google APIs.
Quando richiesto, seleziona il tuo progetto Firebase.
Fai clic su Abilita nella pagina dell'API Firebase Hosting.
Passaggio 1: ottieni un token di accesso per autenticare e autorizzare le richieste API
I progetti Firebase supportano i service account Google, che puoi utilizzare per chiamare le API server Firebase dal server dell'app o dall'ambiente attendibile. Se stai sviluppando codice in locale o eseguendo il deployment dell'applicazione on-premise, puoi utilizzare le credenziali ottenute utilizzando questo service account per autorizzare le richieste del server.
Puoi visualizzare tutti i service account del tuo progetto Firebase nella
Per autenticare un service account e autorizzarlo ad accedere ai servizi Firebase, devi generare un file della chiave privata in formato JSON.
Per generare un file della chiave privata per il tuo service account:
Nella console Firebase, vai alla scheda
Impostazioni > Service account.Fai clic su Genera nuova chiave privata, quindi conferma facendo clic su Genera chiave.
Archivia in modo sicuro il file JSON contenente la chiave.
Utilizza le credenziali Firebase insieme a Google Auth Library per la tua lingua preferita per recuperare un token di accesso OAuth 2.0 di breve durata:
node.js
const {google} = require('googleapis'); function getAccessToken() { return new Promise(function(resolve, reject) { var key = require('./service-account.json'); var jwtClient = new google.auth.JWT( key.client_email, null, key.private_key, SCOPES, null ); jwtClient.authorize(function(err, tokens) { if (err) { reject(err); return; } resolve(tokens.access_token); }); }); }
In questo esempio, la libreria client API Google autentica la richiesta con un token web JSON o JWT. Per saperne di più, consulta Token web JSON.
Python
def _get_access_token(): """Retrieve a valid access token that can be used to authorize requests. :return: Access token. """ credentials = ServiceAccountCredentials.from_json_keyfile_name( 'service-account.json', SCOPES) access_token_info = credentials.get_access_token() return access_token_info.access_token
Java
private static String getAccessToken() throws IOException { GoogleCredential googleCredential = GoogleCredential .fromStream(new FileInputStream("service-account.json")) .createScoped(Arrays.asList(SCOPES)); googleCredential.refreshToken(); return googleCredential.getAccessToken(); }
Una volta scaduto il token di accesso, il metodo di aggiornamento del token viene chiamato automaticamente per recuperare un token di accesso aggiornato.
Passaggio 2: assicurati che il tuo progetto abbia un sito Hosting predefinito
Prima del primo deployment su Firebase Hosting, il tuo progetto Firebase deve
avere un
Hosting SITE.
Verifica se il tuo progetto ha già un sito Hosting predefinito chiamando l'
sites.listendpoint.Ad esempio:
Comando cURL
curl -H "Content-Type: application/json" \ -H "Authorization: Bearer ACCESS_TOKEN" \ https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID/sitesRichiesta HTTPS non elaborata
Host: firebasehosting.googleapis.com POST /v1beta1/projects/PROJECT_ID/sites HTTP/1.1 Authorization: Bearer ACCESS_TOKEN Content-Type: application/json
Se uno dei siti ha
"type": "DEFAULT_SITE", significa che il tuo progetto ha già un sito Hosting predefinito. Salta il resto di questo passaggio, e vai al passaggio successivo: Crea una nuova versione per il tuo sito.Se ricevi un array vuoto, significa che non hai un Hosting sito predefinito. Completa il resto di questo passaggio.
Decide on the
SITE_IDfor your default Hosting site. Tieni presente quanto segue quando scegli questoSITE_ID:Questo
SITE_IDviene utilizzato per creare i sottodomini Firebase predefiniti:
eSITE_ID.web.app .SITE_ID.firebaseapp.comUn
SITE_IDdeve soddisfare i seguenti requisiti:- Deve essere un'etichetta del nome host valida, il che significa che non può contenere
.,_e così via. - Non deve superare i 30 caratteri
- Deve essere univoco a livello globale all'interno di Firebase
- Deve essere un'etichetta del nome host valida, il che significa che non può contenere
Tieni presente che spesso consigliamo di utilizzare l'ID progetto come
SITE_IDper il tuo sito Hosting predefinito. Scopri come trovare questo ID in Informazioni sui progetti Firebase.Crea il sito Hosting predefinito chiamando l'
sites.createendpoint utilizzando l'SITE_IDche preferisci come parametrositeId.Ad esempio:
Comando cURL
curl -H "Content-Type: application/json" \ -H "Authorization: Bearer ACCESS_TOKEN" \ https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID/sites?siteId=SITE_IDRichiesta HTTPS non elaborata
Host: firebasehosting.googleapis.com POST /v1beta1/projects/PROJECT_ID/sites?siteId=SITE_ID Authorization: Bearer ACCESS_TOKEN Content-Type: application/json
Questa chiamata API a
sites.createrestituisce il seguente JSON:{ "name": "projects/PROJECT_ID/sites/SITE_ID", "defaultUrl": "https://SITE_ID.web.app", "type": "DEFAULT_SITE" }
Passaggio 3: crea una nuova versione per il tuo sito
La prima chiamata API consiste nel creare un nuovo
Version per il tuo sito.
Più avanti in questa guida, caricherai i file in questa versione e poi eseguirai il deployment sul tuo sito.
Determina l'SITE_ID del sito su cui vuoi eseguire il deployment.
Chiama l' endpoint versions.create utilizzando il tuo SITE_ID nella chiamata.
(Facoltativo) Puoi anche passare un Firebase Hosting oggetto di configurazione nella chiamata, inclusa l'impostazione di un'intestazione che memorizza nella cache tutti i file per un periodo di tempo specificato.
Ad esempio:
Comando cURL
curl -H "Content-Type: application/json" \ -H "Authorization: Bearer ACCESS_TOKEN" \ -d '{ "config": { "headers": [{ "glob": "**", "headers": { "Cache-Control": "max-age=1800" } }] } }' \ https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versionsRichiesta HTTPS non elaborata
Host: firebasehosting.googleapis.com POST /v1beta1/sites/SITE_ID/versions HTTP/1.1 Authorization: Bearer ACCESS_TOKEN Content-Type: application/json Content-Length: 134 { "config": { "headers": [{ "glob": "**", "headers": { "Cache-Control": "max-age=1800" } }] } }
Questa chiamata API a versions.create restituisce il seguente JSON:
{
"name": "sites/SITE_ID/versions/VERSION_ID",
"status": "CREATED",
"config": {
"headers": [{
"glob": "**",
"headers": {
"Cache-Control": "max-age=1800"
}
}]
}
}Questa risposta contiene un identificatore univoco per la nuova versione, nel formato:
sites/SITE_ID/versions/VERSION_ID. Avrai bisogno di questo identificatore univoco in questa guida per fare riferimento a questa versione specifica.
Passaggio 4: specifica l'elenco dei file di cui vuoi eseguire il deployment
Ora che hai l'identificatore della nuova versione, devi indicare a Firebase Hosting i file di cui vuoi eseguire il deployment in questa nuova versione.
Tieni presente che Hosting ha un limite di dimensioni massime di 2 GB per i singoli file.
Questa API richiede di identificare i file tramite un hash SHA256. Pertanto, prima di poter effettuare la chiamata API, devi prima calcolare un hash per ogni file statico comprimendo i file con Gzip e poi prendendo l'hash SHA256 di ogni file appena compresso.
Continuando con il nostro esempio, supponiamo che tu voglia eseguire il deployment di tre file nella nuova versione: file1, file2 e file3.
Comprimi i file con Gzip:
gzip file1 && gzip file2 && gzip file3
Ora hai tre file compressi:
file1.gz,file2.gzefile3.gz.Ottieni l'hash SHA256 di ogni file compresso:
cat file1.gz | openssl dgst -sha256 66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4
cat file2.gz | openssl dgst -sha256 490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083
cat file3.gz | openssl dgst -sha256 59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315
Ora hai i tre hash SHA256 dei tre file compressi.
Invia questi tre hash in una richiesta API all'
versions.populateFilesendpoint. Elenca ogni hash in base al percorso desiderato per il file caricato (in questo esempio,/file1,/file2, e/file3).Ad esempio:
Comando cURL
$ curl -H "Content-Type: application/json" \ -H "Authorization: Bearer ACCESS_TOKEN" \ -d '{ "files": { "/file1": "66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4", "/file2": "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083", "/file3": "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315" } }' \ https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versions/VERSION_ID:populateFilesRichiesta HTTPS non elaborata
Host: firebasehosting.googleapis.com POST /v1beta1/sites/SITE_ID/versions/VERSION_ID:populateFiles HTTP/1.1 Authorization: Bearer ACCESS_TOKEN Content-Type: application/json Content-Length: 181 { "files": { "/file1": "66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4", "/file2": "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083", "/file3": "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315" } }
Questa chiamata API a versions.populateFiles restituisce il seguente JSON:
{ "uploadRequiredHashes": [ "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083", "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315" ], "uploadUrl": "https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files" }
Questa risposta include:
L'hash di ogni file da caricare. Ad esempio, in questo esempio
file1era già stato caricato in una versione precedente, quindi il suo hash non è incluso nell'elencouploadRequiredHashes.L'
uploadUrlspecifico per la nuova versione.
Nel passaggio successivo per caricare i due nuovi file, avrai bisogno degli hash e dell'uploadURL dalla risposta versions.populateFiles.
Passaggio 5: carica i file richiesti
Devi caricare singolarmente ogni file richiesto (i file elencati in uploadRequiredHashes dalla risposta versions.populateFiles nel passaggio precedente). Per questi caricamenti di file, avrai bisogno degli hash dei file e dell'uploadUrl del passaggio precedente.
Aggiungi una barra e l'hash del file al
uploadUrlper creare un URL specifico per il file nel formato:https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH.Carica tutti i file richiesti uno alla volta (in questo esempio, solo
file2.gzefile3.gz) all'URL specifico del file utilizzando una serie di richieste.Ad esempio, per caricare il file compresso
file2.gz:Comando cURL
curl -H "Authorization: Bearer ACCESS_TOKEN" \ -H "Content-Type: application/octet-stream" \ --data-binary @./file2.gz \ https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASHRichiesta HTTPS non elaborata
Host: upload-firebasehosting.googleapis.com POST /upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH HTTP/1.1 Authorization: Bearer ACCESS_TOKEN Content-Type: application/octet-stream Content-Length: 500 content-of-file2.gz
I caricamenti riusciti restituiscono una risposta HTTPS 200 OK.
Passaggio 6: aggiorna lo stato della versione a FINALIZED
Dopo aver caricato tutti i file elencati nella risposta versions.populateFiles, puoi aggiornare lo stato della versione a FINALIZED.
Chiama l'versions.patch
endpoint con il campo status nella richiesta API impostato su FINALIZED.
Ad esempio:
Comando cURL
curl -H "Content-Type: application/json" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-X PATCH \
-d '{"status": "FINALIZED"}' \
https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versions/VERSION_ID?update_mask=status
Richiesta HTTPS non elaborata
Host: firebasehosting.googleapis.com
PATCH /v1beta1/sites/SITE_ID/versions/VERSION_ID?update_mask=status HTTP/1.1
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
Content-Length: 23
{"status": "FINALIZED"}Questa chiamata API a versions.patch restituisce il seguente JSON. Verifica che status sia stato aggiornato a FINALIZED.
{ "name": "sites/SITE_ID/versions/VERSION_ID", "status": "FINALIZED", "config": { "headers": [{ "glob": "**", "headers": {"Cache-Control": "max-age=1800"} }] }, "createTime": "2018-12-02T13:41:56.905743Z", "createUser": { "email": "SERVICE_ACCOUNT_EMAIL@SITE_ID.iam.gserviceaccount.com" }, "finalizeTime": "2018-12-02T14:56:13.047423Z", "finalizeUser": { "email": "USER_EMAIL@DOMAIN.tld" }, "fileCount": "5", "versionBytes": "114951" }
Passaggio 7: rilascia la versione per il deployment
Ora che hai una versione finalizzata, rilasciala per il deployment. Per questo passaggio,
devi creare un
Release della tua versione
che contenga la configurazione di hosting e tutti i file di contenuti per la nuova
versione.
Chiama l'releases.create
endpoint per creare la release.
Ad esempio:
Comando cURL
curl -H "Authorization: Bearer ACCESS_TOKEN" \
-X POST
https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/releases?versionName=sites/SITE_ID/versions/VERSION_ID
Richiesta HTTPS non elaborata
Host: firebasehosting.googleapis.com POST /v1beta1/sites/SITE_ID/releases?versionName=sites/SITE_ID/versions/VERSION_ID HTTP/1.1 Authorization: Bearer ACCESS_TOKEN
Questa chiamata API a releases.create restituisce il seguente JSON:
{ "name": "sites/SITE_ID/releases/RELEASE_ID", "version": { "name": "sites/SITE_ID/versions/VERSION_ID", "status": "FINALIZED", "config": { "headers": [{ "glob": "**", "headers": {"Cache-Control": "max-age=1800"} }] } }, "type": "DEPLOY", "releaseTime": "2018-12-02T15:14:37Z" }
La configurazione di hosting e tutti i file della nuova versione dovrebbero essere stati sottoposti a deployment sul tuo sito e puoi accedere ai file utilizzando gli URL:
https://SITE_ID.web.app/file1https://SITE_ID.web.app/file2https://SITE_ID.web.app/file3
Questi file sono accessibili anche sugli URL associati al tuo
SITE_ID.firebaseapp.com dominio.
Puoi anche visualizzare la nuova uscita elencata nella Hosting dashboard della Firebase console.