ホームページ  >  記事  >  バックエンド開発  >  Go 言語での非同期 HTTP リクエスト

Go 言語での非同期 HTTP リクエスト

PHPz
PHPzオリジナル
2023-06-02 21:10:32814ブラウズ

今日のインターネット時代では、多くのアプリケーションはデータを取得または送信するためにネットワーク要求を行う必要があります。 HTTP リクエストは、最も一般的に使用されるネットワーク リクエスト メソッドの 1 つです。 Go 言語では、標準ライブラリの net/http パッケージを使用して HTTP リクエストを開始できますが、これにより現在のコルーチンがブロックされます。では、Go 言語で非同期 HTTP リクエストを実装するにはどうすればよいでしょうか?この記事では、Go 言語で非同期 HTTP リクエストを実装する 2 つの方法を紹介します。

方法 1: goroutine とチャネルを使用する

Goroutine を使用すると非同期プログラミングを簡単に実装でき、チャネルを使用するとコルーチン間の通信が容易になります。したがって、ゴルーチンで HTTP リクエストを開始し、チャネルを使用して応答をメインのゴルーチンに返すことができます。以下は簡単な例です:

func asyncHTTP(url string, ch chan<- []byte) {
    resp, err := http.Get(url)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }

    ch <- body
}

func main() {
    ch := make(chan []byte)
    url := "https://www.example.com"
    go asyncHTTP(url, ch)

    fmt.Println("Waiting for response...")
    responseBody := <-ch
    fmt.Println("Received response:", string(responseBody))
}

上の例では、まず ch (タイプ chan []byte) を作成して、応答結果をメイン コルーチンに返します。次に、asyncHTTP 関数を呼び出して HTTP リクエストを開始し、応答結果を ch に書き込みます。最後に、 演算子を使用して ch からの応答結果を読み取ります。

HTTP リクエストがゴルーチンを通じて開始されない場合、応答結果を読み取る操作 により現在のコルーチンがブロックされることに注意してください。 goroutine とチャネルを使用すると、非同期 HTTP リクエストを簡単に実装できます。

方法 2: コンテキストと http.Do

を使用する Go 言語では、コンテキスト パッケージを使用して関数の実行時間とキャンセル可能性を制御できます。コンテキストを http.Do 関数と組み合わせて使用​​すると、キャンセル可能な非同期 HTTP リクエストを実装できます。以下は簡単な例です:

func asyncHTTPWithCtx(ctx context.Context, url string) ([]byte, error) {
    req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
    if err != nil {
        return nil, err
    }

    client := http.DefaultClient
    resp, err := client.Do(req)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return nil, err
    }

    return body, nil
}

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

    url := "https://www.example.com"
    resp, err := asyncHTTPWithCtx(ctx, url)

    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Response:", string(resp))
}

上の例では、context.WithTimeout 関数を使用してキャンセル可能なコンテキストを作成します。次に、asyncHTTPWithCtx 関数を呼び出します。この関数は、http.Do 関数を使用して HTTP リクエストを開始します。 http.Do 関数はコンテキスト パラメーターを受け入れることができ、コンテキストがキャンセルされると、http.Do 関数は実行中の HTTP リクエストをキャンセルします。

http.Do 関数を使用する場合、応答本文を手動で閉じる必要があることに注意してください。そうしないと、リソース リークや接続プールの枯渇が発生する可能性があります。したがって、asyncHTTPWithCtx 関数では、defer ステートメントを使用して、関数が戻ったときに応答本文が確実に閉じられるようにします。

概要

この記事では、Go 言語で非同期 HTTP リクエストを実装する 2 つの方法、ゴルーチンとチャネルを使用する方法、およびコンテキストと http.Do 関数を使用する方法を紹介します。 goroutine とチャネルを使用する方法はより一般的な方法であり、あらゆる種類のネットワーク リソースを非同期に要求するために使用できます。 context 関数と http.Do 関数を使用する方法は、要求のキャンセルを制御する必要があるシナリオに適しています。これらのテクノロジーを使用すると、非同期 HTTP リクエストを簡単に実装でき、アプリケーションのパフォーマンスと応答性が向上します。

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

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