ginvalidator を使用して Go での Jin 入力検証を簡素化する
概要
ginvalidator は、私の他のオープンソース パッケージ validatorgo が提供するバリデーターとサニタイザーの広範なコレクションをラップする、Gin ミドルウェアのセットです。また、JSON フィールド構文に人気のオープンソース パッケージ gjson を使用し、JSON オブジェクトからのデータの効率的なクエリと抽出を提供します。
Gin リクエストを検証してサニタイズできるように、これらをさまざまな方法で組み合わせることができ、リクエストが有効かどうか、バリデータに従ってどのデータが一致したかを判断するツールを提供します。
人気のある js/express ライブラリの Express-validator に基づいています
サポート
このバージョンの ginvalidator では、アプリケーションが Go 1.16 で実行されている必要があります。
また、Gin 1.x.x で動作することも確認されています。
理論的根拠
なぜ使用しないのでしょうか?
- 手書きバリデータ: 独自の検証ロジックを手動で作成することもできますが、繰り返しが多くなり、すぐに面倒になってしまいます。新しい検証が必要になるたびに、同じ種類のコードを何度も書くことになります。間違いを犯しやすく、それを維持するのは大変です。
- Gin の組み込みモデルのバインディングと検証: Gin には検証機能が組み込まれていますが、すべての人にとって理想的なわけではありません。構造体タグには制限があり、特に複雑なルールが必要な場合、コードが読みにくくなります。さらに、検証はモデルに強く結びつきすぎるため、柔軟性があまり良くありません。
- その他のライブラリ (Galidator など): 他にもライブラリはありますが、機能に対して複雑すぎると感じることがよくあります。特に検証のためのシンプルで単純なソリューションが必要な場合は、予想以上に多くのセットアップと作業が必要です。
インストール
マシンに Go がインストールされていることを確認してください。
ステップ 1: 新しい Go モジュールを作成する
- 任意の名前で空のフォルダーを作成します。
- ターミナルを開き、そのフォルダーに移動 (cd) し、新しい Go モジュールを初期化します。
go mod init example.com/learning
ステップ 2: 必要なパッケージをインストールする
go get を使用して、必要なパッケージをインストールします。
- ジンをインストールします:
go get -u github.com/gin-gonic/gin
- ginvalidator をインストールします。
go get -u github.com/bube054/ginvalidator
はじめる
何かを学ぶための最良の方法の 1 つは、例を見ることです。それでは、袖をまくってコーディングを始めましょう。
設定
最初に必要なのは、Gin サーバーを実行することです。誰かに挨拶するものを実装してみましょう。このためには、main.go を作成し、次のコードを追加します:
package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/hello", func(ctx *gin.Context) { person := ctx.Query("person") ctx.String(http.StatusOK, "Hello, %s!", person) }) r.Run() // listen and serve on 0.0.0.0:8080 }
ターミナルで go run main.go を実行して、このファイルを実行します。
go mod init example.com/learning
HTTP サーバーが実行されているはずです。http://localhost:8080/hello?person=John を開いて、John に挨拶できます。
? ヒント:
Go および Gin で Air を使用してライブ リロードを実装できます。ファイルが変更されるたびにサーバーが自動的に再起動されるため、自分でこれを行う必要はありません!
バリデーターの追加
サーバーは動作していますが、問題があります。最も注目すべきは、名前が設定されていない人に挨拶したくないということです。
たとえば、http://localhost:8080/hello にアクセスすると、「Hello, 」と表示されます。
そこで ginvalidator が役に立ちます。リクエストを検証するために使用されるバリデーター、サニタイザー、およびモディファイアーを提供します。
個人のクエリ文字列が空であってはいけないことをチェックするバリデーターと修飾子を追加しましょう。バリデーターの名前は Empty 、修飾子の名前は Not:
です。
go get -u github.com/gin-gonic/gin
? 注:
簡潔にするために、コード例では gv が ginvalidator のエイリアスとして使用されています。
次に、サーバーを再起動し、再度 http://localhost:8080/hello にアクセスします。うーん、まだ「Hello, !」と表示されます...なぜですか?
検証エラーの処理
ginvalidator 検証チェーンは、検証エラーをユーザーに自動的に報告しません。
その理由は簡単です。バリデーターを追加したり、フィールドを追加したりするときに、どのようにエラーを収集する必要があるでしょうか。すべてのエラーのリスト (フィールドごとに 1 つだけ、全体で 1 つだけ) が必要ですか...?
次の明らかなステップは、上記のコードを再度変更し、今回は ValidationResult 関数を使用して検証結果を検証することです。
go get -u github.com/bube054/ginvalidator
ここで、http://localhost:8080/hello に再度アクセスすると、わかりやすくするためにフォーマットされた次の JSON コンテンツが表示されます。
package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/hello", func(ctx *gin.Context) { person := ctx.Query("person") ctx.String(http.StatusOK, "Hello, %s!", person) }) r.Run() // listen and serve on 0.0.0.0:8080 }
さて、これが私たちに伝えていることは、
- このリクエストには 1 つだけエラーがありました;
- このフィールドは person と呼ばれます;
- クエリ文字列内にあります (場所: "queries");
- 表示されたエラー メッセージは「無効な値」でした。
これはより良いシナリオですが、まだ改善の余地があります。続けてみましょう。
より適切なエラー メッセージの作成
すべてのリクエスト位置バリデータは、オプションの 2 番目の引数を受け入れます。これは、エラー メッセージのフォーマットに使用される関数です。 nil が指定された場合、上記の例に示すように、デフォルトの汎用エラー メッセージが使用されます。
go run main.go
ここで http://localhost:8080/hello に再度アクセスすると、次の JSON コンテンツと新しいエラー メッセージが表示されます。
package main import ( "net/http" gv "github.com/bube054/ginvalidator" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/hello", gv.NewQuery("person", nil). Chain(). Not(). Empty(nil). Validate(), func(ctx *gin.Context) { person := ctx.Query("person") ctx.String(http.StatusOK, "Hello, %s!", person) }) r.Run() }
検証/サニタイズされたデータへのアクセス
GetMatchedData を使用すると、ginvalidator が検証および/またはサニタイズしたすべてのデータが自動的に収集されます。このデータは、MatchedData:
の Get メソッドを使用してアクセスできます。
go mod init example.com/learning
http://localhost:8080/hello?person=John を開いて、ジョンに敬意を表します!
使用可能な場所は、BodyLocation、CookieLocation、QueryLocation、ParamLocation、および HeaderLocation です。
これらの各場所には、検証/サニタイズされたデータが保存されている場所を返す String メソッドが含まれています。
入力のサニタイズ
ユーザーは空の人名を送信できなくなりましたが、HTML をページに挿入することはできます。これは、クロスサイト スクリプティングの脆弱性 (XSS) として知られています。
どのように機能するかを見てみましょう。 http://localhost:8080/hello?person=John にアクセスすると、「こんにちは、ジョン!」と表示されるはずです。
この例は問題ありませんが、攻撃者は人物のクエリ文字列を

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











GO言語は、効率的でスケーラブルなシステムの構築においてうまく機能します。その利点には次のものがあります。1。高性能:マシンコードにコンパイルされ、速度速度が速い。 2。同時プログラミング:ゴルチンとチャネルを介してマルチタスクを簡素化します。 3。シンプルさ:簡潔な構文、学習コストとメンテナンスコストの削減。 4。クロスプラットフォーム:クロスプラットフォームのコンパイル、簡単な展開をサポートします。

Golangは並行性がCよりも優れていますが、Cは生の速度ではGolangよりも優れています。 1)Golangは、GoroutineとChannelを通じて効率的な並行性を達成します。これは、多数の同時タスクの処理に適しています。 2)Cコンパイラの最適化と標準ライブラリを介して、極端な最適化を必要とするアプリケーションに適したハードウェアに近い高性能を提供します。

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。

Golangは、パフォーマンスとスケーラビリティの点でPythonよりも優れています。 1)Golangのコンピレーションタイプの特性と効率的な並行性モデルにより、高い並行性シナリオでうまく機能します。 2)Pythonは解釈された言語として、ゆっくりと実行されますが、Cythonなどのツールを介してパフォーマンスを最適化できます。

GolangとCにはそれぞれパフォーマンス競争において独自の利点があります。1)Golangは、高い並行性と迅速な発展に適しており、2)Cはより高いパフォーマンスと微細な制御を提供します。選択は、プロジェクトの要件とチームテクノロジースタックに基づいている必要があります。

Cは、ハードウェアリソースと高性能の最適化が必要なシナリオにより適していますが、Golangは迅速な開発と高い並行性処理が必要なシナリオにより適しています。 1.Cの利点は、ハードウェア特性と高い最適化機能に近いものにあります。これは、ゲーム開発などの高性能ニーズに適しています。 2.Golangの利点は、その簡潔な構文と自然な並行性サポートにあり、これは高い並行性サービス開発に適しています。

speed、効率、およびシンプル性をspeedsped.1)speed:gocompilesquilesquicklyandrunseffictient、理想的なlargeprojects.2)効率:等系dribribraryreducesexexternaldedenciess、開発効果を高める3)シンプルさ:

GolangとCのパフォーマンスの違いは、主にメモリ管理、コンピレーションの最適化、ランタイム効率に反映されています。 1)Golangのゴミ収集メカニズムは便利ですが、パフォーマンスに影響を与える可能性があります。
