golang リクエストのタイムアウト
Web アプリケーションを開発する場合、多くの場合、リモート サービスからデータを取得するためにネットワーク リクエストを行う必要があります。ただし、ネットワークの速度が遅い、ネットワーク障害、ターゲット サーバーからの応答が遅いなど、さまざまな問題によってネットワーク リクエストが影響を受ける場合があります。この場合、必要に応じてリクエストを停止して再処理したり、失敗を通知したりできるように、リクエストをより正確に制御および管理する必要があります。
Go は、ネットワーク プログラミング用の組み込みネットワーク機能を多数提供する強力なプログラミング言語です。 Go の標準ライブラリは net/http パッケージを提供します。これは、HTTP クライアント リクエスト機能を含む、Web 開発用の多くの機能を提供します。この記事では、Go で HTTP クライアント リクエストのタイムアウトを処理する方法について説明します。
タイムアウト処理とは、設定した時間内にリクエストに応答できない場合に強制的に停止し、エラーを返す処理です。ほとんどの場合、リクエストに時間がかかりすぎる場合は、ターゲット サービスの問題またはネットワーク接続の障害を示している可能性があるため、タイムアウト処理によりネットワーク リクエストをより安全かつ安定させることができます。
Go でリクエストのタイムアウト処理を実装するのは非常に簡単です。リクエストの開始時にタイムアウトを追加し、関連するエラーをキャプチャするだけで、リクエストのタイムアウト機能を簡単に実装できます。以下では、Go を使用して、いくつかの一般的な HTTP クライアント リクエストのタイムアウト処理を実装する方法を紹介します。
- GET リクエストのタイムアウト処理
Go では、http.Get() メソッドを使用して GET リクエストを開始できます。リクエストを行う際にコンテキストを設定し、タイムアウトを設定することができ、タイムアウト内に応答が受信されなかった場合はタイムアウト処理がトリガーされます。以下は例です:
package main import ( "context" "fmt" "net/http" "time" ) func main() { client := http.Client{ Timeout: time.Duration(1) * time.Second, } ctx, cancel := context.WithTimeout(context.Background(), time.Duration(5)*time.Second) defer cancel() req, err := http.NewRequestWithContext(ctx, http.MethodGet, "http://example.com", nil) if err != nil { fmt.Println(err) return } res, err := client.Do(req) if err != nil { fmt.Println(err) return } fmt.Println("response Status:", res.Status) }
この例では、最初に http.Client オブジェクトを作成し、Timeout プロパティを 1 秒に設定します。これは、1 秒以内に応答がない場合、応答がないとみなされることを意味します。タイムアウト。次に、コンテキスト パッケージを使用してコンテキストを作成し、遅延を 5 秒に設定します。次に、http.NewRequestWithContext() メソッドを使用して GET リクエストを作成し、コンテキストをメソッドに渡します。最後に、http.Client オブジェクトを使用してリクエストを行います。リクエストがタイムアウトするか、その他のエラーが発生すると、適切なエラー メッセージが生成されます。
- POST リクエストのタイムアウト処理
GET リクエストとは異なり、POST リクエストはリクエスト本文でデータを渡す必要があります。 Go では、http.Post() メソッドを使用して POST リクエストを開始できます。同様に、コンテキストとタイムアウトを設定して、指定された時間内にリクエストが応答されるようにすることができます。以下に例を示します。
package main import ( "bytes" "context" "fmt" "net/http" "time" ) func main() { client := http.Client{ Timeout: time.Duration(1) * time.Second, } ctx, cancel := context.WithTimeout(context.Background(), time.Duration(5)*time.Second) defer cancel() requestBody := []byte(`{"id":1,"name":"John"}`) req, err := http.NewRequestWithContext(ctx, http.MethodPost, "http://example.com", bytes.NewBuffer(requestBody)) if err != nil { fmt.Println(err) return } res, err := client.Do(req) if err != nil { fmt.Println(err) return } fmt.Println("response Status:", res.Status) }
この例では、リクエスト本文を JSON 形式のデータとして含む POST リクエストを作成します。 bytes パッケージを使用して JSON データをバイト ストリームに変換し、それをリクエスト本文として http.NewRequestWithContext() メソッドに渡します。残りは GET リクエストと同じように処理されます。
- クライアント側のカスタム タイムアウト
実際のアプリケーションでは、さまざまなリクエスト状況に基づいてタイムアウトを設定する必要があります。たとえば、一部の API は応答時間が非常に速いため、より短いタイムアウトを設定する必要がありますが、一部の API は応答時間が長いため、より長いタイムアウトを設定する必要があります。 Go では、コンテキスト パッケージとタイム パッケージを使用してタイムアウトをカスタマイズできます。以下に例を示します。
package main import ( "context" "fmt" "net/http" "time" ) func main() { client := http.Client{} ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() req, err := http.NewRequestWithContext(ctx, http.MethodGet, "http://example.com", nil) if err != nil { fmt.Println(err) return } // 自定义超时时间 timeout := time.Duration(3) * time.Second // 发起请求 res, err := client.Do(req) if err != nil { fmt.Println(err) return } fmt.Println("response Status:", res.Status) }
この例では、最初に http.Client オブジェクトを作成し、Timeout プロパティを設定しません。次に、コンテキスト パッケージを使用してコンテキストを作成し、タイムアウトを 5 秒に設定します。次に、http.NewRequestWithContext() メソッドを使用して GET リクエストを作成し、コンテキストをメソッドに渡します。次に、タイムアウトを 3 秒にカスタマイズし、http.Client オブジェクトを使用してリクエストを開始します。リクエストがタイムアウトした場合、3 秒後にエラー メッセージが返され、コンテキスト内の時間は待機されません。
まとめ
Go では、ネットワーク リクエストのタイムアウト処理は非常に簡単で、リクエスト時にコンテキストを設定してタイムアウトを設定するだけです。リクエストが適切な時間内に完了するように、必要に応じてタイムアウトをカスタマイズできます。リクエストのタイムアウト処理はネットワーク プログラミングの非常に重要な部分であり、システムの信頼性と安定性を確保し、不必要な待機とリソースの無駄を回避できます。実際の開発では、さまざまなシナリオやビジネスニーズに応じて、タイムアウト処理やその他のネットワーク機能を柔軟に使用して、システムのパフォーマンスと効率を向上させる必要があります。
以上がgolang リクエストのタイムアウトの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

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

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

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

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

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

ホットトピック









OpenSSLは、安全な通信で広く使用されているオープンソースライブラリとして、暗号化アルゴリズム、キー、証明書管理機能を提供します。ただし、その歴史的バージョンにはいくつかの既知のセキュリティの脆弱性があり、その一部は非常に有害です。この記事では、Debian SystemsのOpenSSLの共通の脆弱性と対応測定に焦点を当てます。 Debianopensslの既知の脆弱性:OpenSSLは、次のようないくつかの深刻な脆弱性を経験しています。攻撃者は、この脆弱性を、暗号化キーなどを含む、サーバー上の不正な読み取りの敏感な情報に使用できます。

この記事では、プロファイリングの有効化、データの収集、CPUやメモリの問題などの一般的なボトルネックの識別など、GOパフォーマンスを分析するためにPPROFツールを使用する方法について説明します。

この記事では、GOでユニットテストを書くことで、ベストプラクティス、モッキングテクニック、効率的なテスト管理のためのツールについて説明します。

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

バックエンド学習パス:フロントエンドからバックエンドへの探査の旅は、フロントエンド開発から変わるバックエンド初心者として、すでにNodeJSの基盤を持っています...

この記事では、go.modを介してGOモジュールの依存関係の管理、仕様、更新、競合解決をカバーすることについて説明します。セマンティックバージョンや定期的な更新などのベストプラクティスを強調しています。

この記事では、Debianシステムの下でPostgreSQLデータベースを監視するためのさまざまな方法とツールを紹介し、データベースのパフォーマンス監視を完全に把握するのに役立ちます。 1. PostgreSQLを使用して監視を監視するビューPostgreSQL自体は、データベースアクティビティを監視するための複数のビューを提供します。 PG_STAT_REPLICATION:特にストリームレプリケーションクラスターに適した複製ステータスを監視します。 PG_STAT_DATABASE:データベースサイズ、トランザクションコミット/ロールバック時間、その他のキーインジケーターなどのデータベース統計を提供します。 2。ログ分析ツールPGBADGを使用します
