Annotazioni e sintassi di Cloud Endpoints Frameworks

Le annotazioni di Endpoints Frameworks descrivono l'API la configurazione, i metodi, i parametri e altri dettagli fondamentali che definiscono le proprietà e il comportamento dell'endpoint.

Consulta Scrittura e annotazione del codice per informazioni sull'aggiunta di annotazioni utilizzando un progetto Maven. Gli elementi Maven App Engine Cloud Endpoints vengono forniti per creare e compilare un'API di backend e generare una libreria client.

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 esposte 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 salvo diversa indicazione 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ù, consulta 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 si autentica utilizzando Firebase, Auth0 o account di servizio. Questo attributo non è obbligatorio se la tua API si autentica utilizzando 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 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 backend continua a utilizzare il valore specificato nella proprietà name.

Ad esempio, se l'API name è impostata su dfaanalytics, potresti 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 caratteri cammelli o trattini bassi appropriati.
canonicalName = "DFA Analytics:"n
clientIds Obbligatorio se l'API utilizza l'autenticazione. Elenco di ID client per i client autorizzati a richiedere i token. Per saperne di più, consulta 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 nel caso in cui non ne venga specificata nessuna 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 l'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:
  • Deve iniziare con il minuscolo
  • Deve corrispondere all'espressione regolare [a-z]+[A-Za-z0-9]*
Se non specifichi name, viene utilizzato il valore predefinito myapi.
name = "foosBall"
namespace Configura lo spazio dei nomi per i client generati. Consulta @ApiNamespace. namespace=@ApiNamespace(ownerDomain="your-company.com", ownerName="YourCo", packagePath="cloud/platform")
root 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>
scopes Se non viene specificato, il valore predefinito è l'ambito email (https://www.googleapis.com/auth/userinfo.email), obbligatorio per OAuth. Se vuoi, puoi eseguire l'override di questa impostazione 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 eseguire l'override degli ambiti specificati qui per un determinato metodo API, specifica ambiti diversi nell'annotazione @ApiMethod. scopes = {"ss0", "ss1 and_ss2"}
title Il testo visualizzato in Explorer API come titolo dell'API e visibile nei servizi di rilevamento e directory. title = "My Backend API"
transformers Specifica un elenco di transformer personalizzati. Tieni presente che è preferibile un'annotazione alternativa (@ApiTransformer). Questo attributo è stato sostituito da @ApiTransformer. transformers = {BazTransformer.class}
version Specifica la versione dell'endpoint. Se non fornisci questo indirizzo, viene utilizzato il valore predefinito v1. version = "v2"

Annotazione di esempio@Api

Questa annotazione è posizionata prima della definizione della classe:

/** An endpoint class we are exposing. */
@Api(name = "myApi",
    version = "v1",
    namespace = @ApiNamespace(ownerDomain = "helloworld.example.com",
        ownerName = "helloworld.example.com",
        packagePath = ""))

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 OAuth2 di Google ai fini dell'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 i chiamanti, devi per fornire un elenco di clientIds a cui è consentito richiedere token. Questo elenco dovrebbe essere composto da tutti gli ID cliente che hai ottenuto tramite Console Google Cloud per i tuoi client web o Android. Ciò significa che i client devono essere noti al momento della creazione 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 alle utilizzando l'Explorer API di Google, devi fornire il relativo ID client nel 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. Questo è il ID client web menzionato in Autenticazione API.

@ApiMethod: annotazioni con ambito a livello di metodo

L'annotazione @ApiMethod viene utilizzato per fornire una configurazione API diversa da quella predefinita fornita @Api o @ApiClass annotazioni. Tieni presente che è facoltativo: tutti sono pubblici, i metodi non statici e non bridge in una classe con un'annotazione @Api sono esposte nell'API, indipendentemente dal fatto che abbiano o meno un'annotazione @ApiMethod.

Gli attributi in questa annotazione ti consentono di configurare i dettagli di un singolo metodo API. Se lo stesso attributo viene specificato in @Api e @ApiMethod, @ApiMethod override.

Importazioni richieste

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ù, consulta 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 è obbligatorio se la tua API si autentica utilizzando token ID Google. Impostalo su {EspAuthenticator.class} oppure puoi scrivere il tuo autenticatore personalizzato, come descritto in Interface Authenticator authenticators = {EspAuthenticator.class}
clientIds Elenco di ID client per i client autorizzati a richiedere i 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'@ApiMetricCostannotazione prevede i seguenti attributi:
  • name: il nome specificato nell'annotazione ApiLimitMetric.
  • cost: un numero intero che specifica il costo per ogni richiesta. Il costo consente ai metodi di utilizzare tariffe diverse rispetto alla stessa quota. Ad esempio, se una quota ha un limite di 1000 e un costo pari a 1, l'applicazione chiamante può effettuare 1000 richieste al minuto prima di superare il limite. Con un costo di 2 per la stessa quota, un'applicazione chiamante può effettuare solo 500 richieste al minuto prima di superare il limite.
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:
  • Deve iniziare con il minuscolo
  • Deve corrispondere all'espressione regolare [a-z]+[A-Za-z0-9]*
Se non specifichi name, viene utilizzato il valore predefinito myapi.
name = "foosBall.list"
path Il percorso dell'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, l'impostazione nell'annotazione @Api viene ignorata. Se definisci più di un ambito, tieni presente che il controllo dell'ambito viene superato se il token viene generato 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 inserita prima della definizione del metodo all'interno di una classe:

/** A simple endpoint method that takes a name and says Hi back. */
@ApiMethod(
    name = "sayHiUser",
    httpMethod = ApiMethod.HttpMethod.GET)
public MyBean sayHiUser(@Named("name") String name, User user)
    throws OAuthRequestException, IOException {
  MyBean response = new MyBean();
  response.setData("Hi, " + name + "(" + user.getEmail() + ")");

  return response;
}

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):

@ApiMethod(
    name = "mybean.insert",
    path = "mybean",
    httpMethod = ApiMethod.HttpMethod.POST
)
public void insertFoo(MyBean foo) {
}

@Named

L'annotazione @Named è obbligatoria per tutti i parametri di tipo non entità passati a lato server. Questa annotazione indica il nome del parametro nel che viene inserita qui. Un parametro non annotato con @Named con l'intero oggetto della richiesta.

Importazioni obbligatorie

Per utilizzare questa funzionalità, sono necessarie le seguenti importazioni:

import javax.inject.Named;

Questo esempio mostra l'utilizzo di @Named:

/** A simple endpoint method that takes a name and says Hi back. */
@ApiMethod(name = "sayHi")
public MyBean sayHi(@Named("name") String name) {
  MyBean response = new MyBean();
  response.setData("Hi, " + name);

  return response;
}

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 Configurazione delle quote per tutti i passaggi necessari per configurare una quota.

Assegni l'annotazione @ApiLimitMetric a limitDefinitions attributo del Annotazioni con ambito API. Devi inoltre aggiungere @ApiMetricCost al @ApiMethod annotazioni per ciascun 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. Tipicamente, si tratta del tipo di richiesta (ad esempio, "richieste di lettura" o "richieste di scrittura") che identifica in modo univoco la quota
displayName Il testo visualizzato per identificare la quota nella scheda Quote su Endpoint > la pagina Servizi della console Google Cloud. Questo testo viene visualizzato anche per i consumatori della tua API nella pagina Quote di IAM e amministrazione e API e servizi. Il nome visualizzato deve essere al massimo 40 caratteri.
Ai fini della leggibilità, il testo "al minuto per progetto" sono aggiunto automaticamente al nome visualizzato nella scheda Quote pagine.
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:
  • Utilizza "Richieste" quando hai una sola metrica.
  • Se hai più metriche, ognuna dovrebbe descrivere il tipo di richiesta contengono la parola "richieste" (ad esempio "Richieste di lettura" o "Richieste di scrittura").
  • Utilizza "unità quota" anziché "richieste" quando uno dei costi per questa quota è maggiore di 1.
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

La @ApiNamespace fa sì che le librerie client generate abbiano lo spazio dei nomi che anziché un valore 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:

/** An endpoint class we are exposing. */
@Api(name = "myApi",
    version = "v1",
    namespace = @ApiNamespace(ownerDomain = "helloworld.example.com",
        ownerName = "helloworld.example.com",
        packagePath = ""))

Imposta l'attributo ownerDomain sul dominio della tua azienda e ownerName sul nome della tua azienda, ad esempio your-company.com. L'inverso ownerDomain viene utilizzato per il percorso del pacchetto: com.your-company.yourApi.

Facoltativamente, puoi utilizzare l'attributo packagePath per fornire ulteriori criteri di definizione dell'ambito. Ad esempio, se imposti packagePath su cloud, il percorso del pacchetto utilizzato nella specifica la libreria client è com.your-company.cloud.yourApi. Puoi aggiungere altri valori al percorso del pacchetto fornendo 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 usare @ApiClass per specificare proprietà diverse per una determinata classe, eseguendo l'override delle 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 utilizzare @ApiReference per fornire un metodo alternativo di ereditarietà delle annotazioni. Per una descrizione completa di questa annotazione, consulta Utilizzare l'eredità @ApiReference.

@ApiResourceProperty

@ApiResourceProperty fornisce il controllo su come 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 anche utilizzarlo sul 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 obbligatorie

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 è specificata o impostata su AnnotationBoolean.FALSE, la proprietà non viene omessa. @ApiResourceProperty(ignored = AnnotationBoolean.TRUE)
name Se fornito, specifica il nome della proprietà da esporre nell'API. @ApiResourceProperty(name = "baz")

Esempio di lezione con @ApiResourceProperty

Lo snippet seguente mostra una classe con getter di proprietà annotati con @ApiResourceProperty:


class Resp {
  private String foobar = "foobar";
  private String bin = "bin";

  @ApiResourceProperty
  private String visible = "nothidden";

  @ApiResourceProperty(ignored = AnnotationBoolean.TRUE)
  public String getBin() {
    return bin;
  }

  public void setBin(String bin) {
    this.bin = bin;
  }

  @ApiResourceProperty(name = "baz")
  public String getFoobar() {
    return foobar;
  }

  public void setFoobar(String foobar) {
    this.foobar = foobar;
  }
}

public Resp getResp() {
  return new Resp();
}

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 questo l'annotazione indica a Endpoints Frameworks di modificare il nome della proprietà in la risorsa API. Il valore della proprietà non è cambiato.

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 in una classe è il modo migliore per specificare un Transformer. Tuttavia, in alternativa puoi specificare trasformatore nell'attributo transformer dell'oggetto @Api.

Importazioni obbligatorie

Per utilizzare questa funzionalità, è necessaria la seguente importazione:

import com.google.api.server.spi.config.ApiTransformer;

Esempio di lezione con @ApiTransformer

Il seguente snippet mostra un corso annotato con @ApiTransformer:


@ApiTransformer(BarTransformer.class)
public class Bar {
  private final int x;
  private final int y;

  public Bar(int x, int y) {
    this.x = x;
    this.y = y;
  }

  public int getX() {
    return x;
  }

  public int getY() {
    return y;
  }
}

Questa classe viene trasformata dalla classe BarTransformer.

Esempio di classe transformer di Endpoints

Lo snippet seguente mostra una classe Transformer di esempio denominata BarTransformer. Questo è il trasformatore a cui fa riferimento @ApiTransformer nello snippet precedente:

public class BarTransformer implements Transformer<Bar, String> {
  public String transformTo(Bar in) {
    return in.getX() + "," + in.getY();
  }

  public Bar transformFrom(String in) {
    String[] xy = in.split(",");
    return new Bar(Integer.parseInt(xy[0]), Integer.parseInt(xy[1]));
  }
}

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"}