L'API RESTful riceve richieste dalla condizione "modificata" dall'app mobile

0

Attualmente ho lo scenario seguente.

Ho due progetti: API Web ASP.NET Core e app Xamarin.Forms. L'idea generale è di avere un consumatore (app Xamarin.Forms) che sta ricevendo dati dal server (Web API).

Quello che voglio implementare è il modello di cache per l'app mobile. Diciamo che stiamo ricevendo alcuni prodotti dal server e quindi vogliamo memorizzarli nella cache, quindi la prossima volta che utilizzi l'app aperta non recupererà nuovamente tutti i prodotti.

Il problema si presenta quando questi prodotti vengono aggiornati, quindi vogliamo che la nostra app mobile rimanga sempre con i dati più recenti, ma aggiorna i prodotti solo se sono aggiornati. Per questo ho preso in considerazione l'utilizzo del controllo delle versioni sulle entità del mio database (prodotti). Ad esempio, la prima volta quando la richiesta di app per ottenere il prodotto invierà l'intestazione null della versione, l'API la individuerà, recupererà dal prodotto del database e la restituirà con la sua versione, ad esempio 5 . Dopo che il prodotto potrebbe essere aggiornato, la versione verrà aumentata con uno. Quando l'app invia una richiesta per ottenere di nuovo il prodotto, a seconda della versione dell'intestazione fornita nell'API otterrà i dati più recenti dal database o restituirà il codice di stato 304 NotModified .

Mentre stavo sviluppando questo scenario, ho deciso di cambiare "versione int" semplicemente "DateTime lastModified", che trovo un po 'più utile.

La mia lotta sta arrivando quando ho uno scenario con più elementi, diciamo che voglio ottenere tutti i prodotti dalla categoria. Quindi non sono sicuro di quale sia il caso migliore per risolvere questo problema. Mi aspettavo che il consumatore mi inviasse la raccolta con ID prodotto e l'ultima modificata, quindi posso scorrere tutte e controllare se qualcosa è cambiato. Un'altra opzione prevede che l'invio sia l'hash di quella raccolta, quindi sul lato server posso eseguire la ricerca hash e confrontare gli hash. Terza opzione è, se per ogni collezione ho una proprietà extra che contiene l'ultima modifica, ma poi avrò una colonna aggiuntiva nel database (SQL) per ogni relazione many e quindi la modifica del prodotto richiederebbe un codice aggiuntivo, per trovare tutto è relazioni e aggiorna tutte le proprietà.

Generalmente il mio problema è quando si tratta di collezioni.

Questo è ancora un buon modo per progettare un'applicazione? Quello che voglio ottenere è ridurre il traffico tra server e utenti.

Sono aperto per qualsiasi altro suggerimento!

Grazie in anticipo!

    
posta N Dermendzhiev 20.03.2018 - 22:42
fonte

1 risposta

2

La restful / HATEOS per rispondere a questo requisito è usare etag intestazione per memorizzare le informazioni sulla versione.

ETag: "686897696a7c876b7e"

Ogni volta che il client richiede una risorsa memorizzata nella cache, l'intestazione etag deve essere presente nella risposta. Dovrebbe sempre essere lo stesso valore finché le risorse rimangono le stesse. Quando la risorsa viene aggiornata, l'etag dovrebbe passare a un nuovo valore.

Per verificare se la risorsa è stata modificata, il client può inviare un'intestazione If-None-Match .

If-None-Match: "686897696a7c876b7e"

Il server quindi controlla l'intestazione e verifica se corrisponde al valore etag corrente. Se lo fa, dovrebbe rispondere con un'intestazione HTTP 304 ("non modificata"). In caso contrario, viene restituita la risorsa completa insieme al nuovo valore etag. Il client quindi memorizza nella cache la risorsa e l'etag.

    
risposta data 21.03.2018 - 00:12
fonte

Leggi altre domande sui tag