Se un servizio idempotente restituisce sempre lo stesso

8

Quando si progetta l'idempotenza degli endpoint REST è uno strumento cruciale. Diciamo che abbiamo un endpoint HTTP che accetta PUT che vorremmo essere idempotenti.

Nel caso in cui un client effettui la stessa richiesta più volte, il server dovrebbe sempre restituire lo stesso o è accettabile restituire un errore la seconda volta?

Se la risposta è sì, restapitutorial.com ha torto nello scrivere quanto segue?

"Da un punto di vista di servizio RESTful, affinché un'operazione (o una chiamata di servizio) sia idempotente, i clienti possono ripetere quella stessa chiamata ripetutamente mentre producono lo stesso risultato. In altre parole, fare richieste multiple identiche ha lo stesso effetto di fare una singola richiesta Si noti che mentre le operazioni idempotent producono lo stesso risultato sul server (senza effetti collaterali), la risposta stessa potrebbe non essere la stessa (ad esempio lo stato di una risorsa può cambiare tra le richieste "

Se la risposta è sì, un database di documenti implementa una concorrenza ottimistica usando get + put non idempotente in quanto la seconda chiamata darebbe luogo a un conflitto?

Se la risposta è sì, esiste un termine per i servizi che forniscono la minore forma di garanzia che fare la stessa richiesta più di una volta ha lo stesso effetto sullo stato del server di farlo esattamente una volta?

    
posta Esben Skov Pedersen 02.06.2016 - 22:57
fonte

4 risposte

5

Secondo la specifica HTTP 1.1 , l'idempotenza è definita come: "(a parte l'errore o problemi di scadenza) gli effetti collaterali di N > 0 richieste identiche sono le stesse di una singola richiesta ". Poiché questa definizione tratta solo gli effetti collaterali della richiesta e non il contenuto restituito, è accettabile restituire contenuti diversi.

    
risposta data 03.06.2016 - 09:25
fonte
7

Puoi restituire un errore sul secondo put ed essere ancora idempotente nel significato del termine quando applicato all'operazione http PUT.

In questo caso l'idempotenza si riferisce al risultato finale sul server della tua operazione. Ad esempio, se invii due richieste PUT identiche, solo una dovrebbe essere attivata.

L'azione dei client sul risultato restituito non fa parte dell'operazione idempotent.

Ovviamente, tecnicamente non è idempotente. Avrai scritto alcuni log, maybey restituito timestamp nelle intestazioni ecc ecc. Ma il significato del termine è solo azione PUT in cui dovresti agire due POST

    
risposta data 03.06.2016 - 00:17
fonte
1

Restituire la stessa risposta ti permetterà di semplificare l'implementazione del client in quanto sarebbe necessario impostare la richiesta come inviata nel suo database in entrambi nel caso in cui la risposta fosse stata ricevuta correttamente al primo tentativo e nel caso in cui la prima risposta fosse persa e nel prossimo tentativo la risposta è stata correttamente ottenuta.

    
risposta data 19.08.2018 - 11:11
fonte
-1

"Idempotente" significa che effettuare la chiamata non ha effetti collaterali.

Se la chiamata può restituire un errore, allora può restituire un errore sulla prima richiesta, la seconda richiesta, entrambe o nessuna. Potresti avere un token di accesso valido per 24 ore; una richiesta un millisecondo prima che il token si esaurisca riesce, una seconda richiesta dopo un millisecondo fallirà.

Tuttavia, "emempotent" significa che il fatto che hai fatto una richiesta non deve far fallire la seconda richiesta. E il fatto che tu abbia effettuato una richiesta non deve fare in modo che la seconda richiesta restituisca un risultato diverso.

E ovviamente una risorsa può essere modificata da più siti, è assolutamente soddisfacente se una richiesta restituisce lo stato corrente e la richiesta successiva restituisce il diverso stato di un secondo momento.

    
risposta data 03.06.2016 - 10:02
fonte

Leggi altre domande sui tag