2017-10-04 18 views
2

みなさん、こんにちは、私はセットアップに路線を持つ複数のサブドメインを必要とするプロジェクトに取り組んでいますジンルータとgolangで動的なサブドメインを処理するための最良の方法は何

。 2つのサブドメインを持つコードを試しましたが、私の場合は100のサブドメインになります。私はこのために次のコードを試しました:

package main 

import (
    "github.com/gin-gonic/gin" 
    "net/http" 
    "strings" 
) 

type Subdomains map[string]http.Handler 

func (subdomains Subdomains) ServeHTTP(w http.ResponseWriter, r *http.Request) { 
    domainParts := strings.Split(r.Host, ".") 

    if mux := subdomains[domainParts[0]]; mux != nil { 
     mux.ServeHTTP(w, r) 
    } else { 
     http.Error(w, "Not found", 404) 
    } 
} 

func main() { 
    r := gin.Default() 
    r2 := gin.Default() 
    hs := make(Subdomains) 
    hs["admin"] = r 
    hs["analytics"] = r2 
    r.GET("/ping", adminHandlerOne) 
    r2.GET("/ping", adminHandlerOne) 
    http.ListenAndServe(":9090", hs) 
} 
func adminHandlerOne(c *gin.Context) { 
    c.JSON(200, gin.H{ 
     "message": "pong", 
    }) 
} 

しかし、これは良くないと思います。誰かがこれを行う適切な方法を知っていますか?

+0

コードをテストしましたか? –

+0

@YandryPozoこんにちは、私のコードは私のためにうまく動作します。あなたはURLでテストすることができます。 http://admin.localhost:9090/ping、http://analytics.localhost:9090/ping。 – Swati

答えて

0

あなたはいくつかのオプションがあります(ルータを書き、ラッパーを書き、あなたの意志でジンを曲げようとします)、デフォルトのServeMuxがこれをサポートしているので、特にジンは本当に必要ありません。標準のルーターを使用します。最初にDefaultServeMuxのソースを見て、ルータがどれほどシンプルであるかというアイデアを得てください。ルータはハンドラへのパスマップです。

デフォルトのServeMuxは、実際にあなたが望むもの(ホストとパスのマッチングを許可する)を実行するので、最初に試してみることをお勧めします。あなたのパターンを登録します。

mux := http.NewServeMux() 
mux.HandleFunc("/", handlerRoot) 
mux.HandleFunc("analytics.example.com/", handlerOne) 
mux.HandleFunc("admin.example.com/", handlerTwo) 
err := http.ListenAndServe(":9090", mux) 
if err != nil { 
    panic(err) 
} 

は、(明らかにあなたではなく、直接よりも、エンコーダとJSONを書くかもしれないが、これは単なる一例です)いくつかのハンドラを書く:

func handlerOne(w http.ResponseWriter, r *http.Request) { 
    j := fmt.Sprintf(`{"one":"%s"}`, r.Host) 
    w.Header().Set("Content-Type", "application/json") 
    w.WriteHeader(http.StatusOK) 
    w.Write([]byte(j)) 
} 

あなたはその後、ローカルホスト上でこれをテストしている場合おそらくあなたの/ etc/hostsファイルを編集して、正しいホスト名でサーバーにヒットするようにしたいでしょう。

一緒にそれを置く、あなたがテストするには、このようなものを使用することができます

https://play.golang.org/p/ut-GT_s3Gf

注意したい場合は、これらのサブドメインは動的なものでした(100のプラスの言及は、私は、彼らがかもしれないと思わせます)、個別のハンドラを使用するのではなく、実行時にハンドラで動作をカスタマイズするだけで、ドメインがどのように動作するかによって異なります。

+0

あなたの答えは@ケニー・グラントに感謝します。 Default ServeMuxとあなたのコードをチェックしました。それは正常に動作しますが、私はジンを使用してサブドメインの部分を実装する必要が今、ジンのルータで私のアプリケーションを完了しました。あなたはジンでこれを完成させる方法を提供してください。 – Swati

+0

申し訳ありませんが、ジンは使用しないでください。それはドメインをサポートしていますか?もしそうなら、同様のことをしますか? –

関連する問題