2015-04-21 7 views
5

Sto creando un server in Golang per un'app mobile. Devo essere in grado di supportare più versioni dell'API per i casi in cui gli utenti non aggiornano l'app. Il principale problema con il controllo delle versioni consiste nel restituire i dati nel formato corretto per la versione dell'app mobile.Qual è il modo idomatic per gestire le versioni di api in golang?

Ho visto che ci sono tre modi di base per farlo.
A. Un modo è di avere un gestore di route su "/", e quindi consentire a quella funzione di analizzare l'url per il controllo delle versioni.
Esempio:

func main() { 
http.HandleFunc("/", routes.ParseFullURI) 
} 

B. Usare una libreria come gorilla/mux per gestire i modelli all'interno del router, ma ho visto alcune warnings that this can be too slow.
Esempio:

func main() { 
      mux.HandleFunc("{version:}/", routes.ParseVersionForHome) 
      mux.HandleFunc("{version:}/getData", routes.ParseVersionForGetDAta) 
      mux.HandleFunc("{version:}/otherCall", routes.ParseVersionForOtherCall) 
      } 

C. Avere singoli URL che non cambiano, ma sulla base del colpo di testa, diviso in diverse versioni. Esempio:

func main() { 
    http.HandleFunc("/", routes.ParseHeaderForVersionForHome) 
    http.HandleFunc("/getData", routes.ParseHeaderForVersionForGetData) 
    http.HandleFunc("/otherCall", routes.ParseHeaderForVersionForOtherCall) 
} 

io sono preoccupato del fatto che l'opzione 1 sarà il codice troppo disordinato saggio. Sono preoccupato che l'opzione 2 sia troppo lenta per quanto riguarda le prestazioni, e sono preoccupato che l'opzione 3 sia difficile da gestire per il cliente, o si confonderà poiché la versione non è chiaramente etichettata.

Quale metodo è il più idiomatico per Golang e si tradurrà nella migliore prestazione per un'app mobile che eseguirà il polling spesso?

+2

Se stai parlando di un'API su HTTP (S), qualcosa come 'http://example.com/api/v1/ ... 'è comune. O stai chiedendo più come implementare un modello simile in un server Go? –

+0

Sto chiedendo come fare su di esso in un server Go. Spiegherò ulteriormente nella mia domanda. – Avik

+0

1 e 2 sono sostanzialmente equivalenti, stai solo eseguendo il routing nel primo. Se gorilla/mux è troppo lento, non usarlo (anche il HandleFunc predefinito utilizza un "router": 'http.ServeMux'). 3 non ha nulla a che fare con Go, è solo se vuoi che i tuoi clienti usino le intestazioni o meno (che non dovrebbe essere un grosso problema) – JimB

risposta

5

Ci sono molti quadri di routing che permettono per il raggruppamento, per esempio con eco (un ottimo quadro se si desidera che la velocità)

package main 

import "github.com/labstack/echo" 

func ping(c *echo.Context) { 
     c.String(200, "pong") 
} 

func main() { 
     e := echo.New() 

     v1 := e.Group("/v1") 
     v1.Get("/ping", ping) 

     v2 := e.Group("/v2") 
     v2.Get("/ping", ping) 

     e.Run(":4444") 
} 

Penso che questo è abbastanza pulito.

Sono sicuro che molti altri framework lo consentono. Lo so per certo, ma questo non è un framework idiomatico ...

+0

Grazie. Ora ho solo bisogno di trovare la migliore libreria per le mie esigenze, ma questo sembra essere l'approccio più comune al controllo delle versioni in Go. L'elenco di librerie che supportano il raggruppamento e che sono veloci sembrano quasi infinite! – Avik

+0

Ciao, ho cercato in rete, e ho difficoltà a capire se il ping è la stessa funzione, e se è così, come differenziare quale gruppo lo ha chiamato per restituire risultati diversi. – Avik

+0

Ping ha la stessa funzione. Dal contesto del ping è possibile cercare l'URL che è stato fornito. Supponevo che avresti chiamato funzioni diverse per versioni diverse. – placeybordeaux

Problemi correlati