L'API Pubblicazione nei servizi per i giochi di Play ti consente di caricare un'immagine per una risorsa di gioco.
Opzioni di caricamento
L'API Pubblicazione nei servizi per i giochi di Play ti consente di caricare determinati tipi di dati binari o contenuti multimediali. Le caratteristiche specifiche dei dati che puoi caricare sono specificate nella pagina di riferimento di qualsiasi metodo che supporta i caricamenti di contenuti multimediali:
Dimensione massima del file di caricamento: la quantità massima di dati che puoi archiviare con questo metodo.
Tipi MIME multimediali accettati: i tipi di dati binari che puoi archiviare utilizzando questo metodo.
Puoi inviare richieste di caricamento in uno dei seguenti modi. Specifica il metodo che utilizzi con il parametro di richiesta uploadType.
Caricamento semplice:
uploadType=media
. Per il trasferimento rapido di file di piccole dimensioni, ad esempio di dimensioni inferiori a 5 MB.Caricamento suddiviso in più parti:
uploadType=multipart
. Per il trasferimento rapido di file e metadati di piccole dimensioni; trasferisce il file insieme ai metadati che lo descrivono, il tutto in una singola richiesta.Caricamento interrompibile:
uploadType=resumable
. Per un trasferimento affidabile, soprattutto con file di grandi dimensioni. Con questo metodo, utilizzi una richiesta di inizio sessione, che facoltativamente può includere metadati. Si tratta di una buona strategia da utilizzare per la maggior parte delle applicazioni, poiché funziona anche per i file più piccoli a costo di un'ulteriore richiesta HTTP per caricamento.
Quando carichi contenuti multimediali, utilizzi un URI speciale. Infatti, i metodi che supportano i caricamenti di contenuti multimediali hanno due endpoint URI:
L'URI /upload per i contenuti multimediali. Il formato dell'endpoint di caricamento è l'URI della risorsa standard con un prefisso "/upload". Utilizza questo URI durante il trasferimento degli stessi dati multimediali.
Esempio:
POST /upload/games/v1configuration/images/resourceId/imageType/imageType
L'URI della risorsa standard per i metadati. Se la risorsa contiene campi di dati, questi campi vengono utilizzati per memorizzare i metadati che descrivono il file caricato. Puoi utilizzare questo URI quando crei o aggiorni i valori dei metadati.
Esempio:
POST /games/v1configuration/images/resourceId/imageType/imageType
Caricamento semplice
Il metodo più semplice per caricare un file è inviare una semplice richiesta di caricamento. Questa opzione è una buona scelta se una delle seguenti condizioni è vera:
Il file è abbastanza piccolo da essere caricato di nuovo nella sua interezza se la connessione non va a buon fine.
Non ci sono metadati da inviare. Questo potrebbe essere il caso se prevedi di inviare i metadati per questa risorsa in una richiesta separata o se non sono supportati o disponibili metadati. Per utilizzare il caricamento semplice, invia una richiesta POST o PUT all'URI /upload del metodo e aggiungi il parametro di query uploadType=media. Ad esempio:
POST https://www.googleapis.com/upload/games/v1configuration/images/resourceId/imageType/imageType?uploadType=media
Le intestazioni HTTP da utilizzare quando si effettua una semplice richiesta di caricamento includono:
Content-Type
. Impostato su uno dei tipi di dati multimediali accettati per il caricamento del metodo, specificato nella documentazione di riferimento dell'API Publishing.Content-Length
. Imposta il numero di byte che stai caricando. Non obbligatorio se utilizzi la codifica di trasferimento suddivisa in blocchi.
Esempio: caricamento semplice
L'esempio seguente mostra l'utilizzo di una semplice richiesta di caricamento per l'API Google Play Games Services Publishing.
POST /upload/games/v1configuration/images/resourceId/imageType/imageType?uploadType=media HTTP/1.1
Host: www.googleapis.com
Content-Type: image/png
Content-Length: number_of_bytes_in_file
Authorization: Bearer your_auth_token
PNG data
Se la richiesta riesce, il server restituisce il codice di stato HTTP 200 OK
insieme agli eventuali metadati. Ad esempio:
HTTP/1.1 200
Content-Type: application/json
{
"kind": "gamesConfiguration#imageConfiguration",
"url": string,
"resourceId": string,
"imageType": string
}
Caricamento multiparte
Se hai metadati che vuoi inviare insieme ai dati da caricare, puoi effettuare una singola richiesta multipart/related
. Questa è una buona scelta se i dati che stai inviando sono abbastanza piccoli da poter essere caricati di nuovo nella loro interezza in caso di interruzione della connessione.
Per utilizzare il caricamento suddiviso in più parti, invia una richiesta POST
o PUT
all'URI /upload del metodo e aggiungi il parametro di query uploadType=multipart
. Ad esempio:
POST https://www.googleapis.com/upload/games/v1configuration/images/resourceId/imageType/imageType?uploadType=multipart
Le intestazioni HTTP di primo livello da utilizzare quando si effettua una richiesta di caricamento suddiviso includono:
-Content-Type
. Imposta su multipart/related e includi la stringa di confine che utilizzi per identificare le parti della richiesta.
-Content-Length
. Impostato sul numero totale di byte nel corpo della richiesta. La parte multimediale della richiesta deve essere inferiore alle dimensioni massime del file specificate per questo metodo.
Il corpo della richiesta è formattato come tipo di contenuto multipart/related RFC2387 e contiene esattamente due parti. Le parti sono identificate da una stringa di confine, mentre la stringa di confine finale è seguita da due trattini.
Ogni parte della richiesta con più parti richiede un'intestazione Content-Type aggiuntiva:
Parte dei metadati: deve essere la prima e Content-Type deve corrispondere a uno dei formati dei metadati accettati.
Parte multimediale: deve essere la seconda parte e il valore Content-Type deve corrispondere a uno dei tipi MIME multimediali accettati dal metodo.
Consulta la documentazione di riferimento dell'API Publishing per l'elenco dei tipi MIME dei contenuti multimediali accettati e dei limiti di dimensioni per i file caricati per ciascun metodo.
Esempio: caricamento multiparte
L'esempio seguente mostra una richiesta di caricamento suddiviso per l'API Pubblicazione nei servizi per i giochi di Play.
POST /upload/games/v1configuration/images/resourceId/imageType/imageType?uploadType=multipart HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer your_auth_token
Content-Type: multipart/related; boundary=foo_bar_baz
Content-Length: number_of_bytes_in_entire_request_body
--foo_bar_baz
Content-Type: application/json; charset=UTF-8
{
"kind": "gamesConfiguration#imageConfiguration",
"url": string,
"resourceId": string,
"imageType": string
}
--foo_bar_baz
Content-Type: image/png
PNG data
--foo_bar_baz--
Se la richiesta riesce, il server restituisce il codice di stato HTTP 200 OK
insieme a eventuali metadati:
HTTP/1.1 200
Content-Type: application/json
{
"kind": "gamesConfiguration#imageConfiguration",
"url": string,
"resourceId": string,
"imageType": string
}
Caricamento ripristinabile
Per caricare i file di dati in modo più affidabile, puoi utilizzare il protocollo di caricamento ripristinabile. Questo protocollo ti consente di riprendere un'operazione di caricamento dopo che un errore di comunicazione ha interrotto il flusso di dati. È particolarmente utile se stai trasferendo file di grandi dimensioni e la probabilità di un'interruzione della rete o di un altro errore di trasmissione è elevata, ad esempio durante il caricamento da un'app client mobile. Inoltre, può ridurre l'utilizzo della larghezza di banda in caso di guasti della rete perché non devi riavviare i caricamenti di file di grandi dimensioni dall'inizio.
I passaggi per utilizzare il caricamento ricoinducibile includono:
Avvia una sessione riavvolgibile. Invia una richiesta iniziale all'URI di caricamento che include eventuali metadati.
Salva l'URI della sessione riassumibile. Salva l'URI della sessione restituito nella risposta della richiesta iniziale; lo utilizzerai per le richieste rimanenti in questa sessione. Carica il file.
Invia il file multimediale all'URI della sessione riavviabile.
Inoltre, le app che utilizzano il caricamento ripristinabile devono avere un codice per riprendere un caricamento interrotto. Se un caricamento viene interrotto, scopri quanti dati sono stati ricevuti correttamente e poi riprendi il caricamento da quel punto.
Avviare una sessione riassumibile
Per avviare un caricamento riassumibile, invia una richiesta POST
o PUT
all'URI /upload del metodo e aggiungi il parametro di query uploadType=resumable
. Ad esempio:
POST https://www.googleapis.com/upload/games/v1configuration/images/resourceId/imageType/imageType?uploadType=resumable
Per questa richiesta iniziale, il corpo è vuoto o contiene solo i metadati. Trasferirai i contenuti effettivi del file da caricare nelle richieste successive.
Utilizza le seguenti intestazioni HTTP con la richiesta iniziale:
X-Upload-Content-Type
. Imposta il tipo MIME dei dati di caricamento da trasferire nelle richieste successive.X-Upload-Content-Length
. Imposta il numero di byte di dati di caricamento da trasferire nelle richieste successive. Se la lunghezza è sconosciuta al momento di questa richiesta, puoi omettere questa intestazione.Se fornisci metadati:
Content-Type
. Impostato in base al tipo di dati del metadato.Content-Length
. Impostato sul numero di byte specificati nel corpo di questa richiesta iniziale. Non è necessario se utilizzi la codifica di trasferimento a blocchi.
Consulta la documentazione di riferimento dell'API Publishing per l'elenco dei tipi MIME dei contenuti multimediali accettati e dei limiti di dimensione per i file caricati per ciascun metodo.
Esempio: richiesta di avvio della sessione riassumibile
L'esempio seguente mostra come avviare una sessione riassumibile per l'API Pubblicazione nei servizi per i giochi di Play.
POST /upload/games/v1configuration/images/resourceId/imageType/imageType?uploadType=resumable HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer your_auth_token
Content-Length: 38
Content-Type: application/json; charset=UTF-8
X-Upload-Content-Type: image/png
X-Upload-Content-Length: 2000000
{
"kind": "gamesConfiguration#imageConfiguration",
"url": string,
"resourceId": string,
"imageType": string
}
La sezione successiva descrive come gestire la risposta.
Salva l'URI della sessione riassumibile
Se la richiesta di avvio della sessione va a buon fine, il server API risponde con un codice di stato HTTP 200
OK
. Inoltre, fornisce un'intestazione Location
che
specifica l'URI della sessione riassumibile. L'intestazione Location
, mostrata nell'esempio riportato di seguito, include una parte del parametro di query upload_id
che fornisce l'ID caricamento univoco da utilizzare per questa sessione.
Esempio: risposta all'avvio della sessione riassumibile
Ecco la risposta alla richiesta nel passaggio 1:
HTTP/1.1 200 OK
Location: https://www.googleapis.com/upload/games/v1configuration/images/resourceId/imageType/imageType?uploadType=resumable&upload_id=xa298sd_sdlkj2
Content-Length: 0
Il valore dell'intestazione Location
, come mostrato nella risposta di esempio riportata sopra, è
l'URI della sessione che utilizzerai come endpoint HTTP per eseguire il caricamento effettivo del file
o eseguire query sullo stato del caricamento.
Copia e salva l'URI della sessione per poterlo utilizzare per le richieste successive.
Caricamento del file
Per caricare il file, invia una richiesta PUT
all'URI di caricamento ottenuto nel
passaggio precedente. Il formato della richiesta di caricamento è:
PUT session_uri
Le intestazioni HTTP da utilizzare per effettuare le richieste di caricamento dei file riavviabili includono
Content-Length
. Imposta il numero di byte che carichi in questa richiesta, che in genere corrisponde alle dimensioni del file di caricamento.
Esempio: richiesta di caricamento di file con possibilità di ripresa
Di seguito è riportata una richiesta riprendente per il caricamento dell'intero file PNG di 2.000.000 byte per l'esempio corrente.
PUT https://www.googleapis.com/upload/games/v1configuration/images/resourceId/imageType/imageType?uploadType=resumable&upload_id=xa298sd_sdlkj2 HTTP/1.1
Content-Length: 2000000
Content-Type: image/png
bytes 0-1999999
Se la richiesta va a buon fine, il server risponde con un messaggio HTTP 201 Created
, insieme a eventuali metadati associati a questa risorsa. Se la richiesta iniziale della
sessione riassumibile fosse stata PUT
per aggiornare una risorsa esistente, la risposta di esito positivo sarebbe 200 OK
, insieme a eventuali metadati associati a questa
risorsa.
Se la richiesta di caricamento viene interrotta o se ricevi un messaggio HTTP 503 Service Unavailable
o un'altra risposta 5xx
dal server, segui la procedura descritta in Riprendere un caricamento interrotto.
Carica il file a blocchi
Con i caricamenti riavviabili, puoi suddividere un file in blocchi e inviare una serie di richieste per caricare ciascun blocco in sequenza. Questo non è l'approccio preferito poiché le richieste aggiuntive comportano costi in termini di prestazioni e generalmente non sono necessarie. Tuttavia, potresti dover utilizzare il chunking per ridurre la quantità di dati trasferiti in una singola richiesta. Questo è utile quando esiste un limite di tempo fisso per le singole richieste, come accade per alcune classi di richieste di Google App Engine. Inoltre, ti consente di eseguire operazioni come fornire indicazioni sul progresso del caricamento per i browser precedenti che non supportano il progresso del caricamento per impostazione predefinita.
Se carichi i dati a blocchi, è obbligatoria anche l'intestazione Content-Range, insieme all'intestazione Content-Length necessaria per i caricamenti completi dei file:
Content-Length
. Imposta la dimensione del chunk o eventualmente un valore inferiore, come potrebbe essere il caso dell'ultima richiesta.Content-Range
. Impostato per mostrare i byte del file che stai caricando. Ad esempio,Content-Range: bytes 0-524287/2000000
indica che stai fornendo i primi 524.288 byte (256 x 1024 x 2) di un file di 2.000.000 byte.
Riprendere un caricamento interrotto
Se una richiesta di caricamento viene interrotta prima di ricevere una risposta o se ricevi una risposta HTTP 503 Service Unavailable
dal server, devi riprendere il caricamento interrotto. Per riprendere un caricamento interrotto:
Stato della richiesta. Esegui una query sullo stato corrente del caricamento inviando una richiesta
PUT
vuota all'URI di caricamento. Per questa richiesta, le intestazioni HTTP devono includere un'intestazioneContent-Range
che indichi che la posizione corrente nel file è sconosciuta. Ad esempio, impostaContent-Range
su*/2000000
se la lunghezza totale del file è 2.000.000. Se non conosci le dimensioni complete del file, imposta*/*
per Content-Range.Ottieni il numero di byte caricati. Elabora la risposta della query sullo stato. Il server utilizza l'intestazione
Range
nella risposta per specificare i byte che ha ricevuto finora. Ad esempio, un'intestazioneRange
di0-299999
indica che sono stati ricevuti i primi 300.000 byte del file.Carica i dati rimanenti. Infine, ora che sai dove riprendere la richiesta, invia i dati rimanenti o il chunk corrente. Tieni presente che in entrambi i casi devi trattare i dati rimanenti come un blocco separato, quindi devi inviare l'intestazione
Content-Range
quando riprendi il caricamento.
Esempio: riprendere un caricamento interrotto
Richiedi lo stato del caricamento. La richiesta seguente utilizza l'intestazione Content-Range per indicare che la posizione corrente nel file di 2.000.000 byte è sconosciuta.
PUT {session_uri} HTTP/1.1 Content-Length: 0 Content-Range: bytes */2000000
Estrai dalla risposta il numero di byte caricati finora. La risposta del server utilizza l'intestazione
Range
per indicare che ha ricevuto finora i primi 43 byte del file. Utilizza il valore superiore dell'intestazione Intervallo per determinare da dove iniziare il caricamento ripreso.HTTP/1.1 308 Resume Incomplete Content-Length: 0 Range: 0-42
Riprendi il caricamento dal punto in cui era stato interrotto. La richiesta che segue riprende il caricamento inviando i byte rimanenti del file, a partire dal byte 43.
PUT {session_uri} HTTP/1.1 Content-Length: 1999957 Content-Range: bytes 43-1999999/2000000 bytes 43-1999999
Gestione degli errori
Quando carichi contenuti multimediali, è utile conoscere alcune best practice relative alla gestione degli errori.
Riprendi o riprova i caricamenti non riusciti a causa di interruzioni della connessione o errori 5xx, tra cui:
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
Utilizza una strategia di backoff esponenziale se viene restituito un errore del server
5xx
quando riprendi o riprovi le richieste di caricamento. Questi errori possono verificarsi se un server è in sovraccarico. Il backoff exponenciale può contribuire ad alleviare questi tipi di problemi durante periodi di elevato volume di richieste o traffico di rete intenso.Altri tipi di richieste non devono essere gestiti dal backoff esponenziale, ma puoi comunque riprovare con un certo numero di richieste. Quando riprovi a inviare queste richieste, limita il numero di volte. Ad esempio, il codice potrebbe limitare a dieci o meno i tentativi di nuovo prima di segnalare un errore.
Gestisci gli errori
404 Not Found
e410 Gone
durante i caricamenti riavviabili avviando nuovamente l'intero caricamento dall'inizio.
Backoff esponenziale
Il backoff esponenziale è una strategia di gestione degli errori standard per le applicazioni di rete in cui il client riprova periodicamente una richiesta non riuscita per un periodo di tempo crescente. Se un volume elevato di richieste o un traffico di rete elevato fanno sì che il server restituisca errori, il backoff esponenziale potrebbe essere una buona strategia per gestirli. Al contrario, non è una strategia pertinente per gestire gli errori non correlati al volume della rete o ai tempi di risposta, come le credenziali di autorizzazione non valide o gli errori di file non trovati.
Se utilizzato correttamente, il backoff esponenziale aumenta l'efficienza dell'utilizzo della larghezza di banda, riduce il numero di richieste necessarie per ottenere una risposta positiva e massimizza il throughput delle richieste in ambienti simultanei.
Il flusso per l'implementazione del backoff esponenziale semplice è il seguente:
- Invia una richiesta all'API.
- Ricevere una risposta
HTTP 503
, che indica che devi riprovare a inviare la richiesta. - Attendi 1 secondo + numero_casuale_di_millisecondi e riprova a inviare la richiesta.
- Ricevere una risposta
HTTP 503
, che indica che devi riprovare a inviare la richiesta. - Attendi 2 secondi + numero_casuale_di_millisecondi e riprova a inviare la richiesta.
- Ricevere una risposta
HTTP 503
, che indica che devi riprovare a inviare la richiesta. - Attendi 4 secondi + numero_casuale_di_millisecondi e riprova a inviare la richiesta.
- Ricevere un
HTTP 503 response
, che indica che devi riprovare a inviare la richiesta. - Attendi 8 secondi + numero_casuale_di_millisecondi e riprova a inviare la richiesta.
- Ricevere un
HTTP 503 response
, che indica che devi riprovare a inviare la richiesta. - Attendi 16 secondi + numero_casuale_di_millisecondi e riprova a inviare la richiesta.
- Interrompe la riproduzione. Segnala o registra un errore.
Nell'elenco precedente, numero_casuale_di_millisecondi è un numero casuale di millisecondi inferiore o uguale a 1000. Questo è necessario, poiché l'introduzione di un piccolo ritardo random aiuta a distribuire il carico in modo più uniforme ed evita la possibilità di un picco di richieste sul server. Il valore di random_number_milliseconds deve essere ridefinito dopo ogni attesa.
L'algoritmo è impostato per terminare quando n è 5. Questo limite impedisce ai client di ripetere i tentativi all'infinito e comporta un ritardo totale di circa 32 secondi prima che una richiesta venga considerata "un errore non recuperabile". Un numero massimo di tentativi più elevato è accettabile, soprattutto se è in corso un caricamento lungo. Assicurati solo di limitare il ritardo del nuovo tentativo a un valore ragionevole, ad esempio meno di un minuto.