2015-04-21 29 views
5

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?

+2

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? –

+0

Pytam, jak to zrobić w serwerze Go. Wyjaśnię dalej w moim pytaniu. – Avik

+0

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

Odpowiedz

5

Istnieje wiele ram routingu, które pozwalają na grupy, na przykład z echem (bardzo dobre ramy, jeśli chcesz prędkość)

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") 
} 

myślę, że to jest dość czyste.

Jestem pewien, że wiele innych ram pozwala na to. Wiem na pewno, że martini, ale to nie jest idiomatyczny framework ...

+0

Dzięki. Teraz po prostu potrzebuję znaleźć najlepszą bibliotekę dla moich potrzeb, ale wydaje się to być najbardziej powszechnym podejściem do wersjonowania w Go. Lista bibliotek, które obsługują grupowanie i które są szybkie, wydaje się prawie nieskończona! – Avik

+0

Witam, szukałem w sieci i trudno mi zrozumieć, czy ping jest tą samą funkcją, a jeśli tak, to jak rozróżniam grupę, która go nazywa, aby zwracać różne wyniki. – Avik

+0

Ping jest tą samą funkcją. Z kontekstu ping możesz wyszukać podany adres URL. Zakładałem, że wywołasz różne funkcje dla różnych wersji. – placeybordeaux