ジンの枠組みシリーズ03:姿勢の変化は、ミドルウェアを理解します

ミドルウェアとは何ですか

ミドルウェア、英語の翻訳ミドルウェア、名前は、オブジェクトの真ん中に、そして誰それの真ん中に示唆するように?もともと、クライアントは、サーバ・インタフェースに直接要求することができます。

ファイル

それは、このようなロギング、障害処理として、いくつかの特別な処理を行うには、インターフェイスに到達する前に、今、ミドルウェアでのお尻は、その要求を傍受することができます。これは、それジンのフレームワークは、それを使用する方法で、ミドルウェアを伝えるために、今日のですか?

ファイル

ミドルウェアの使い方

我々は、すべてを見てgin方法の意志トーンDefault方法変数があり、engineそして二つの機能は、これらの2つの機能があり、ログのフレームワークとトラブルシューティングのミドルウェア。UseLoggerRecoverygin

func Default() *Engine {
	debugPrintWARNINGDefault()
	engine := New()
	engine.Use(Logger(), Recovery())
	return engine
}

これは、ミドルウェアの使用を呼び出すことで、非常に明確であるUse問題は、これら2つのミドルウェアに加えて、今ある、詠唱ライン上の方法をに行くことができますUse誰?我々は最初のミドルウェアそれを書かないでいいようにと、理解しやすいです。

ミドルウェアを書きます

シェーンを書く、製品MVPに注意を払うを行い、Nazanは、単純なループを記述し、要求インターセプト出力平也最帅ログは、製品をお届けすることができます。

ファイル

最初の公式見て、彼らが書く前LoggerRecovery塗装ひょうたんひしゃくのような書き方を、。

func Logger() HandlerFunc {
	return LoggerWithConfig(LoggerConfig{})
}

func Recovery() HandlerFunc {
	return RecoveryWithWriter(DefaultErrorWriter)
}

これは、両方の関数が返すことが判明HandlerFuncし、我々はうまく関数を記述模倣、タイプを。

func PingYe() gin.HandlerFunc {
	return func(c *gin.Context) {
		c.String(200, "平也最帅")
	}
}

非常に単純な、完成し、缶のmain中の関数Useそれ。

func main() {
	r := gin.Default()
	r.Use(PingYe())
	r.Run()
}

プロジェクト稼働して、アクセスlocalhsot:8080データをレンダリングする素晴らしい成功を見て。

ファイル

それはあまりにもシンプルですか?この混乱?私は10ああを打つことができます!

ファイル

私があなたに彼の人生のすべてを学ぶつもりだそうです。

深い読み

我々は2つのミドルウェアを定義した場合、フラットは、他の場所で最もハンサムで、また最もハンサムです。

func PingYe() gin.HandlerFunc {
	return func(c *gin.Context) {
		c.String(200, "平也最帅")
	}
}

func Where() gin.HandlerFunc {
	return func(c *gin.Context) {
		c.String(200, "在全宇宙")
	}
}

彼らはそれらをフレームに登録されたために、この時間は、我々はそれが最初の出力は以下となります推測平也最帅再輸出在全宇宙、右?はい、はい確かに。

func main() {
	r := gin.Default()
	r.Use(PingYe(), Where())
	r.Run()
}

しかし、私は順序、最初の出力についてどのように為替の前提の下で登録の順序を変更しない場合は在全宇宙、その後、出力平也最帅それ?これは、有名な使用Next方法を。その役割は、以下のミドルウェア、終了実行を実行してから次の論理を継続するために戻ってくることです。私は、それがああ〜ミドルウェアと呼ばれていた覚えています

func PingYe() gin.HandlerFunc {
  return func(c *gin.Context) {
    c.Next()
    c.String(200, "平也最帅")
  }
}

ファイル

アボート

もちろん、提供することに加えてNext、方法をしかし、理論的には、検証がまだ要求をブロックしたいと考えて失敗した後、これを行うには、許可検証ミドルウェアを取得するには、すべての後に、動作を中断する権利を持つべきです。だから、Abortそれは我々が探している途中ということです。上記の例を取る、平也最帅次の行の呼び出しAbort方法は、Whereミドルウェアは、力ではなくなるので、平坦も単なるハンサムです。

func PingYe() gin.HandlerFunc {
	return func(c *gin.Context) {
		c.String(200, "平也最帅")
		c.Abort()
	}
}

ファイル

ローカルミドルウェア

私は話をしたミドルウェア一部を適応することができませんミ​​ドルウェアルーティングシナリオを追加する必要はありません、すべてのルートに反映されます。そこで、我々は、ローカルとしてミドルウェアを追加できるようにする能力を持っている必要があります。

ファイル

ので、2つのインタフェースを定義するために来て、ミドルウェアを追加するためのインタフェースを実装ましてやknowunknownその中央を結ぶために、そのレベルは、全宇宙の最もハンサムになった後認識し、2つのシーンを知らないまた、理解のレベルを表すと、作品は、しても知りません。実装は、ルーティングパラメータプラスミドルウェア十分に懸命の背面に、非常に簡単です。

r.GET("know", PingYe(), Where())
r.GET("unknown", func(c *gin.Context) {
  c.String(200, "???")
})

インターフェイスのためのミドルウェアを追加することに加えて、あなたはまた、インターフェイスのセットを追加同じ呼び出すことができるUse方法であることができます。

v1 := r.Group("v1")
v1.Use(PingYe(), Where())
{
  v1.GET("/know", func(c *gin.Context) {
    c.String(200, "know")
  })
  v1.GET("/unknown", func(c *gin.Context) {
    c.String(200, "unknown")
  })
}

HTTP基本認証

知られている基本認証、BasicAuth基本認証インターフェイスを追加し、あなたがインターフェイスにアクセスするときにユーザー名とパスワードを提供します。

ファイル

ブラウザのユーザーのために、ユーザーエクスペリエンスのために自動的にログインボックスポップアップし、他のシーンでは、それがあるアカウントのパスワードを入力していませんか?実際に、それはヘッダ情報を透過し、ヘッダ情報は、基本認証を表す固定形式があります。

Authorization: Basic <凭证>

ドキュメントの部分はのユーザ名とパスワードの組み合わせであるbase64エンコーディング、両方のスプライスさコロン。しかし、ガチョウ、ginフレームワークBaseAuthミドルウェアすでに準備されたすべてのもの、それはわずか数行のコードは、基本的な認証情報を解決することができますすることができます。

func main() {
	r := gin.Default()
	r.Use(gin.BasicAuth(gin.Accounts{
		"pingye": "123",
	}))
	r.GET("/secrets", func(c *gin.Context) {
		user := c.MustGet(gin.AuthUserKey).(string)
		c.String(200, user+"已登录成功")
	})
	r.Run()
}

コード例の一部は、一部の学生は、次のような、理解できないことがありBasicAuth、基本的な認証はそれのためにユーザー名とパスワードが必要ですので、我々はを活用することができるように、メソッドのパラメータgin.Accountsアカウントのパスワードを確認する必要があると便利な構成で、gin.Accountsそれがマップタイプで、ユーザーのキーを代表します名前は、パスワード値は表して、もちろん、あなたが複数のキーと値のペアを設定することができ、あなたの好みに基づいて独自に設定します。

コードも登場しc.MustGetた方法を、このメソッドの役割は、我々は、パラメータを取得しなければならないということである、いずれかを取得していないpanic、それが何であるかを取るために、?つまりgin.AuthUserKey、公式の説明は、ユーザーの中に基本認証資格情報であるcookie名前。

// AuthUserKey is the cookie name for user credential in basic auth.
const AuthUserKey = "user"

オープンソース言語ライブラリプロジェクト「の一例で行くgolang-例」へようこそ〜星を

https://github.com/pingyeaa/golang-examples

その記事は、公開番号「レベルでもある」ゴー言語や技術的な原則を中心に、あなたに、歓迎の注意を支援する場合は、見ていただきありがとうございます。 私の関心

おすすめ

転載: www.cnblogs.com/pingyeaa/p/12667536.html