Questo capitolo illustra come utilizzare metodi personalizzati per le progettazioni di API.
Per metodi personalizzati si intendono i metodi API oltre ai cinque metodi standard. Loro deve essere utilizzato solo per funzionalità che non possono essere espresse facilmente con metodi standard. In generale, i progettisti di API devono scegliere i metodi standard rispetto a quelli personalizzati, se possibile. I metodi standard sono più semplici e una semantica ben definita con cui la maggior parte degli sviluppatori ha familiarità, quindi sono più facili da usare e meno soggetti a errori. Un altro vantaggio dei metodi standard è che la piattaforma API comprende meglio e supporta i metodi standard, come fatturazione, gestione degli errori, logging e monitoraggio.
Un metodo personalizzato può essere associato a una risorsa, una raccolta o un servizio. Potrebbe accettare una richiesta arbitraria e restituire una risposta arbitraria. supporta anche richieste e risposte di flussi di dati.
I nomi dei metodi personalizzati devono seguire convenzioni di denominazione dei metodi.
mappatura HTTP
Per i metodi personalizzati, devono utilizzare la seguente mappatura HTTP generica:
https://service.name/v1/some/resource/name:customVerb
Il motivo per utilizzare :
anziché /
per separare il verbo personalizzato dal
del nome della risorsa deve supportare percorsi arbitrari. Ad esempio, l'annullamento dell'eliminazione di un file può essere mappato a POST /files/a/long/file/name:undelete
Quando si sceglie il mapping HTTP, devono essere applicate le seguenti linee guida:
- I metodi personalizzati devono utilizzare il verbo HTTP
POST
poiché ha il semantica flessibile, ad eccezione dei metodi che fungono da get o list alternativo che possono utilizzareGET
quando possibile. (vedi il terzo punto per le specifiche). - I metodi personalizzati non devono utilizzare HTTP
PATCH
, ma possono utilizzare altri verbi HTTP. In questi casi, i metodi devono seguire lo standard semantica HTTP per quel verbo. - In particolare, i metodi personalizzati che utilizzano HTTP
GET
devono essere idempotenti e non hanno effetti collaterali. Ad esempio, i metodi personalizzati che implementano le viste speciali della risorsa devono utilizzare HTTPGET
. - I campi dei messaggi di richiesta che ricevono il nome della risorsa o raccolta a cui è associato il metodo personalizzato deve essere mappato al percorso dell'URL.
- Il percorso dell'URL deve terminare con un suffisso composto da due punti seguito dal verbo personalizzato.
- Se il verbo HTTP utilizzato per il metodo personalizzato consente una richiesta HTTP
(questo si applica a
POST
,PUT
,PATCH
o a un verbo HTTP personalizzato), La configurazione HTTP del metodo personalizzato deve utilizzarebody: "*"
e tutti i restanti campi dei messaggi di richiesta dovranno mapparsi Corpo della richiesta HTTP. - Se il verbo HTTP utilizzato per il metodo personalizzato non accetta un HTTP
corpo della richiesta (
GET
,DELETE
), la configurazione HTTP il metodo non deve utilizzare la clausolabody
e tutto il resto i campi dei messaggi di richiesta devono essere mappati ai parametri di ricerca dell'URL.
AVVISO: se un servizio implementa più API, il producer di API deve creare attentamente la configurazione del servizio per evitare conflitti con i verbi personalizzati tra le API.
// This is a service level custom method.
rpc Watch(WatchRequest) returns (WatchResponse) {
// Custom method maps to HTTP POST. All request parameters go into body.
option (google.api.http) = {
post: "/v1:watch"
body: "*"
};
}
// This is a collection level custom method.
rpc ClearEvents(ClearEventsRequest) returns (ClearEventsResponse) {
option (google.api.http) = {
post: "/v3/events:clear"
body: "*"
};
}
// This is a resource level custom method.
rpc CancelEvent(CancelEventRequest) returns (CancelEventResponse) {
option (google.api.http) = {
post: "/v3/{name=events/*}:cancel"
body: "*"
};
}
// This is a batch get custom method.
rpc BatchGetEvents(BatchGetEventsRequest) returns (BatchGetEventsResponse) {
// The batch get method maps to HTTP GET verb.
option (google.api.http) = {
get: "/v3/events:batchGet"
};
}
Casi d'uso
Ecco alcuni scenari aggiuntivi in cui i metodi personalizzati potrebbero essere la scelta giusta:
- Riavvia una macchina virtuale. Le alternative di progettazione potrebbero essere "crea una risorsa di riavvio in una raccolta di riavvii" che sembra complesso o "una macchina virtuale ha uno stato variabile che il client può aggiornare da IN ESECUZIONE a RIAVVIO" che domande aperte su quali altre transizioni di stato sono possibili. Inoltre, il riavvio è un concetto noto che può tradursi bene in un metodo personalizzato che soddisfi intuitivamente le aspettative degli sviluppatori.
- Invia email. La creazione di un messaggio email non deve necessariamente inviare (bozza). Rispetto all'alternativa progettuale (spostare un messaggio in "Posta in uscita" raccolta) ha il vantaggio di essere più rilevabili dall'utente dell'API e modella il concetto in modo più diretto.
- Promuovi un dipendente. Se implementato come standard
update
, il cliente dovrebbe replicare i criteri aziendali che disciplina il processo di promozione per garantire che si verifichi il livello corretto, nella stessa carriera e così via. - Metodi batch. Per i metodi critici per le prestazioni, potrebbe essere utile fornire metodi batch personalizzati per ridurre il sovraccarico per richiesta. Ad esempio: accounts.locations.batchGet.
Ecco alcuni esempi in cui un metodo standard è più adatto di un metodo personalizzato:
- Esegui query sulle risorse con parametri di ricerca diversi (utilizza
list
standard con il metodo standard di filtraggio degli elenchi). - Semplice modifica delle proprietà della risorsa (utilizza il metodo
update
standard con maschera dei campi). - Ignorare una notifica (utilizza il metodo
delete
standard).
Metodi personalizzati comuni
Di seguito è riportato l'elenco selezionato di nomi di metodi personalizzati di uso comune o utili. I progettisti di API devono prendere in considerazione questi nomi prima di introdurre per semplificare la coerenza tra le API.
Nome metodo | Verbo personalizzato | Verbo HTTP | Nota |
---|---|---|---|
Cancel |
:cancel |
POST |
Annullare un'operazione in sospeso, ad esempio operations.cancel . |
BatchGet |
:batchGet |
GET |
Acquisizione collettiva di più risorse. Consulta i dettagli nella descrizione dell'elenco. |
Move |
:move |
POST |
Spostare una risorsa da una risorsa all'altra, ad esempio folders.move . |
Search |
:search |
GET |
Alternativa all'elenco per il recupero dei dati che non ottempera alla semantica dell'elenco, ad esempio services.search . |
Undelete |
:undelete |
POST |
Ripristina una risorsa eliminata in precedenza, ad esempio services.undelete . Il periodo di conservazione consigliato è di 30 giorni. |