Go: servizio di design API con codice minimo ripetibile

-1

Devo creare un servizio che esponga un'API (REST). Utilizzerà MongoDB come database e structs come modello di dati. Il problema è che non riesco davvero a trovare una buona soluzione per rendere il CRUD di base non ripetibile. Ad esempio:

Ho 3 struct (ModelA, ModelB, ModelC) Ciascuno funge da modello per un documento db. Devo esporre un'API in cui l'utente può aggiungere, modificare, elencare ed eliminare documenti. Anche con paginazione e filtraggio. Ho creato un gestore per ogni URL API. Diciamo che gli URL per la gestione di ogni modello sono:

  • / model_a / {: id}
  • / model_b / {: id}
  • / model_c / {: id}

Se chiamo GET /model_a/ , dovrebbe elencare tutti i documenti ModelA . Inoltre posso passare alcuni argomenti per filtrare la lista. Se chiamo GET /model_b/ , dovrebbe fare lo stesso, ma per ModelB documenti. Il codice per due gestori è fondamentalmente lo stesso. E voglio semplificarlo un po '.

Stavo cercando di creare alcuni metodi generici con interface{} come argomento a cui posso passare una variabile di tipo di modello. Ecco un esempio semplificato:

func (r *Routes) GetHandler () {
   var model models.modela
   r.GetList(&model)
}

func (r *Routes) GetList (m interface{}) {
   ...
}

Ma genera molti problemi e sento davvero che questo non è l'approccio corretto. Anche in questo modo ho perso i vantaggi del tipo struct su cui JSON deve essere eseguito il marshalling.

Ho dedicato molto tempo alla ricerca e non riesco a trovare alcun buon esempio su come scrivere un'API con più strutture. Tutto quello che ho trovato (anche nei libri) è come creare handler, listener http e cose del genere. Ma questo è quello che so. Ho bisogno di imparare come progettare qualcosa di più grande della semplice API.

Se qualcuno sa dove posso trovare tale conoscenza o qualsiasi cosa che possa aiutarmi a capire un approccio un po 'più corretto nel progettare una buona API in Go, apprezzerei proprio questo.

    
posta mkatanski 15.08.2017 - 22:27
fonte

3 risposte

1

Sto assumendo che tu sia interessato a fornire un'interfaccia RESTful a diversi oggetti di dominio che sono memorizzati in un database Mongo DB.

Da una prospettiva di progettazione RESTful, le operazioni CRUD corrispondono a diversi metodi HTTP. Ad esempio:

GET / persona

Ottiene l'elenco di tutti gli oggetti Person dal database (Mongo DB)

GET / person / {id}

Disegna un solo oggetto Person dal database

PUT / person / {id}

Aggiornamenti (operazione idempotente) un oggetto Persona nel database per l'ID specificato

DELETE / person / {id}

Rimuove il record di oggetto Person con l'ID specificato

POST / person

Crea un nuovo record e restituisce l'oggetto Person con un ID associato al record nel DB.

Perché stai cercando di non duplicare gli sforzi nello scrivere codice più e più volte per operazioni simili su diversi oggetti del Modello. Penso che dare un'occhiata alle API come link ti darebbe un modo dichiarativo di programmare. Tutto quello che devi fare è creare un'interfaccia con il Modello che vuoi che l'API RESTFul esponga e il framework si occupa di generare implementazioni su quell'interfaccia.

Eliminando così la necessità del codice della piastra di pollo. Ti incoraggerei a sfruttare il supporto offerto da Spring per i servizi web RESTFul (non sono interessato a Go! Forse c'è anche il supporto per Go!)

Tienici informati su come procede la ricerca e potremmo essere in grado di aiutarti ulteriormente.

    
risposta data 22.08.2017 - 00:56
fonte
0

Potresti creare un servizio S (che esporrà l'API REST), usando Go e structs. Quindi, puoi creare un modulo M, che riceve / recupera JSON e utilizza internamente MongoDB.

Potresti eseguire tutte le specifiche per ogni tipo all'interno di S; il CRUD all'interno del modulo M può essere implementato senza problemi poiché utilizza JSON, quindi non è necessario ripetere il codice.

Ciò che non è chiaro per me è ciò di cui hai bisogno all'interno del tuo servizio oltre al CRUD. Forse con più informazioni potremmo fornire una risposta migliore.

    
risposta data 21.08.2017 - 20:51
fonte
-2

Hai conosciuto Graphql? Questa soluzione gestisce l'API di operazione dati. Penso che ti aiuti a risparmiare e ridurre il codice ripetuto.

    
risposta data 22.08.2017 - 04:32
fonte

Leggi altre domande sui tag