2015-04-21 30 views
5

Golang'da bir mobil uygulama için tasarlanmış bir sunucu oluşturuyorum. Kullanıcıların uygulamayı güncellemedikleri durumlar için API'nın birden çok sürümünü desteklemem gerekiyor. Sürümle ilgili temel endişe, verileri mobil uygulamanın sürümü için doğru biçimde döndürmektir.Golang'da api sürümlerini işlemenin idiotik yolu nedir?

Bunu yapmanın üç temel yolu olduğunu gördüm.
A. Bir yol, "/" üzerinde bir yol işleyicisine sahip olmak ve bu işlevin, url'yi sürüm oluşturma için ayrıştırmasına izin vermektir.
Örnek:

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

B. kullanımı, söz konusu yönlendirici içinde modellerini ele goril/mux gibi bir kütüphane, ama bazı warnings that this can be too slow gördüm.
Örnek:

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

C. değişmez bireysel URL'ler var, ancak başlığında dayalı farklı sürümleri bölündü. Örnek:

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

O seçenek 1 akıllıca çok dağınık kod olacak endişeliyim. Ben seçenek 2 çok yavaş performans bilge olacak endişe duyuyorum ve ben seçenek açıkça açıkça etiketli olmadığı için, seçenek 3 işlemek için istemci zor ya da kafa karıştırıcı olacağını endişe ediyorum.

Hangi yöntem Golang için en idiomatik ve en sık karşılaşılan bir mobil uygulama için en yüksek performansla sonuçlanacak?

+2

HTTP (S) üzerinden bir API hakkında konuşuyorsanız, o zaman http://example.com/api/v1/ … 'Yaygındır. Yoksa böyle bir modeli Go sunucusunda nasıl uygulayacağınızı mı düşünüyorsunuz? –

+0

Bir Go Server'da bunun nasıl yapılacağını soruyorum. Sorumu daha da açıklayacağım. – Avik

+0

1 ve 2 temelde eşdeğerdir, sadece yönlendirmeyi kendiniz yapıyorsunuz. Eğer goril/mux çok yavaşsa, onu kullanmayın (varsayılan HandleFunc bile "yönlendirici" kullanıyor: 'http.ServeMux'). 3 Go ile hiçbir ilgisi yoktur, sadece istemcilerinizin üstbilgileri kullanmasını isteyip istemediğinizi (büyük bir anlaşma olmamalıdır) – JimB

cevap

5

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

Bu oldukça temiz olduğunu düşünüyorum (çok iyi bir çerçeve hızını istiyorsanız) echo ile örneğin gruplama için izin birçok yönlendirme çerçeveler vardır.

Eminim diğer birçok çerçeve buna izin veriyor. Martini'nin yaptığı bir gerçek için biliyorum, ama bu deyimsel bir çerçeve değil ...

+0

Teşekkürler. Şimdi sadece ihtiyaçlarım için en iyi kütüphaneyi bulmaya ihtiyacım var, ancak bu Go sürümünde en yaygın yaklaşım olarak görünüyor. Gruplamayı destekleyen ve hızlı olan kütüphanelerin listesi neredeyse bitmek tükenmek üzere! – Avik

+0

Merhaba, ping aynı işlev ise, net arama ve zor anlar geçiriyorum, ve eğer varsa, hangi gruba farklı sonuçlar döndürmek için aradım. – Avik

+0

Ping aynı işlevdir. Ping bağlamında verilen URL'ye bakabilirdiniz. Farklı sürümler için farklı işlevleri arayacağınızı varsayıyordum. – placeybordeaux