API "initialize" metodo: POST o GET?

2

Abbiamo affrontato un problema con un metodo "init" dell'API e abbiamo cercato di capire se è necessario utilizzare il metodo GET o POST http nel contesto di REST.

Preconditions: SPA sul frontend che comunica con il nostro back-end utilizzando l'API REST. SPA è pensato per funzionare con un servizio di terze parti tramite la nostra API.

Descrizione: quando l'utente carica la SPA, il frontend chiama il metodo API "init". Questo metodo effettua le seguenti operazioni:

  1. Verifica se l'utente è registrato sui servizi di terze parti.
  2. In caso contrario, registralo su tali servizi.
  3. Restituisce sempre una risposta "riuscita" (tranne che per errori interni del server o problemi durante la comunicazione con il servizio di terze parti).

La domanda è: possiamo usare il metodo GET per questo "init" o dovremmo usare il POST.

Questi sono pro e contro:

Perché OTTIENI :

  1. Possiamo usarlo durante l'inizializzazione della pagina (il POST può essere usato solo una volta caricata la pagina)
  2. Non inviamo dati per questo metodo (eccetto per i token utente nelle intestazioni)

Perché POST

  1. Sembra che dovremmo usare post in questi casi, perché fornisce un'inizializzazione di base, controlla se tutto va bene e non restituisce nulla finché non si verifica un errore interno.

Quindi non possiamo decidere, nel contesto delle specifiche REST, qual è il metodo http corretto per questa chiamata API: GET o POST? GET sembra più conveniente, ma non siamo sicuri che sia possibile utilizzare GET per questo metodo API secondo l'ideologia REST.

    
posta Hast 12.03.2018 - 18:02
fonte

5 risposte

2

La chiave della domanda sull'uso di GET è se la semantica dell'operazione è sicura :

Request methods are considered "safe" if their defined semantics are essentially read-only; i.e., the client does not request, and does not expect, any state change on the origin server as a result of applying a safe method to a target resource. Likewise, reasonable use of a safe method is not expected to cause any harm, loss of property, or unusual burden on the origin server.

The purpose of distinguishing between safe and unsafe methods is to allow automated retrieval processes (spiders) and cache performance optimization (pre-fetching) to work without fear of causing harm.

In breve: se utilizzi GET, comunichi ai clienti e ai componenti dell'intermediario che possono richiedere la risorsa ogni volta che lo desiderano, anche se il consumatore finale non l'ha richiesto.

Per definizione, i metodi sicuri sono necessariamente anche idempotenti

A request method is considered "idempotent" if the intended effect on the server of multiple identical requests with that method is the same as the effect for a single such request

Ad esempio, se il client invia una richiesta GET e non ottiene una risposta , si aspettano di essere in grado di inviare nuovamente la richiesta e ripeterla tutte le volte necessarie fino a quando arriva una risposta.

Se tali semantica non sono accettabili, probabilmente non dovresti utilizzare GET.

L'RFC 7231 offre un esempio di caso in cui la semantica "sicura" è appropriata anche se ci sono significativi effetti collaterali durante la gestione della richiesta

a safe request initiated by selecting an advertisement on the Web will often have the side effect of charging an advertising account.

Dalla tua descrizione, mi sembra che questo potrebbe essere un caso in cui GET è una scelta accettabile.

Agree with the idempotent analysis, but prefer PUT

Certamente "registrami se non registrato" è un'azione idempotente. Non mi è chiaro dalla descrizione se questa è una parte prevista del protocollo, o se è davvero un dettaglio di implementazione.

Ma la semantica di PUT non è solo "idempotente"; in particolare, implicano che il cliente capisca una rappresentazione appropriata della risorsa. Non è chiaro dalla descrizione originale se ci si aspetta che il cliente abbia familiarità con i dettagli della registrazione, o se si tratta di un dettaglio di implementazione del client.

Inoltre, il tipo di media più comune per le rappresentazioni ipermediali è ancora HTML e i moduli HTML don ' t supporto PUT . Pertanto, devi aumentare la tua rappresentazione con codice su richiesta , oppure è necessario sostituire le rappresentazioni con un altro tipo di supporto che supporti le azioni PUT.

Naturalmente, molte API scartano il vincolo ipermediale ; che rende il metodo PUT più appetibile.

Frontend should not bother about any registration things, it just says us: "okay, I'm here, do whatever you need to get ready to work". Does this mean we should use GET then?

Sospetto che sia così: la tua descrizione mi ricorda un sacco di cache di read-through; con il cliente che chiede "dammi la rappresentazione attuale" e il server che si preoccupa dei dettagli (abbiamo una rappresentazione corrente? dobbiamo riconvalidarlo?). Gran parte della potenza di REST deriva dalla sua semantica del caching.

Potrebbe essere utile rivedere questa osservazione da Roy Fielding nel 2002

HTTP does not attempt to require the results of a GET to be safe.
What it does is require that the semantics of the operation be safe, and therefore it is a fault of the implementation, not the interface or the user of that interface, if anything happens as a result that causes loss of property (money, BTW, is considered property for the sake of this definition).

    
risposta data 12.03.2018 - 19:39
fonte
4

La tua richiesta sta modificando lo stato dell'entità (registrazione), quindi ottieni non un metodo appropriato.

Utilizza il POST.

    
risposta data 12.03.2018 - 18:21
fonte
0

Per me sembra che il tuo metodo init faccia troppe cose.

Dividerò la funzionalità di init in due modi:

1) GET per controllare se l'utente è registrato. Questa è una semplice operazione di lettura più conforme alla specifica del metodo GET

2) Nel caso in cui non sia registrato, usa POST per registrarlo come dovresti scrivere sul lato server

    
risposta data 12.03.2018 - 18:22
fonte
0

Ecco i miei cinque centesimi.

GET - Requests data from a specified resource. -- W3Schools

Sei ingannato dal fatto che tu "richieda" i dati, perché in realtà usi alcuni dati per convalidarli.

We do not send any data for this method (except for user token in the headers)

Di più, stai facendo qualche logica iniziale contro di esso dopo.

1.Check if user registered on the 3-rd party services.

2.If it does not, register him on that services.

Anche un'ultima prova GET non è adatta secondo me.

3.Always return "successful" response (except for internal server errors or problems during the communication with the 3-rd party service).

restituire sempre lo stesso risultato è esattamente il comportamento che vuoi per GET, ma poi non ci sono dati che sono un po 'goffi perché vuoi ottenere qualcosa quando sei usando GET, giusto?

Ora vediamo il POST.

POST - Submits data to be processed to a specified resource. -- W3Schools

Quindi ora stai usando il tuo token per essere elaborato che altro sarebbe meglio se restituissi effettivamente la risorsa che hai appena creato (in caso di nuova registrazione ) o ottenuto (in caso di vecchio utente). Di solito questo è auspicabile quando si utilizza POST - > Stai postando dati e vuoi vedere il risultato di ciò che per me si adatta perfettamente al tuo caso.

Suppongo che tu stia usando Authorization header per memorizzare il tuo token, la sua non pessima idea di avere effettivamente Gateway API davanti ai tuoi servizi (API) che effettivamente convalida questo token e manda le sue affermazioni alle API dietro, quindi POST il metodo sarà ancora più ovvio secondo me.

In ogni caso, per me GET non è assolutamente adatto per questo caso. Ma non vedo l'ora di vedere altre opinioni.

    
risposta data 12.03.2018 - 18:26
fonte
-1

Nel contesto di REST, credo che questa operazione sia idempotente . Un utente può registrarsi solo una volta, corretto? Pertanto, PUT è indicato.

Alcune citazioni:

link

link

    
risposta data 12.03.2018 - 19:17
fonte

Leggi altre domande sui tag