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.NewEncoderjson.NewDecoder を使用する
  • Goには例外がないため、各ステップで明示的にエラーを処理する
  • リクエストスコープのキャンセルには context.WithTimeout を使用する

Goのnet/httpはcurlに比べて冗長ですが、HTTPライフサイクルのあらゆる側面を明示的に制御でき、信頼性が重要な本番サービスに最適です。

ユースケース

マイクロサービスを構築するGo開発者が、ドキュメントに記載されたAPIのcurlサンプルを標準ライブラリのみを使った慣用的なGoコードに変換する必要がある場合に使用します。

Try It — Curl to Code Converter

フルツールを開く