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?
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? –
Sto chiedendo come fare su di esso in un server Go. Spiegherò ulteriormente nella mia domanda. – Avik
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