ホームページ  >  記事  >  バックエンド開発  >  golang http 非同期リクエスト

golang http 非同期リクエスト

WBOY
WBOYオリジナル
2023-05-10 15:01:391300ブラウズ

最近の多くの Web アプリケーションでは、非同期処理が最も重要な機能の 1 つです。 Go 言語では、http パッケージを使用して、非同期リクエストを完了するためのシンプルかつ強力な方法を提供します。この記事では、golang の http パッケージを使用して非同期リクエストを行う方法を紹介します。

1. はじめに

Go 言語の http パッケージは、GET、POST、その他のさまざまな HTTP リクエストの送信に使用できる非常に強力なパッケージです。また、HTTP サーバーと対話するためのクライアントも提供します。基本的なケースでは、http パッケージは同期リクエストを送信するための非常に簡単な方法を提供しますが、通常は非同期ソリューションが必要です。幸いなことに、http パッケージには、非同期リクエストを処理するためのシンプルかつ強力な機能がいくつか用意されています。 "Go では、ゴルーチンを介して非同期リクエストを実装します。これにより、Go は大量の同時実行性の高い非同期リクエストを簡単に処理できるようになります。

2. 使用方法

1. クライアントを作成します

Go では、http パッケージのクライアント オブジェクトを使用して、非同期 HTTP リクエストを実行できます。次のコードを使用してデフォルトのクライアントを作成できます:

package main

import (
    "net/http"
)

func main() {
    client := &http.Client{}
}

上の例では、デフォルトの HTTP クライアントを作成します。オブジェクトが作成され、変数 "client" に割り当てられます。

2. リクエストの送信

HTTP クライアントを作成した後、http.NewRequest 関数を使用して HTTP リクエスト オブジェクトを作成できます。リクエストを実行し、Do を呼び出してレスポンスを受け取ります。リクエストを非同期にするには、ゴルーチンを使用する必要があります。サンプル コードは次のとおりです:

package main

import (
    "fmt"
    "net/http"
)

func main() {
    client := &http.Client{}

    req, err := http.NewRequest("GET", "https://www.google.com", nil)
    if err != nil {
        fmt.Println(err)
        return
    }

    go func() {
        resp, err := client.Do(req)
        if err != nil {
            fmt.Println(err)
            return
        }
        defer resp.Body.Close()
        fmt.Println("Async response status:", resp.Status)
    }()

    fmt.Println("Request sent asynchronously.")
    //等待goroutine结束
    //time.Sleep(5 * time.Second)
}

上記のコードでは、最初に HTTP クライアントを作成し、次にhttp.NewRequest() 関数を使用して GET リクエスト オブジェクトを作成しました。次に、ゴルーチンを使用して非同期リクエストを構築しました。リクエストを送信するコードはゴルーチンの外側にあり、「リクエストは非同期に送信されました。」と出力されます。コードの残りの部分は出力非同期リクエストのステータス。応答本文を閉じるために defer ステートメントで resp.Body.Close() を呼び出したことに注意してください。

3. エラー処理

非同期リクエストを送信するときHTTP リクエスト サーバーの応答が遅すぎる場合、またはネットワークの問題により、クライアントは応答を待ってタイムアウトすることがあります。この問題を解決するには、SetTimeout 関数と CancelRequest 関数を使用してリクエストのタイムアウトとキャンセルを制御できます。サンプル コード:

package main

import (
    "context"
    "fmt"
    "net/http"
    "time"
)

func main() {
    client := &http.Client{
        Timeout: 5 * time.Second,
    }

    req, err := http.NewRequest("GET", "https://www.google.com", nil)
    if err != nil {
        fmt.Println(err)
        return
    }

    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()

    req = req.WithContext(ctx)

    go func() {
        resp, err := client.Do(req)
        if err != nil {
            fmt.Println(err)
            return
        }
        defer resp.Body.Close()
        fmt.Println("Async response status:", resp.Status)
    }()

    fmt.Println("Request sent asynchronously.")
}

上記の例では、最初にクライアントのタイムアウトを 5 秒に設定します。次に、コンテキスト パッケージの WithTimeout 関数を使用して、新しいコンテキストとリクエスト オブジェクトが作成されます。この関数は、キャンセル関数を返します。これは、関数が完了する前にリクエスト スレッドが確実にキャンセルされるようにするための defer ステートメントを使用して呼び出します (まだ存在する場合)。

2. ネットワーク接続エラー

エラーよく発生するのはネットワーク接続エラーです。これは通常、ネットワーク速度が遅いデバイスに関連しています。ネットワーク接続の問題を解決するには、http.Transport で提供される Dialer 関数を使用して接続タイムアウトを設定できます。サンプル コードは次のとおりです。

package main

import (
    "context"
    "fmt"
    "net"
    "net/http"
    "time"
)

func main() {
    dialer := &net.Dialer{
        Timeout: 5 * time.Second,
    }

    transport := &http.Transport{
        DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
            return dialer.DialContext(ctx, network, addr)
        },
    }

    client := &http.Client{
        Transport: transport,
    }

    req, err := http.NewRequest("GET", "https://www.google.com", nil)
    if err != nil {
        fmt.Println(err)
        return
    }

    go func() {
        resp, err := client.Do(req)
        if err != nil {
            fmt.Println(err)
            return
        }
        defer resp.Body.Close()
        fmt.Println("Async response status:", resp.Status)
    }()

    fmt.Println("Request sent asynchronously.")
}

上記の方法を再度使用して、ダイヤラーのタイムアウトを 5 秒に設定し、クライアントは http を使用して、.Transport で提供される DialContext 関数によってリクエストを作成します。この関数は、ネットワーク接続に設定したダイヤラーを使用し、タイムアウト後に接続を閉じます。応答を受信した後は応答本文を必ず閉じる必要があることに注意してください。

4. 結論

この記事では、http パッケージを使用して Go 言語で非同期 HTTP リクエストを実行する方法を紹介しました。リクエストを非同期で送信するゴルーチンを作成し、一般的なエラー処理方法を導入しました。このアプローチは非常にシンプルですが強力で、Web アプリケーションで発生する可能性のある同時実行性の高い状況に対処できるため、従来のほとんどのネットワーク ライブラリよりも柔軟性が高くなります。この手法をコードに適用して、貴重な時間とリソースを節約できるようになりました。

以上がgolang http 非同期リクエストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。