インターネット技術の継続的な発展に伴い、ネットワークリクエストの需要も増加しています。 Web 開発では、クライアントとサーバー間の対話を実現するためにネットワーク リクエスト ライブラリをよく使用します。 Go 言語は効率的で簡潔な同時実行言語であるため、ネットワーク リクエストに関しても優れた選択肢が数多くあります。この記事では、いくつかの一般的な Go 言語リクエスト ライブラリを紹介し、適切なライブラリをより適切に選択できるように、それらの長所と短所を比較および分析します。
net/http は、Go 言語の標準ライブラリで提供される HTTP クライアント ライブラリで、HTTP/1.0、HTTP/1.1、HTTP/2 をサポートしています。合意。 HTTP クライアント コードは net/http を使用して簡単に作成でき、Cookie、gzip 圧縮、TLS、プロキシ、接続プール、その他の機能をサポートします。次に簡単な使用例を示します。
package main import ( "fmt" "net/http" ) func main() { resp, err := http.Get("http://example.com/") if err != nil { fmt.Println("error:", err) return } defer resp.Body.Close() fmt.Println(resp.Status) }
このコードは、単純な HTTP GET リクエストを実装し、リクエストによって返されるステータス コードを出力します。もちろん、net/http は、POST、PUT、HEAD などのより多くの HTTP メソッドや、より多くのリクエストおよびレスポンス操作もサポートしています。
基本的なリクエストとレスポンスの操作に加えて、net/http は CookieJar、トランスポート、クライアント、その他のコンポーネントも提供し、HTTP リクエストをより柔軟に処理できるようにします。その中で、CookieJar は Cookie を自動的に処理できるため、手動で Cookie を処理する必要はありません; Transport は接続プール サイズを指定し、HTTP 接続の再利用をサポートし、接続遅延を削減できます; Client はリクエスト タイムアウト、カスタム ヘッダーなどの高度な操作を提供します、など。
ただし、他のリクエスト ライブラリと比較すると、net/http にはいくつかの制限があります。たとえば、カスタム リダイレクト処理、Cookie のカスタム保存方法などはサポートされていません。さらに、net/http を使用して HTTPS リクエストを処理する場合は、TLS 構成を手動で設定する必要があり、TLS 構成は比較的面倒です。
grequests は、net/http カプセル化に基づく軽量の HTTP クライアント ライブラリであり、より優れた API インターフェイスとパフォーマンスを提供します。 grequests は、GET、POST、PUT、PATCH、DELETE などの従来の HTTP メソッドをサポートし、非同期リクエストとバッチ リクエストをサポートします。以下は、grequests を使用して非同期リクエストを行う例です。
package main import ( "fmt" "github.com/levigross/grequests" ) func main() { urls := []string{ "http://httpbin.org/get?show_env=1", "http://httpbin.org/get", } rs := make([]*grequests.Response, len(urls)) for i, url := range urls { rs[i], _ = grequests.AsyncGet(url, nil) } for _, r := range rs { fmt.Println(r.String()) fmt.Println("=================") } }
このコードは 2 つの非同期 GET リクエストを実装し、リクエストの結果を出力します。ご覧のとおり、プログラムはリクエストが完了する前にブロックされず、コードの次の行の実行を続けます。リクエストが完了した後でのみ、プログラムは結果を出力します。
grequests は net/http よりも柔軟で使いやすいですが、いくつかの制限もあります。たとえば、HTTP 接続プーリングや接続再利用機能はサポートされておらず、応答処理方法は比較的単純で、より高度な応答操作はサポートされていません。
resty は、柔軟性と使いやすさに重点を置いた HTTP クライアント ライブラリであり、jQuery のような API インターフェイスを提供し、シンプルな HTTP メソッドをサポートしています。 、タイムアウト、自動リトライおよびその他の機能。 resty は、HTTP リクエストを簡単に結合できるチェーン構文をサポートしており、gzip 圧縮、自動応答解析などの機能もサポートしています。次に、resty の使用例を示します。
package main import ( "fmt" "github.com/go-resty/resty/v2" ) func main() { resp, err := resty.New(). SetTimeout(5*time.Second). R(). Get("http://example.com/") if err != nil { fmt.Println("error:", err) return } fmt.Println(resp.Status()) }
このコードは、resty を使用して単純な HTTP GET リクエストを作成し、リクエストによって返されたステータス コードを出力します。ご覧のとおり、resty の使用は net/http を使用するよりもはるかに簡単で、より多くの機能もサポートしています。
ただし、resty は強力なリクエスト ライブラリですが、独自の問題もいくつか抱えています。たとえば、非同期リクエストはサポートされておらず、デバッグのパフォーマンス上の問題がいくつかあります。
go-http-client は、net/http に基づく、効率的で使いやすく、スケーラブルな HTTP クライアント ライブラリです。 Resty のようなチェーン構文をサポートし、HTTP メソッド、ヘッダー、Cookie、タイムアウト、接続プール、その他の機能もサポートします。同時に、エンコードとデコード、再試行、リダイレクト、カスタム エラー処理、JSON、XML、FormData、その他の形式でのその他の機能など、豊富なリクエストと応答の処理メソッドもサポートしています。以下は go-http-client の使用例です。
package main import ( "fmt" "github.com/cosiner/flag" "github.com/cosiner/go-http-client" ) func main() { client := http.NewClient(nil) resp, err := client.Get("http://example.com/", nil) if err != nil { fmt.Println("error:", err) return } fmt.Println(resp.StatusCode(), resp.String()) }
このコードは go-http-client を使用して単純な HTTP GET リクエストを作成し、リクエストによって返されるステータス コードと応答データを出力します。ご覧のとおり、 go-http-client は非常に使いやすく、柔軟で機能が豊富なリクエスト ライブラリです。
概要
Go 言語リクエスト ライブラリの選択は、主に実際のニーズに基づいて決定する必要があります。単純な HTTP リクエストを実装するだけの場合は net/http で十分です。非同期リクエストやバッチ リクエストを実装する必要がある場合は grequests を検討できます。さらに高度な機能や使いやすさが必要な場合は、resty または go-http を検討してください。 -client をより良い選択肢として使用できます。同時に、個人の好みやプロジェクトのニーズに基づいて、どのライブラリを使用するかを決定することもできます。
以上が[概要] いくつかの一般的な Go 言語リクエスト ライブラリの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。