Goで高速外部API通信
Go実践でHTTPクライアントを使う
Go言語で外部APIと通信する際、最も頻繁に使われるのが標準ライブラリの net/http パッケージです。http.Client をインスタンス化し、Get や Post メソッドを呼び出すだけで、簡単にリクエストを送信できます。実際の開発では、リクエストヘッダーの設定やクエリパラメータの付与、レスポンスのJSONデコードなどを組み合わせて使います。
以下は、http.Client を使って GET リクエストを送るサンプルです。
package main
import (
"fmt"
"net/http"
"io/ioutil"
)
func main() {
client := &http.Client{}
resp, err := client.Get("https://api.example.com/data")
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
このコードは、外部APIからデータを取得し、標準出力に表示します。実際のプロダクションコードでは、エラーハンドリングやレスポンスのステータスコードチェックを必ず行うようにしましょう。
net/http Clientの基本
http.Client はデフォルトでタイムアウトが無制限に設定されています。長時間応答が返ってこない場合、プログラムがハングする恐れがあります。そこで、Timeout フィールドを設定して、通信の最大許容時間を制御します。
また、Post メソッドを使うと、簡単に POST リクエストを送ることができます。以下は、JSON ボディを送信する例です。
package main
import (
"bytes"
"encoding/json"
"net/http"
)
func main() {
data := map[string]string{"name": "Alice", "age": "30"}
jsonData, _ := json.Marshal(data)
client := &http.Client{Timeout: 10 * time.Second}
resp, err := client.Post("https://api.example.com/users", "application/json", bytes.NewBuffer(jsonData))
if err != nil {
panic(err)
}
defer resp.Body.Close()
}
このように、Client を再利用することで、接続プールや設定を一元管理できます。
タイムアウト設定と外部API通信
外部APIとの通信では、ネットワーク遅延やサーバー側の負荷を考慮して、適切なタイムアウトを設定することが重要です。http.Client の Timeout フィールドに加えて、context.Context を使ってリクエスト単位でタイムアウトを制御する方法もあります。
以下は、コンテキストを使ったタイムアウト付きリクエストの例です。
package main
import (
"context"
"net/http"
"time"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
req, _ := http.NewRequestWithContext(ctx, http.MethodGet, "https://api.example.com/slow", nil)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
// タイムアウト時のエラー処理
panic(err)
}
defer resp.Body.Close()
}
このパターンを使うと、リクエストが指定時間内に完了しない場合に自動的にキャンセルされ、リソースの無駄遣いを防げます。外部API通信を行う際は、必ずタイムアウトを設定し、安定した通信を確保しましょう。
コメント
コメントを投稿