サービスマルチプレクサ
サービスマルチプレクサ
goa HTTP リクエストマルチプレクサは、やってくるリクエストの正しいコントローラアクションへの発送を管理しています。 それは、よく使う HTTP メソッドとハンドラへのパスのバインディングを掌握した goa ServeMux を実装し、登録されたハンドラを検索する機能も提供します。
ServeMux
インタフェースの Handle メソッドは、リクエスト HTTP メソッドを MuxHandler へのパスに関連づけます。MuxHandler は HTTP レスポンスライターならびにリクエスト、すべてのパスやクエリパラメータを含む URL Value インスタンスを受け付ける関数です。
goagen
によって生成されたコードは自動的に Handle
関数を呼び出します。
この関数を直接呼び出すことは、生成されたものでないハンドラ、たとえばサードパーティのパッケージからのサポート機能を提供するようなハンドラ、をマウントする場合にのみ必要です。
特に、標準 HTTP パッケージから HTTP ハンドラをラップすることは簡単です:
// assetHandler returns the handler in charge of serving static assets.
func assetHandler() goa.MuxHandler {
base := "/path/to/website/static/files"
h := gzip.FileServer(http.Dir(base))
return func(rw http.ResponseWriter, req *http.Request, v url.Values) {
h.ServeHTTP(rw, req)
}
}
そのようなハンドラはサービスマルチプレクサにマウントすることができます:
func main() {
service := goa.New("Service with assets")
service.Mux.Handle("GET", "/static/*asset", assetHandler())
// ...
}
NotFound の処理
ServeMux
インタフェースは、HandleNotFound
メソッドも公開しています。
HandleNotFound
メソッドは、登録されたハンドラーに対応しないパスにリクエストが送信されたときに呼び出されるハンドラーを設定します。
Service
データ構造体は、その機能を利用して、ステータスコード 404 のレスポンスを返す一般的な NotFound ハンドラを登録します。