ホームページ  >  記事  >  バックエンド開発  >  Golang リクエストのタイムアウトが返される

Golang リクエストのタイムアウトが返される

WBOY
WBOYオリジナル
2023-05-14 15:53:07721ブラウズ

Golang は、効率的、高速、簡潔なプログラミング言語であるため、Web 開発において強い競争力を持っています。ただし、Golang のネットワーク リクエストは、特定の Web サイトにアクセスするときにリクエストのタイムアウトやブロックの問題を引き起こす可能性があり、Golang を使用してネットワーク リクエストを行う開発者にとっては頭痛の種です。

この記事では、開発者がこの問題を解決できるように、Golang でリクエスト タイムアウト リターンの機能を実装する方法を紹介します。

Golang のネットワーク リクエスト

Golang の標準ライブラリは、HTTP/HTTPS リクエストの送信、応答の処理、およびその他の操作のための「net/http」パッケージを提供します。このパッケージを使用すると、GET リクエストや POST リクエストの送信などの操作を簡単に実装できます。関連する操作のコード例は次のとおりです:

// 发送GET请求
resp, err := http.Get("http://www.baidu.com")
if err != nil {
    // 处理错误
    return err
}
defer resp.Body.Close()

// 读取响应结果
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
    // 处理错误
    return err
}

// 打印结果
fmt.Println(string(body))

// 发送POST请求
resp, err := http.PostForm("http://example.com/form",
url.Values{"key": {"Value"}, "id": {"123"}})
if err != nil {
    // 处理错误
    return err
}
defer resp.Body.Close()

// 读取响应结果
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
    // 处理错误
    return err
}

// 打印结果
fmt.Println(string(body))

実際のアプリケーションでは、HTTP リクエストを送信するときに、必ずしもすべてのリクエストが応答されるとは限りません。ネットワークの遅延やサーバーの混雑などにより、リクエストがタイムアウトしたりブロックされる場合があります。

リクエストのタイムアウトの問題

HTTP リクエストを送信するときに、リモート サーバーが時間内に応答しない場合、リクエストは待機状態になります。この待ち時間がユーザーの忍耐力を超えると、リクエストのタイムアウトが発生します。リクエストのタイムアウトにより、アプリケーションが異常終了したり、クラッシュしたりする可能性があります。

この問題に関しては、Golang の「net/http」パッケージにはデフォルトのリクエスト タイムアウト メカニズムが提供されていないため、独自に実装する必要があります。

リクエスト タイムアウトの実装

Golang では、「context」パッケージを使用してリクエスト タイムアウト メカニズムを実装できます。 「コンテキスト」パッケージは、API とプロセス全体にわたるリクエスト レベルの制御メカニズムを提供します。これにより、待機が必要な操作をキャンセルし、待機タイムアウトによって引き起こされるプログラム例外を防ぐことができます。

以下はリクエスト タイムアウトを実装するコード例です:

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

func httpClient() (*http.Client, error) {
    // 创建一个新的httpClient
    httpClient := http.DefaultClient

    // 设置超时时间
    timeout := time.Duration(5 * time.Second)
    ctx, cancel := context.WithTimeout(context.Background(), timeout)
    defer cancel()

    // 设置httpClient的Transport属性
    httpClient.Timeout = timeout
    httpClient.Transport = &http.Transport{
        Proxy: http.ProxyFromEnvironment,
    }

    return httpClient, nil
}

func main() {
    httpClient, err := httpClient()
    if err != nil {
        // 处理错误
        return
    }
    // 将httpClient作为参数传入http.NewRequest()方法
    // httpClient将遵循我们设置的超时时间
    req, err := http.NewRequest("GET", "https://www.baidu.com",
    strings.NewReader(""))
    if err != nil {
        // 处理错误
        return
    }

    x, err := httpClient.Do(req)
    if err != nil {
        // 处理错误
        return
    }
    defer x.Body.Close()

    // 处理响应
    ...
}

上記のコードでは、「context」パッケージの WithTimeout() メソッドを使用してリクエスト タイムアウト間隔を設定し、タイムアウト時間を HttpClient に設定し、実際にリクエストを送信する際、HttpClient は設定された時間をもとにタイムアウト判定を行います。

上記のコードを通じて、リクエスト タイムアウト機能を実装し、ネットワーク リクエストが失敗したり、タイムアウトによりブロックされた状況を効果的に処理して解決できます。

結論

この記事では、Golang でリクエスト タイムアウト リターンの機能を実装する方法を紹介します. タイムアウト制御に「context」パッケージを使用することで、ネットワーク遅延、サーバー リクエスト タイムアウト、または多忙やその他の理由で発生する問題をブロックします。同時に、実際のアプリケーションでは、リクエスト処理の効率と信頼性を向上させるために、リクエストのリトライやレスポンスデータのキャッシュなどの問題も考慮する必要があることに注意してください。

以上がGolang リクエストのタイムアウトが返されるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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