API di supporto: sfide specifiche per dispositivi mobili

25

Sto lavorando a un nuovo progetto per app iOS, sul lato mobile. Alcuni cambiamenti di architettura stanno accadendo e si scoprirà che dovremo fare affidamento su un'API privata personalizzata che verrà utilizzata dall'app che stiamo costruendo e anche da altri client come un sito web.

L'API che viene progettata segue lo stile Rest di operazioni URI centrate sulle risorse e CRUD mappate ai verbi HTTP. cose come:

GET www.example.com/books
DELETE www.example.com/books/482094
POST www.example.com/users/6793

Il problema è che questo stile porta spesso alla necessità che il client mobile faccia molte richieste per caricare una singola schermata dell'app o gestire un'azione dell'interfaccia utente singola. Questo porta l'app in modalità di caricamento per 8 secondi finché non ha tutto il necessario. Un'app lenta e non reattiva.

I client mobili hanno serie limitazioni quando si tratta di connettività e quindi idealmente, dovremmo seguire questo tipo di regola:

1 schermata == 1 chiamata API

1 salvataggio == 1 chiamata API.

Ci sono molte situazioni in cui questo ti mette in rotta di collisione con i principi di progettazione REST, per esempio:

  • diciamo che la tua app è offline da un giorno e devi eseguire la sincronizzazione con quattro tabelle dei database di back-end e hai bisogno di una chiamata come %codice%
  • diciamo che c'è una schermata in cui l'utente può modificare molti dei suoi oggetti, ad esempio ticchettando le attività nella sua lista di cose da fare. dovrebbe esserci un modo per modificare tutti i record di attività in un'unica chiamata API batch piuttosto che una chiamata API per modifica.
  • diciamo che c'è uno schermo mescola le informazioni dalle tabelle db ORDINE, VENDITE e PRODOTTO, i dovrebbe ottenere quei dati in una chiamata invece di tre.

il rischio è che potremmo ritrovarci con l'API più riposante che ci sia e anche l'app mobile più insensibile e inutile che ci sia.

Il fatto è che sono solo un nuovo appaltatore lì e quello di cui ho bisogno è qualcosa che mi aiuti a rendere quei punti, alcuni articoli da fonti ben rispettate o qualcosa del genere. Principali giocatori che hanno compromesso con lo stile REST per il loro client mobile (ad esempio utilizzando punti finali dell'API di aggregazione composita).

O qualsiasi soluzione per questo problema generale. Grazie!

    
posta MikaelW 08.08.2015 - 19:13
fonte

1 risposta

27

The API being designed follows the Rest style of resources-centric URI and CRUD operations mapped to HTTP verbs.

Questo è il tuo problema proprio qui.

Hai limitato le tue risorse a (presumo) i modelli nel tuo database. In quanto tale, impiegano anni a caricare tutte queste risorse perché il tuo server non ha alcun concetto di risorse che non hanno una rappresentazione nel database.

Ad esempio potrebbe avere

www.example.com/books/482094
www.example.com/books/582045
www.example.com/books/427454
www.example.com/books/319343

che tutti devono essere caricati per ottenere la mia libreria

Questo non è un problema con il progetto RESTful, questo è un vero anti-pattern REST. Non c'è assolutamente nulla in REST che dice che le nostre risorse devono avere un mapping uno a uno con qualsiasi altra cosa nel tuo sistema, inclusi i modelli di database.

La soluzione è creare più risorse che corrispondano meglio a ciò che si desidera caricare. Se hai 5 risorse che finiscono sempre insieme, crea una nuova risorsa che contiene le informazioni per quelle 5 risorse.

Quello che dovresti avere è qualcosa di simile

www.example.com/users/334/my_library

che carica solo tutti i libri per quell'utente. "my_library" non è un modello nel tuo database, ma è una risorsa. Il server lo crea in base ai modelli nel database ma non esiste una mappatura 1-a-1 e il server ha la flessibilità per creare questa risorsa senza modificare il modello DB.

Potresti anche avere

www.example.com/users/334/favioured_books
www.example.com/users/334/books_ordered_last_week
www.example.com/users/334/wishlist

nessuno dei quali deve esistere come modello nel tuo database o spazio di dominio.

Esiste un malinteso diffuso sul fatto che questa è la cosa sbagliata da fare perché framework come Rails insegnavano alle persone a mappare le risorse in modo 1 a 1 ai modelli nello spazio del dominio che mappano di nuovo 1-a-1 con il database filari. Questo non è necessario né è raccomandato.

Le risorse dovrebbero essere numerose, economiche e leggere . Dovrebbe essere facile crearli e dovrebbero essere estratti dal tuo modello di dominio. Se trovi che ne hai bisogno, ne fai uno nuovo. Se hai problemi a farlo, è colpa del tuo framework non un difetto con REST.

Ora il grande avvertimento con questo, naturalmente, è se la tua struttura ti permette di farlo. Strutture come Rails e Django che hanno preso il corso per mappare 1-a-1 al fine di "risparmiare tempo" rendono difficile farlo. Ma questo è un difetto con i framework, non con RESTful design.

Ecco Jim Webber che discute di questo è più dettagliato (compresi alcuni scavi anche su Rails!)

link

    
risposta data 13.08.2015 - 12:10
fonte

Leggi altre domande sui tag