Le annotazioni dei framework di endpoint descrivono la configurazione, i metodi, i parametri e altri dettagli importanti dell'API che definiscono le proprietà e il comportamento dell'endpoint.
Consulta Scrivere e annotare il codice per informazioni sull'aggiunta di annotazioni utilizzando un progetto Maven. Maven Gli artefatti Cloud Endpoints di App Engine vengono forniti creare e creare un'API backend e generare una libreria client da questa.
L'annotazione che specifica la configurazione e il comportamento nell'intera API
(riguarda tutte le classi esposte nell'API e tutti i loro metodi esposti) è
@Api
Tutti i metodi pubblici, non statici e non bridge di una classe annotata con @Api
sono esposti nell'API pubblica.
Se hai bisogno di una configurazione API speciale per un determinato metodo, puoi facoltativamente utilizzare @ApiMethod
per impostare la configurazione in base al metodo.
Configuri queste annotazioni impostando vari attributi, come mostrato nell'
le seguenti tabelle.
@Api
: annotazioni con ambito API
L'annotazione
@Api
configura l'intera API e si applica a tutti i metodi pubblici di una classe
a meno che non venga sostituita da @ApiMethod
.
Per eseguire l'override di una determinata annotazione @Api
per una classe specifica all'interno di un'area,
un'API, consulta
@ApiClass
e
@ApiReference
.
Importazioni obbligatorie
Per utilizzare questa funzionalità, è necessaria la seguente importazione:
import com.google.api.server.spi.config.Api;
Attributi
Attributi @API | Descrizione | Esempio |
---|---|---|
audiences |
Obbligatorio se la tua API richiede l'autenticazione e se supporti i client Android. Per saperne di più, vedi ID cliente e segmenti di pubblico. | audiences = {"1-web-apps.apps.googleusercontent.com", "2-web-apps.apps.googleusercontent.com"} |
apiKeyRequired |
Facoltativo. Utilizzato per limitare l'accesso alle richieste che forniscono una chiave API. | apiKeyRequired = AnnotationBoolean.TRUE |
authenticators |
Obbligatorio se l'API esegue l'autenticazione tramite Firebase, Auth0 o account di servizio. Questo attributo non è necessario se l'API si autentica utilizzando i token ID Google. Puoi impostare questa opzione a livello di API o a livello di singolo metodo. Impostalo su {EspAuthenticator.class} oppure puoi scrivere il tuo autenticatore personalizzato, come descritto in Interface Authenticator. |
authenticators = {EspAuthenticator.class} |
backendRoot |
Deprecato. Per pubblicare l'API da un percorso diverso, modifica url-pattern nella sezione EndpointsServlet nel file web.xml . |
<url-pattern>/example-api/*</url-pattern> |
canonicalName |
Viene utilizzato per specificare un nome diverso o più leggibile per l'API nella libreria client. Questo nome viene utilizzato per generare i nomi nella libreria client; l'API di backend continua a utilizzare il valore specificato nella proprietà name .Ad esempio, se per l'API è impostato name su dfaanalytics, puoi utilizzare questa proprietà per specificare un nome canonico di DFA Group Analytics; le classi client generate conterranno quindi il nome DfaGroupAnalytics .Devi includere gli spazi pertinenti tra i nomi; questi vengono sostituiti da lettere maiuscole o trattini bassi appropriati. |
canonicalName = "DFA Analytics:" n |
clientIds |
Obbligatorio se l'API utilizza l'autenticazione. Elenco degli ID client autorizzati a richiedere token. Per saperne di più, vedi ID cliente e segmenti di pubblico. | clientIds = {"1-web-apps.apps.googleusercontent.com", "2-android-apps.apps.googleusercontent.com"} |
defaultVersion |
Specifica se viene utilizzata una versione predefinita se non ne viene fornita una nell'attributo version . |
defaultVersion = AnnotationBoolean.TRUE |
description |
Una breve descrizione dell'API. Viene esposto nel servizio di rilevamento per descrivere l'API e può essere utilizzato anche per generare documentazione. | description = "Sample API for a simple game" |
documentationLink |
L'URL in cui gli utenti possono trovare la documentazione relativa a questa versione dell'API. Questa informazione viene visualizzata nell'evidenziazione "Scopri di più" nella parte superiore della pagina di API Explorer per consentire agli utenti di conoscere il tuo servizio. | documentationLink = "http://link_to/docs" |
issuers |
Le configurazioni personalizzate dell'emittente JWT. | issuers = { @ApiIssuer(name = "auth0", issuer = "https://test.auth0.com/authorize", jwksUri = "https://test.auth0.com/.well-known/jwks.json") } |
issuerAudiences |
Segmenti di pubblico per singoli emittenti. | issuerAudiences = { @ApiIssuerAudience(name = "auth0", audiences = {"aud-1.auth0.com", "aud-2.auth0.com"}) } |
limitDefinitions |
Facoltativo. Utilizzato per definire le quote per la tua API. Vedi @ApiLimitMetric . |
limitDefinitions = { @ApiLimitMetric(name = "read-requests", displayName = "Read requests", limit = 1000)} |
name |
Il nome dell'API, che viene utilizzato come prefisso per tutti i metodi e i percorsi dell'API. Il valore name :
name , viene utilizzato il valore predefinito myapi . |
name = "foosBall" |
namespace |
Configura lo spazio dei nomi per i client generati. Vedi @ApiNamespace . |
namespace=@ApiNamespace(ownerDomain="your-company.com", ownerName="YourCo", packagePath="cloud/platform" ) |
root |
Deprecato. Per pubblicare l'API da un percorso diverso, nel file web.xml modifica url-pattern nella sezione EndpointsServlet . |
<url-pattern>/example-api/*</url-pattern> |
scopes |
Se non viene fornito, il valore predefinito è l'ambito email (https://www.googleapis.com/auth/userinfo.email ), obbligatorio per OAuth. Se vuoi, puoi sostituire questo valore per specificare altri ambiti OAuth 2.0. Tuttavia, se definisci più di un ambito, tieni presente che il controllo dell'ambito viene superato se il token viene eseguito per qualsiasi degli ambiti specificati. Per richiedere più ambiti, deve essere specificato un singolo String con uno spazio tra ogni ambito. Per sostituire gli ambiti specificati qui per un determinato metodo dell'API, specifica ambiti diversi nell'annotazione @ApiMethod . |
scopes = {"ss0", "ss1 and_ss2"} |
title |
Il testo visualizzato in API Explorer come titolo dell'API ed esposto nei servizi di scoperta e directory. | title = "My Backend API" |
transformers |
Specifica un elenco di trasformatori personalizzati. Tieni presente che è preferibile un'annotazione alternativa (@ApiTransformer ). Questo attributo viene sostituito da @ApiTransformer . |
transformers = {BazTransformer.class} |
version |
Specifica la versione dell'endpoint. Se non lo specifichi, viene utilizzato il valore predefinito v1 . |
version = "v2" |
Annotazione di esempio@Api
Questa annotazione è posizionata prima della definizione della classe:
ID cliente e segmenti di pubblico
Per l'autenticazione OAuth2, viene emesso un token OAuth2 per un ID client specifico.
puoi utilizzare l'ID client per limitare l'accesso alle API.
Quando registri un'applicazione Android nella console Google Cloud,
devi creare un ID client. Questo ID client è quello che richiede un
token OAuth2 a Google a scopo di autenticazione. Quando l'API backend è protetta
per autorizzazione, un token di accesso OAuth2 viene inviato e aperto da Endpoints
l'ID client viene estratto dal token e poi l'ID viene confrontato con
elenco di ID client dichiarati accettabili dal backend (l'elenco clientIds
).
Se vuoi che l'API Endpoints autentichi gli utenti che chiamano, devi fornire un elenco di clientIds
autorizzati a richiedere token. Questo elenco deve essere costituito da tutti gli ID client che hai ottenuto tramite la console Google Cloud per i tuoi client web o Android. Ciò significa che i clienti devono essere noti al momento della compilazione dell'API. Se specifichi un elenco vuoto, {}
,
nessun client può accedere ai metodi protetti da Auth.
Se utilizzi l'attributo clientIds
e vuoi testare le chiamate autenticate alla tua API utilizzando Explorer API di Google, devi fornire il relativo ID client nell'elenco di clientIds
: il valore da utilizzare è com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID
.
Informazioni sui segmenti di pubblico
L'elenco clientIds
protegge l'API di backend da client non autorizzati. Ma
è necessaria un'ulteriore protezione per proteggere i client in modo che il token di autenticazione
funziona solo per l'API backend prevista. Per i client Android, questo meccanismo è l'attributo audiences
, in cui specifichi l'ID client dell'API di backend.
Tieni presente che quando crei un progetto nella console Google Cloud, un client predefinito L'ID viene creato automaticamente e denominato per essere utilizzato dal progetto. Quando carichi l'API backend in App Engine, utilizza questo ID client. Si tratta dell'ID client web indicato in Autenticazione API.
@ApiMethod
: annotazioni basate sui metodi
L'annotazione
@ApiMethod
viene utilizzato per fornire una configurazione API diversa da quella predefinita fornita
@Api
o @ApiClass
annotazioni. Tieni presente che questa operazione è facoltativa: tutti i metodi pubblici, non statici e non bridge di una classe con un'annotazione @Api
sono esposti nell'API, indipendentemente dal fatto che abbiano o meno un'annotazione @Api
.
Gli attributi in questa annotazione ti consentono di configurare i dettagli
di un singolo metodo API. Se lo stesso attributo è specificato in @Api
e
@ApiMethod
, @ApiMethod
ha la precedenza.
Importazioni obbligatorie
Per utilizzare questa funzionalità, sono necessarie le seguenti importazioni:
import com.google.api.server.spi.config.AnnotationBoolean;
import com.google.api.server.spi.config.ApiMethod;
import com.google.api.server.spi.config.ApiMethod.HttpMethod;
Attributi
Attributi @ApiMethod | Descrizione | Esempio |
---|---|---|
apiKeyRequired |
Facoltativo. Utilizzato per limitare l'accesso alle richieste che forniscono una chiave API. | apiKeyRequired = AnnotationBoolean.TRUE |
audiences |
Forniscilo se vuoi eseguire l'override della configurazione in @API . Per saperne di più, vedi ID cliente e segmenti di pubblico. |
audiences = {"1-web-apps.apps.googleusercontent.com", "2-web-apps.apps.googleusercontent.com"} |
authenticators |
Obbligatorio se l'API esegue l'autenticazione tramite Firebase, Auth0 o account di servizio e non hai impostato questo attributo a livello di API. Questo attributo non è necessario se l'API si autentica utilizzando i token ID Google. Impostalo su {EspAuthenticator.class} oppure puoi scrivere il tuo autenticatore personalizzato, come descritto in Interface Authenticator |
authenticators = {EspAuthenticator.class} |
clientIds |
Elenco degli ID client autorizzati a richiedere token. Obbligatorio se l'API utilizza l'autenticazione. | clientIds = {"1-web-apps.apps.googleusercontent.com", "2-android-apps.apps.googleusercontent.com"} |
httpMethod |
Il metodo HTTP da utilizzare. Se non imposti questa opzione, viene scelto un valore predefinito in base al nome del metodo. | httpMethod = HttpMethod.GET |
issuerAudiences |
Forniscilo se vuoi eseguire l'override della configurazione in @Api . |
issuerAudiences = { @ApiIssuerAudience(name = "auth0", audiences = {"aud-1.auth0.com", "aud-2.auth0.com"}) } |
metricCosts |
Facoltativo. Indica che il metodo ha un limite di quota. Assegni l'annotazione @ApiMetricCost a metricCosts . Devi anche specificare l'attributo limitDefinitions per definire la quota nell'annotazione @Api . L'annotazione @ApiMetricCost prevede i seguenti attributi:
|
metricCosts = { @ApiMetricCost(name = read-requests", cost = 1) } |
name |
Il nome di questo metodo nella libreria client generata. Viene automaticamente preceduto dal nome dell'API per creare un nome univoco per il metodo. Il valore name :
name , viene utilizzato il valore predefinito myapi . |
name = "foosBall.list" |
path |
Il percorso URI da utilizzare per accedere a questo metodo. Se non imposti questa opzione, viene utilizzato un percorso predefinito basato sul nome del metodo Java. Se prevedi di aggiungere la gestione delle API, non includere una barra finale nel percorso. | path = "foos" |
scopes |
Specifica uno o più ambiti OAuth 2.0, uno dei quali è obbligatorio per chiamare questo metodo. Se imposti scopes per un metodo, questo sostituisce l'impostazione nell'annotazione @Api . Se definisci più di un ambito, tieni presente che il controllo dell'ambito viene superato se il token viene emesso per qualsiasi degli ambiti specificati. Per richiedere più ambiti, specifica un singolo String con uno spazio tra ogni ambito. |
scopes = {"ss0", "ss1 and_ss2"} |
Esempio di annotazione @ApiMethod
Questa annotazione viene posizionata prima della definizione del metodo all'interno di una classe:
I metodi che prendono un'entità come parametro devono usare HttpMethod.POST
(per le operazioni di inserimento) o HttpMethod.PUT
(per le operazioni di aggiornamento):
@Named
L'annotazione @Named
è obbligatoria per tutti i parametri di tipo non entità passati ai metodi lato server. Questa annotazione indica il nome del parametro nella
richiesta che viene inserito qui. Un parametro non annotato con @Named
viene inserito nell'intero oggetto della richiesta.
Importazioni richieste
Per utilizzare questa funzionalità, sono necessarie le seguenti importazioni:
import javax.inject.Named;
Questo esempio mostra l'utilizzo di @Named
:
dove @Named
specifica che solo il parametro id
viene inserito
nella richiesta.
@ApiLimitMetric
Questa sezione descrive le annotazioni necessarie per definire quote per l'API. Consulta la sezione Configurazione delle quote per tutti i passaggi necessari per impostare una quota.
Assegni l'annotazione @ApiLimitMetric
a limitDefinitions
attributo del
Annotazioni con ambito API.
Devi anche aggiungere @ApiMetricCost
alle annotazioni @ApiMethod
per ogni metodo a cui vuoi applicare una quota.
Importazioni obbligatorie
Per utilizzare questa funzionalità, è necessaria la seguente importazione:
import com.google.api.server.spi.config.ApiLimitMetric;
Attributi
Attributi @ApiLimitMetric
|
Descrizione |
---|---|
nome | Il nome della quota. In genere, si tratta del tipo di richiesta (ad esempio "read-requests" o "write-requests") che identifica in modo univoco la quota |
displayName | Il testo visualizzato per identificare la quota nella scheda Quote nella pagina Endpoints > Servizi della console Google Cloud. Questo
anche il testo è
mostrati ai consumatori della tua API nella pagina Quote di
IAM e amministratore, API e i servizi di machine learning. Il nome visualizzato deve contenere al massimo 40 caratteri. Per motivi di leggibilità, il testo "al minuto per progetto" viene aggiunto automaticamente al nome visualizzato nelle pagine Quote. Per mantenere la coerenza con i nomi visualizzati dei servizi Google elencati nella nelle pagine di quote visualizzate dai consumatori della tua API, ti consigliamo per il nome visualizzato:
|
limite | Un valore intero che corrisponde al numero massimo di richieste al minuto per progetto consumer per la quota. |
Esempio
limitDefinitions = {
@ApiLimitMetric(
name = "read-requests",
displayName = "Read requests",
limit = 1000),
@ApiLimitMetric(
name = "write-requests",
displayName = "Write requests",
limit = 50),
}
@ApiNamespace
L'annotazione @ApiNamespace
fa sì che le librerie client generate abbiano lo spazio dei nomi specificato anziché uno predefinito creato durante la generazione della libreria client.
Per impostazione predefinita, se non usi questa annotazione, lo spazio dei nomi utilizzato è
invertito di your-project-id.appspot.com
. In altre parole, il percorso del pacchetto è
com.appspot.your-project-id.yourApi
.
Puoi modificare lo spazio dei nomi predefinito fornendo l'annotazione @ApiNamespace
all'interno dell'annotazione @Api
:
Imposta l'attributo ownerDomain
sul dominio della tua azienda e ownerName
al nome della tua azienda, ad esempio your-company.com
. L'inverso
ownerDomain
viene utilizzato per il percorso del pacchetto: com.your-company.yourApi
.
Se vuoi, puoi utilizzare l'attributo packagePath
per specificare un ambito più ampio.
Ad esempio, impostando packagePath
su cloud
, il percorso del pacchetto utilizzato nella
libreria client è com.your-company.cloud.yourApi
. Puoi aggiungere altri valori al percorso del pacchetto specificando il delimitatore /
: packagePath="cloud/platform"
.
@Nullable
Questa annotazione indica che un parametro di un metodo è facoltativo (e
quindi un parametro di query). @Nullable
può essere utilizzato solo con @Named
parametri.
@ApiClass
In un'API multiclasse, puoi utilizzare @ApiClass
per specificare proprietà diverse per una determinata classe, sostituendo le proprietà equivalenti nella configurazione @Api
. Consulta:
Utilizzare @ApiClass
per le proprietà che possono differire tra le classi
per una descrizione completa dell'annotazione.
@ApiReference
In un
API multiclasse,
puoi usare @ApiReference
per
forniscono un metodo alternativo di ereditarietà dell'annotazione. Consulta:
Utilizzo dell'ereditarietà @ApiReference
per una descrizione completa dell'annotazione.
@ApiResourceProperty
@ApiResourceProperty
consente di controllare il modo in cui le proprietà delle risorse vengono esposte nell'API.
Puoi utilizzarlo in un getter o un setter di proprietà per omettere la proprietà da una
risorsa API. Puoi usarlo anche nel campo stesso, se è privato,
per esporlo nell'API. Puoi utilizzare questa annotazione anche per modificare il nome
di una proprietà in una risorsa API.
Importazioni richieste
Per utilizzare questa funzionalità, sono necessarie le seguenti importazioni:
import com.google.api.server.spi.config.ApiResourceProperty;
import com.google.api.server.spi.config.AnnotationBoolean;
Attributi
Attributi @ApiResourceProperty | Descrizione | Esempio |
---|---|---|
ignored |
Se impostato su AnnotationBoolean.TRUE , la proprietà viene omessa. Se non viene specificato o viene impostato su AnnotationBoolean.FALSE , la proprietà non viene omessa. |
@ApiResourceProperty(ignored = AnnotationBoolean.TRUE) |
name |
Se specificato, indica il nome della proprietà da esporre nell'API. | @ApiResourceProperty(name = "baz") |
Esempio di lezione con @ApiResourceProperty
Lo snippet seguente mostra una classe con getter delle proprietà annotati con
@ApiResourceProperty
:
Nello snippet di codice precedente, @ApiResourceProperty
viene applicato al getter getBin
per la proprietà bin
, con l'impostazione dell'attributo ignored
che indica a Endpoints Frameworks di omettere questa proprietà nella risorsa API.
@ApiResourceProperty
viene applicato anche al campo privato visible
, che
non ha getter o setter. L'utilizzo di questa annotazione espone il campo come
nella risorsa API.
Nello stesso snippet, viene applicato anche @ApiResourceProperty
a un getter diverso, getFoobar
, che restituisce un valore di proprietà
per la proprietà foobar
. L'attributo name
in questa annotazione indica a Endpoints Frameworks di modificare il nome della proprietà nella risorsa API. Il valore della proprietà rimane invariato.
Nello snippet di esempio precedente, la rappresentazione JSON di un oggetto Resp
è simile a questo:
{"baz": "foobar", "visible": "nothidden"}
@ApiTransformer
L'annotazione @ApiTransformer
personalizza il modo in cui un tipo viene esposto in Endpoints tramite
la trasformazione in un altro tipo e viceversa. Il trasformatore specificato deve essere un'implementazione di com.google.api.server.spi.config.Transformer
.
L'utilizzo dell'annotazione @ApiTransformer
su una classe è il modo preferito per specificare un trasformatore. Tuttavia, in alternativa puoi specificare
trasformatore nell'attributo transformer
dell'oggetto
@Api
.
Importazioni richieste
Per utilizzare questa funzionalità, è necessaria la seguente importazione:
import com.google.api.server.spi.config.ApiTransformer;
Corso di esempio con @ApiTransformer
Il seguente snippet mostra un corso annotato con @ApiTransformer
:
Questa classe viene trasformata dalla classe BarTransformer
.
Classe del trasformatore Endpoints di esempio
Lo snippet seguente mostra una classe di trasformatori di esempio denominata BarTransformer
.
Questo è il trasformatore a cui fa riferimento @ApiTransformer
nello snippet precedente:
Supponendo che esista un oggetto con una proprietà bar
di tipo Bar
, senza il
trasformatore precedente, l'oggetto è rappresentato come:
{"bar": {"x": 1, "y": 2}}
Con il trasformatore, l'oggetto è rappresentato come segue:
{"bar": "1,2"}