GOのHTTPクライアントのリダイレクトを処理する方法
GoのHTTP.Clientは、デフォルトで最大10のリダイレクトを自動的に追跡します。 1.デフォルトでは、301、302などのリダイレクトが自動的に処理され、最終応答が返されます。 2。リダイレクトの数を制限するなど、CheckRedirect関数を設定することで動作をカスタマイズし、len(via)> = 3の場合にエラーを返し、最大2つのリダイレクトを制限します。 3. http.erruselastresponseを返すことにより、リダイレクトを防ぎ、元のリダイレクト応答を取得できます。これにより、ロケーションヘッダーのチェックが容易になります。 4.機密情報の漏れを防ぐために、ターゲットドメイン名に従って承認ヘッダーを削除するなど、リダイレクトプロセス中にリクエストを変更できます。 5.円形のリダイレクト、メソッドの変更(変化後の取得など)、クロスドメインのセキュリティ、コンテキストキャンセルなどの問題に注意してください。要するに、CheckRedirectはリダイレクションの動作を完全に制御し、リダイレクトシナリオの細かい管理を必要とする要件に適しています。
GOのHTTPクライアントのリダイレクトの処理はnet/http
パッケージの組み込み機能のおかげで簡単です。デフォルトでは、Goのhttp.Client
リダイレクトを自動的にフォローしますが、リダイレクト動作の検査、リダイレクトの数の制限、または完全に無効にするなど、ニーズに応じてこの動作をカスタマイズできます。

GOのリダイレクト処理を制御する方法は次のとおりです。
1。デフォルトの動作を理解します
デフォルトでは、 http.Client
リクエストのために最大10のリダイレクトに従います。リダイレクト(301、302、307など)が遭遇した場合、クライアントはLocation
ヘッダーで指定されたURLに次のリクエストを自動的に行います。

rep、err:= http.get( "https://httpbin.org/redirect/1") err!= nil { log.fatal(err) } defer resp.body.close() //これは自動的にリダイレクトに従います
最終的な応答(リダイレクト後の後)が返され、特に構成しない限り中間の手順は表示されません。
CheckRedirect
でリダイレクトポリシーをカスタマイズします
http.Client
にCheckRedirect
関数を設定することにより、リダイレクト動作を制御できます。この関数は各リダイレクトに対して呼び出され、それに従うか、リクエストを変更するか、中止するかを決定できます。

例:リダイレクトを3に制限します
クライアント:=&http.client { checkredirect:func(req *http.request、via [] *http.request)エラー{ len(via)> = 3 { fmt.errorfを返す(「リダイレクトが多すぎる」) } nilを返します }、 } rep、err:= client.get( "https://httpbin.org/redirect/5") err!= nil { log.printf( "要求が失敗した:%v"、err) }
この例では:
-
via
、現在のリクエストを含むリクエストのスライスです(最初のリクエストを含む)。 - 最大2つのリダイレクト(合計3つのリクエスト)を許可し、それ以外の場合はエラーを返します。
例:すべてのリダイレクトを防ぎます
クライアント:=&http.client { checkredirect:func(req *http.request、via [] *http.request)エラー{ http.erruselastresponseを返す//リダイレクトに従わないでください、リダイレクト応答を返します }、 } rep、err:= client.get( "https://httpbin.org/redirect/1") err!= nil { log.fatal(err) } // resp.statuscodeは302になり、ロケーションヘッダーを検査できます 場所:= resp.header.get( "location") fmt.println( "Redirect to:"、location)
http.ErrUseLastResponse
を使用すると、クライアントに、それに従う代わりにリダイレクト応答を停止して返すように指示します。
3.リダイレクト中のヘッダーの保存またはリクエストの変更
ヘッダーを調整することをお勧めします(たとえば、セキュリティのために別のドメインにリダイレクトするAuthorization
削除します)。
クライアント:=&http.client { checkredirect:func(req *http.request、via [] *http.request)エラー{ //別のドメインに承認ヘッダーを送信しないでください if req.url.hostname()!= via [0] .url.hostname(){{ req.header.del( "Authorization") } nilを返します }、 }
これにより、リダイレクト中に敏感なヘッダーがドメイン間でリークされないようになります。
4.一般的な落とし穴とヒント
- 円形リダイレクト:デフォルトの制限があっても、一部のエンドポイントはループを引き起こす可能性があります。常に実際のエンドポイントでテストしてください。
- メソッドの変更:一部のリダイレクト(302など)は、歴史的にクライアントを取得するためにポストを変更します。 307または308を使用して、方法と本体を保存します。
- コンテキストキャンセル:リダイレクトクライアントのコンテキストを尊重します。リダイレクト中にコンテキストがキャンセルされた場合、プロセスは停止します。
まとめ
- Go's
http.Client
は、デフォルトでリダイレクトをフォローします(最大10)。 -
CheckRedirect
を使用して動作をカスタマイズします。リダイレクトを制限、検査、またはブロックします。 -
nil
を返して、http.ErrUseLastResponse
を停止してリダイレクト応答、またはその他のエラーを返します。 - セキュリティ(ヘッダー、ドメイン)とパフォーマンス(ループ、タイムアウト)に注意してください。
基本的に、 CheckRedirect
完全に制御できます。デフォルトの動作が十分でない場合に使用します。
以上がGOのHTTPクライアントのリダイレクトを処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

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

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

Stock Market GPT
AIを活用した投資調査により賢明な意思決定を実現

人気の記事

ホットツール

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

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

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

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

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

ホットトピック

usegomodulesbyrunninggomodinittucreateago.modfile、whithmanages -dependenciesandions.2.organizecodeIntopackagesは、Eachdirectoryisapackage where onsistentpackageName、できれば誘惑を抑制することができます

TohandlepanicsingOroutines、使用済みのinsidetegoroutinetocatchandmanagetheThemlocally.2.を使用している

custombuildtagsingoallowconditionalcompalilation basedoneNvironment、Architecture、orcustomscenariosbyusing // go:buildtagsattheTopoffiles、burtientenabledviagobuild-tags "tagname"、supportinglogicaloperatorslike && |
![goで[] intを[] uint8(byte array)に変換する方法](https://img.php.cn/upload/article/001/246/273/175668570227460.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
この記事では、[] intスライスをgoで[] uint8(byte array)に変換する方法について説明します。 GOのINTタイプのサイズがプラットフォーム関連(32ビットまたは64ビット)であることを考えると、記事は反射パッケージを使用してINTサイズを動的に取得し、エンコード/バイナリパッケージを組み合わせて効率的かつ安全にコンバージョンを組み合わせて、特定のコード例と開発者を提供するための開発者を提供するための特定のコードの例を提供する方法を詳しく説明します。

GoのHTTP.Clientは、デフォルトで最大10のリダイレクトを自動的に追跡します。 1.デフォルトでは、301、302などのリダイレクトが自動的に処理され、最終応答が返されます。 2。リダイレクトの数を制限するなど、CheckRedirect関数を設定することで動作をカスタマイズし、len(via)> = 3の場合にエラーを返し、最大2つのリダイレクトを制限します。 3. http.erruselastresponseを返すことにより、リダイレクトを防ぎ、元のリダイレクト応答を取得できます。これは、ロケーションヘッダーのチェックに便利です。 4.機密情報の漏れを防ぐために、ターゲットドメイン名に従って承認ヘッダーを削除するなど、リダイレクトプロセス中にリクエストを変更できます。 5.ループに注意を払う必要があります

Sync.WaitGroupは、GO言語で同時同期の重要な原始です。これにより、メインのゴルウチンがサブゴルチンのグループが実行されるのを待つことができます。カウンターメカニズムを通じて、ウェイトグループは、すべての同時タスクが完了し、プログラムが引き続き実行され、人種条件とリソースの漏れを効果的に回避し、堅牢な同時アプリケーションを構築するための重要なツールであることを保証できます。

Goの埋め込みパッケージを使用して、静的リソースをバイナリファイルに直接埋め込むことができます。 go1.16から、// go:埋め込み指令を使用して、変数の前にディレクティブ、単一のファイル、複数のファイル、またはディレクトリ全体を埋め込み、文字列をサポートすることができます。埋め込まれたコンテンツは、コンパイル時にバイナリに固化します。パスは存在する必要があり、ケースに敏感です。 Go-bindataなどのサードパーティツールの代わりに埋め込みを使用することをお勧めします。この方法はシンプルで効率的であり、標準的な慣行となっています。

numerictypeshavezerovalue0; 2.booleantypehaszerovaluefalse; 3.StringTypehaszeroValue ""; 4.pointertypeshavezerovaluenil; 5.in TerfaceTypeshavezerovaluenil; 6.ArrayTypeshavealLementszeroed; 7.Slicetypeshavezerovaluenil; 8.Maptypeshavezerovaluenil; 9
