Con un'API REST, esiste una convenzione per i client che convalida una richiesta senza apportare alcuna modifica?

3

Questo può essere più semplice da spiegare con un caso d'uso di esempio.

Diciamo che ho un sito di e-commerce in cui gli utenti possono aggiungere articoli al loro carrello. Quando aggiungi elementi al carrello, gli utenti possono digitare la quantità che desiderano aggiungere e quindi fare clic su un pulsante Add . Facendo clic su Add invierà una richiesta al server. Il server prima convaliderà che l'inventario corrente abbia abbastanza articoli per soddisfare la quantità richiesta, se ce ne sono abbastanza aggiunge l'articolo al carrello e restituisce una risposta corretta, altrimenti restituisce una risposta di errore.

Per migliorare l'esperienza utente, sarebbe bello convalidare la quantità inserita dall'utente prima ancora che facciano clic su Add . Ciò richiederebbe l'invio di una richiesta al server che verificherà se facendo clic su Add si verificherà un errore, ma non commetterà alcuna modifica al carrello se non ci sono errori.

Un collaboratore ha suggerito di aggiungere un parametro di query ?intent=validate a qualsiasi endpoint che richiede questo tipo di funzionalità. Sembra una buona idea perché non dovrò creare endpoint extra.

Esistono convenzioni comuni per le API REST per gestire questo tipo di richiesta di "convalida ma non commettere nulla"? L'approccio ?intent=validate aumenta le eventuali bandiere rosse?

UPDATE:

Grazie per il feedback, ma probabilmente dovrei chiarire alcune cose.

  1. Non sto davvero lavorando su un sito di e-commerce, l'ho usato solo per un esempio facile da spiegare. In realtà sto lavorando con una piattaforma di gestione dei documenti.
  2. Gli utenti potrebbero richiedere azioni collettive come spostare 100 documenti e cartelle in una cartella. Ci sono molte cose che devono essere convalidate per qualsiasi richiesta di questo tipo, come i diritti dell'utente su documenti e cartelle, collisioni di nomi, non spostare una cartella in se stessa, ecc. Quindi voglio veramente convalidare ogni volta che un utente controlla una casella un elenco di documenti da spostare.
  3. L'API continuerà a essere valida quando un utente fa clic su Submit per confermare le modifiche, perché ci sono altri utenti che eseguono azioni contemporaneamente. Il punto è fornire agli utenti un feedback tempestivo, in modo che non passino il tempo a controllare 100 caselle solo per scoprire che devono rinominare 2 dei documenti prima di impegnarsi.
  4. Ci sono molte altre richieste di massa in questo sistema che devono essere trattate allo stesso modo, come la modifica dei diritti degli utenti sugli oggetti, le eliminazioni di massa, l'assegnazione di più utenti a gruppi di utenti, ecc. Sarebbe bello se ogni tipo di richiesta non ha richiesto convalida e commit endpoint separati.
posta JamesFaix 23.09.2017 - 18:24
fonte

4 risposte

3

With a REST API, is there a convention for clients validate a request without committing any changes?

Non proprio, non nel modo in cui intendi. REST non si cura di quale ortografia stai usando per i tuoi identificatori; in REST, l'URI è opaco. Il client segue semplicemente i collegamenti forniti.

Quindi potresti inviare i dati di convalida a /c255ed19-d6b0-4666-b9cc-abc48d4246ae e la richiesta "fai" a fbb43bdf-0016-4aa1-9f55-28b884238d40 e, per quanto riguarda REST, tali ortografie sono fine .

Quindi la modifica dell'identificativo della risorsa per includere un parametro intent=validate nell'URI va bene. Se invece hai deciso di distinguere l'intenzione utilizzando una diversa ortografia nei segmenti del percorso, va bene anche questo. REST non cura ; qualsiasi significato codificato nell'URI viene fatto a discrezione del server e per il suo uso esclusivo.

Naturalmente, se l'ortografia dell'URI è opaca, allora l'ortografia non comunica alcuna semantica utile. Ci deve essere un ulteriore livello di riferimento indiretto da qualche parte; in REST, che da qualche parte c'è un link - il tipo di relazione è l'informazione fuori banda su cui il client e il server concordano in anticipo. In un caso ideale, la relazione di cui hai bisogno è già standardizzata; puoi controllare nel registro delle relazioni dei link per vedere se ci sono le informazioni che ti servono. In caso contrario, puoi creare un tipo di relazione di estensione su misura e assegnargli un significato.

<link rel="http://example.org/relations/validateOrder" target="/c255ed19-d6b0-4666-b9cc-abc48d4246ae" />
<link rel="http://example.org/relations/placeOrder" target="/fbb43bdf-0016-4aa1-9f55-28b884238d40" />

Puoi modificare i tuoi identificatori per definire queste relazioni oppure puoi cercare le corrispondenze tra gli schemi già esistenti

<link rel="http://schema.org/CheckAction" target="/c255ed19-d6b0-4666-b9cc-abc48d4246ae" />
<link rel="http://schema.org/OrderAction" target="/fbb43bdf-0016-4aa1-9f55-28b884238d40" />
    
risposta data 24.09.2017 - 16:50
fonte
1

Il problema con il tuo messaggio di convalida è che sarà immediatamente superato.

Solitamente i siti di e-commerce accettano il tuo ordine a prescindere dai livelli delle scorte in quanto possono sempre ordinare più scorte, ritardare la consegna o, in ultima istanza, solo inviare e-mail scuse.

Se hai bisogno di implementarlo, vorrei avere un messaggio di richiesta di riserva separato.

    
risposta data 23.09.2017 - 21:21
fonte
1

Per le richieste GET è possibile utilizzare il verbo HEAD poiché questo è più o meno quello a cui è destinato (ad es. dovrebbe fornire un codice di stato del server). Per POST si potrebbe provare a rotolare OPZIONI.

Tuttavia, credo che in gran parte queste siano semantiche. Perché specifico per un determinato caso d'uso hai effettivamente bisogno di due API distinte - /validate e /order , entrambi che accettano le richieste POST. Questo esprime l'intento nel modo più chiaro.

    
risposta data 24.09.2017 - 01:32
fonte
-2

Risposta per problemi di gestione dei documenti.

Devi convalidare il lato client con la logica js, inviare la richiesta, convalidare lato server, generare un errore di convalida se c'è un problema.

È possibile saltare la convalida del lato client, ma rende complicato il messaggio di ritorno dal server poiché si desidera un elenco dei guasti di convalida.

È molto più pulito da lanciare sul primo errore e restituire un singolo errore. Ma ovviamente questo porta a una cattiva esperienza utente di correggere, inviare, correggere, inviare ...

La convalida lato client ti consente di avere l'aspettativa che la tua presentazione abbia esito positivo e fallire solo nei casi rari, speranzosi, in cui qualcosa è cambiato sul server dato che hai ottenuto la logica e i dati richiesti per la verifica lato client.

Ovviamente per fare questa convalida il cliente ha bisogno di ulteriori informazioni, ad esempio l'elenco dei file nella directory di destinazione. Dovrà ottenere queste informazioni tramite una richiesta separata.

Ma potresti considerare di usare websockets per aggiornare il client quando quell'elenco cambia sul server. Ciò manterrebbe il client aggiornato con le modifiche e riduce al minimo la possibilità di un errore lato server con il numero minimo di messaggi scambiati

    
risposta data 24.09.2017 - 10:47
fonte

Leggi altre domande sui tag