curlコマンドをGo net/httpに変換
curlコマンドをGoのnet/http標準ライブラリに変換する方法を解説。リクエスト、レスポンス、エラーハンドリングにおけるGoの慣用的なHTTPパターンを詳しく学びましょう。
Go
詳細な説明
curlからGo net/httpへの変換
Goの標準ライブラリ net/http パッケージは、サードパーティの依存関係なしにほとんどのHTTPタスクを処理できる十分な機能を備えています。curlをGoに変換するには、Goの明示的なエラーハンドリングとio.Readerパターンの理解が必要です。
GETリクエスト
curl:
curl https://api.example.com/users
Go:
resp, err := http.Get("https://api.example.com/users")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(body))
JSONを使ったPOST
curl:
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name": "Alice"}'
Go:
payload := strings.NewReader(`{"name": "Alice"}`)
req, err := http.NewRequest("POST", "https://api.example.com/users", payload)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
カスタムヘッダー
req, _ := http.NewRequest("GET", "https://api.example.com/me", nil)
req.Header.Set("Authorization", "Bearer token123")
req.Header.Set("Accept", "application/json")
タイムアウトとトランスポート設定
curl:
curl --connect-timeout 5 --max-time 30 https://api.example.com/data
Go:
client := &http.Client{
Timeout: 30 * time.Second,
}
Goにおける重要なパターン
- リソースリークを防ぐため、必ず
defer resp.Body.Close()を呼び出す - メソッド、ヘッダー、ボディを完全に制御するには
http.NewRequestを使用する - 構造化データには
json.NewEncoderとjson.NewDecoderを使用する - Goには例外がないため、各ステップで明示的にエラーを処理する
- リクエストスコープのキャンセルには
context.WithTimeoutを使用する
Goのnet/httpはcurlに比べて冗長ですが、HTTPライフサイクルのあらゆる側面を明示的に制御でき、信頼性が重要な本番サービスに最適です。
ユースケース
マイクロサービスを構築するGo開発者が、ドキュメントに記載されたAPIのcurlサンプルを標準ライブラリのみを使った慣用的なGoコードに変換する必要がある場合に使用します。