cURL to Go — cURL コマンドを Go コードに変換
cURL コマンドを net/http を使った慣用的な Go コードに変換します。ヘッダー、Cookie、リクエストボディを解析し、すべてブラウザ内で完結。アップロードなし、制限なし。
cURL to Go
Convert cURL commands to Go HTTP code. Works entirely in your browser — no uploads.
cURL to Go は本ツールボックスにある 3 つの cURL から言語への変換器の 1 つで、出力先が Go サービスや CLI ツール、サーバーレス関数であるなら Go 版が正解です。Go の net/http パッケージは、主要な言語の中でもやや冗長な HTTP クライアントです —— 同じ cURL コマンドが Python では 5 行の requests スニペットになる一方、Go では 15 行になります —— しかしその冗長さは、依存ゼロ、強い型システム、そしてコンパイル時にバグを検出する強力な静的解析と引き換えに得られます。長期間動くサービスにとっては、冗長さはバグではなく仕様です。
cURL to Go について「意外と分かりにくい」のは、cURL のフラグが実際に何に対応づけられるかという点です。ここで使われているパーサーは、本ツールボックスの Python 版・JavaScript 版と同じ curlconverter ライブラリで、Go の出力は Go の慣用パターンに従います。ヘッダーは http.Header マップ、ボディは strings.NewReader、Basic 認証は req.SetBasicAuth、Cookie は生のヘッダーエントリになります。生成されるコードは Go 1.18+ の任意のツールチェーンでコンパイル可能で、外部パッケージのために go get を実行する必要はありません。すでにサードパーティの HTTP クライアント(resty、gentleman、gorequest など)を使っているプロジェクトにとっては、ここでの出力は出発点となり、プロジェクトの流儀に合わせて調整できます。
最後にハンドオフの話をします。Go サービスで API を試すことが目的なら、生成されたコードを関数内に貼り付け、コンテキストに合ったエラー処理を追加してください —— 出力には if err != nil チェックが含まれていますが、context(fmt.Errorf("...: %w", err))の付与や構造化ロギングは含まれません。その場限りのスクリプトが目的なら、出力はそのまま使えます。長期運用するクライアントが目的なら、変数名を整理し、タイムアウトを追加し、http.Client をサービスが必要とする API メソッドだけを公開するカスタム構造体にラップすることを検討してください。
使い方
cURL コマンドを貼り付ける
ブラウザの DevTools(Network タブ > Copy as cURL)、ドキュメントページ、またはシェル履歴から cURL コマンドをコピーしてください。パーサーは `-H`、`-d`、`-X`、`-u`、`--cookie` などよくあるフラグを扱えます。
生成された Go コードを確認する
出力は Go 標準ライブラリの `net/http` パッケージを使うため、サードパーティ依存はありません。ヘッダーは `http.Header` マップのエントリ、ボディは `strings.NewReader` となり、リクエストは `http.Client.Do()` を経由して送信されます。
変数名を調整する
ツールは既定の変数名(`req`、`client`、`resp`)を選びます。出力内の任意の名前をクリックすればリネームできます。出力は自己完結した 1 つのスニペットなので、Go ファイルにそのまま貼り付けられます。
よくある質問
サードパーティ製のパッケージは使いますか?
いいえ —— 生成されるコードは Go 標準ライブラリのみを使用します:`net/http`、`strings`、`io`、`fmt`、そして `os`。go.mod に追加する依存はなく、ベンダー取り込みする外部インポートもなく、バージョンピンニングの心配もありません。
リクエストボディはどのように扱われますか?
`-d` および `--data` フラグはリクエストボディとして `strings.NewReader(body)` を生成します。JSON ボディは安全のため `bytes.NewReader([]byte(body))` でラップされます。フォームエンコードのボディは Go の http ライブラリがそのまま扱えるため、そのまま出力されます。
Cookie や認証はどうなりますか?
`-b 'name=value'` は `Cookie` ヘッダーエントリになります。`-u 'user:pass'` は `req.SetBasicAuth` で設定される Basic 認証ヘッダーになります。`-H 'Cookie: ...'` は生のヘッダーとしてそのまま保持されます(これは DevTools からコピーしたときに出力される形式です)。
生成されたコードはコンパイルできますか?
はい —— 出力は Go 1.18+ のツールチェーンでコンパイル可能な正しい Go コードです。エラー処理には慣用的な `if err != nil` パターンが使われています。レスポンスボディは文字列に読み込まれて print されますが、本番コードではコンテキストに応じたエラー処理を追加すべきです。
複雑なマルチパートアップロードのコードも生成できますか?
マルチパートアップロード(`-F`)はサポートされていますが、Go の `mime/multipart` パッケージがフォーム組み立てに `Writer` を必要とするため、出力はやや冗長になります。生成されるコードは正しいですが、cURL to Python や cURL to JS の出力ほどコンパクトではありません。
制限事項
- 標準ライブラリのみ生成されるコードは `net/http` を使用します。より流暢な API を望む場合は、変換後に `resty` や `gentleman` などのサードパーティ製ライブラリへ切り替えてください。本ツールが提供するのは動作するベースラインであり、本番利用ではライブラリを使って最終的なコードを短縮できます。
- 自動リトライなし生成された `http.Client` にはタイムアウトもリトライポリシーもコネクションプールのチューニングもありません。本番コードでは、タイムアウト付きのコンテキストと、接続先 API に適したリトライポリシーでクライアントをラップしてください。
- マルチパートアップロードは冗長マルチパートフォームのアップロード(`-F file=@path`)は、Go の `mime/multipart` パッケージが Writer の明示的なセットアップを要するため、等価な Python や JavaScript より長い Go コードを生成します。コードは動作しますが、シンプルなリクエストと比べるとスニペットの可読性は落ちます。
プラットフォーム別の注意点
- macOS
- 生成されるコードが `any` 型を使用するため、Go 1.18+ が必要です。最新の Go リリースが最も確実です —— Homebrew(`brew install go`)でインストールするか、go.dev から .pkg をダウンロードしてください。
- Windows
- Go 1.18+ が必要です。go.dev の Windows 用インストーラーが GOPATH を設定し、`go` を PATH に追加します。生成されるコードはプロジェクト固有の設定 없이、あらゆる Go ワークスペースで動作します。
- Linux
- Go 1.18+ が必要です。多くのディストロの公式リポジトリには古い Go しか入っていないため、go.dev から公式の .tar.gz をダウンロードするか、バージョンマネージャー(g、gvm)を使って新しいツールチェーンを取得してください。
- CLI
- 本ツールを駆動している同じライブラリが npm の `curlconverter` パッケージとしても公開されており、`curlconverter --language go` の CLI モードが用意されています。ビルドスクリプトへの組み込みや、保存しておいた cURL コマンドの一括変換に便利です。
- Web
- 完全にクライアントサイドで動作します。ページを読み込み終えればオフラインでも利用可能。生成される Go コードは可搬性が高く、任意の Go モジュールに貼り付けて `go run main.go` を実行すれば、動く HTTP クライアントが手に入ります。