Tworzę serwer w Golang przeznaczony dla aplikacji mobilnej. Muszę mieć możliwość obsługi wielu wersji interfejsu API w przypadkach, gdy użytkownicy nie aktualizują aplikacji. Głównym problemem związanym z wersją jest zwrócenie danych w odpowiednim formacie dla wersji aplikacji mobilnej.Jaki jest idomatyczny sposób obsługi wersji api w golangu?
Widziałem, że istnieją trzy podstawowe sposoby, aby to zrobić.
A. Jednym ze sposobów jest posiadanie jednego programu obsługi trasy na "/", a następnie zezwolenie tej funkcji na analizowanie adresu URL pod kątem wersjonowania.
przykład:
func main() {
http.HandleFunc("/", routes.ParseFullURI)
}
B. Zastosowanie biblioteki, takich jak goryl/multiplekser do obsługi wzory w routerze ale widział pewne warnings that this can be too slow.
Przykład:
func main() {
mux.HandleFunc("{version:}/", routes.ParseVersionForHome)
mux.HandleFunc("{version:}/getData", routes.ParseVersionForGetDAta)
mux.HandleFunc("{version:}/otherCall", routes.ParseVersionForOtherCall)
}
C. mają indywidualne adresy URL, które nie zmieniają, ale na podstawie nagłówka, podzielony na różnych wersjach. Przykład:
func main() {
http.HandleFunc("/", routes.ParseHeaderForVersionForHome)
http.HandleFunc("/getData", routes.ParseHeaderForVersionForGetData)
http.HandleFunc("/otherCall", routes.ParseHeaderForVersionForOtherCall)
}
Martwię się, że opcja 1 będzie zbyt niechlujny kod mądry. Obawiam się, że opcja 2 będzie zbyt powolna pod względem wydajności, i obawiam się, że opcja 3 będzie trudna do obsłużenia przez klienta lub stanie się niejasna, ponieważ wersja nie jest wyraźnie oznaczona.
Która metoda jest najbardziej idiomatyczna w przypadku Golanga i spowoduje największą wydajność aplikacji mobilnej, która będzie często sondowana?
Jeśli mówisz o API przez HTTP (S) to coś jak 'http://example.com/api/v1/ ... 'jest powszechne. A może bardziej pytasz, jak zaimplementować taki wzór na serwerze Go? –
Pytam, jak to zrobić w serwerze Go. Wyjaśnię dalej w moim pytaniu. – Avik
1 i 2 są w zasadzie równoważne, po prostu rutujesz sam w pierwszym. Jeśli goryl/mux jest zbyt wolny, nie używaj go (nawet domyślny HandleFunc używa "routera": 'http.ServeMux'). 3 nie ma nic wspólnego z Go, to tylko to, czy chcesz, aby twoi klienci używali nagłówków, czy nie (co nie powinno być wielkim problemem) – JimB