インターネット技術の継続的な発展に伴い、Web 開発、モバイル APP 開発、モノのインターネットなど、さまざまな分野で多数の API インターフェイスが広く使用されています。 API インターフェイスを使用する場合、プログラマはリクエストの繰り返しという問題に遭遇することがよくあります。
重複したリクエストは、API インターフェイス開発における一般的な問題です。たとえば、リクエストが失敗した場合、リクエストを再送信する必要があります。ただし、繰り返されるリクエストが処理されない場合、サーバーに負担がかかり、インターフェイス エラーが発生する可能性もあります。
これらの問題を回避するには、API インターフェース開発に重複リクエスト処理機構を導入する必要があります。この記事では、golang での繰り返しリクエスト処理機構の使い方を紹介します。
golang では、net/http パッケージを使用して HTTP リクエストを送信できます。 HTTPリクエストは主にリクエストメソッド、URL、HTTPヘッダ、HTTPリクエストボディで構成されます。
HTTP リクエストでは、各リクエストには一意の識別子 (リクエスト ID) があります。リクエスト ID を使用して、同じクライアントによって行われた異なるリクエストを区別できます。
golang では、重複リクエストを解決する方法が 2 つあります。タイムスタンプを使用する方法と一意の識別子を使用する方法です。
2.1 タイムスタンプの使用
HTTP リクエストにタイムスタンプ フィールドを追加して、各リクエストの送信時間を記録できます。サーバーは HTTP リクエストを処理するときに、まずリクエストのタイムスタンプと現在時刻の差を比較し、タイムアウトになるとリクエストの処理を拒否します。これにより、リクエストの繰り返しを効果的に回避できます。
タイムスタンプを使用するサンプル コード:
package main import ( "fmt" "net/http" "strconv" "time" ) func sendReq() { now := time.Now().Unix() // 发送HTTP请求 url := "http://example.com/api/test" resp, err := http.Get(url + "?timestamp=" + strconv.FormatInt(now, 10)) if err != nil { fmt.Println("send request error:", err) return } defer resp.Body.Close() // 处理HTTP响应 // ...... }
2.2 一意の識別子の使用
HTTP リクエストでは、さまざまな ask を区別するために一意の識別子フィールドを追加できます。 HTTP リクエストを処理する際、サーバーはリクエストの一意の識別子と現在処理されているリクエストの一意の識別子を比較することができ、それらが同じである場合、サーバーはリクエストの処理を拒否します。これにより、リクエストの繰り返しを効果的に回避できます。
一意の識別子を使用したサンプル コード:
package main import ( "fmt" "net/http" "strconv" "time" ) func sendReq() { now := time.Now().Unix() // 生成唯一标识符 id := strconv.FormatInt(now, 10) + strconv.Itoa(rand.Intn(10000)) // 发送HTTP请求 url := "http://example.com/api/test" resp, err := http.Get(url + "?id=" + id) if err != nil { fmt.Println("send request error:", err) return } defer resp.Body.Close() // 处理HTTP响应 // ...... }
API インターフェイス開発では重複したリクエストがよくある問題ですが、HTTP リクエストを処理して次のことを行うことができます。この問題を避けてください。 golang では、タイムスタンプと一意の識別子の 2 つの方法を使用して、リクエストが繰り返される問題を解決できます。これらのメソッドを使用すると、API インターフェイスの安定性と信頼性が向上し、ユーザーへのサービスも向上します。
以上がgolang で重複リクエスト処理メカニズムを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。