cURL → コード変換

curl コマンドを貼り付けると、fetch / axios / Go net/http / Python requests の同等コードを生成。-X / -H / -d / -u / --form / バックスラッシュ継続行に対応。

Loading…

すべての処理はブラウザ内で実行されます — ファイルや入力はサーバへ送信されません。

使い方

`curl ...` コマンドを貼り付けてください。一行でも、バックスラッシュで継続した複数行でも、値が引用符に囲まれていても、API ドキュメントが渡してくるどんな形でも大丈夫です。パーサがメソッド、URL、ヘッダ、ボディ、認証に分解し、JavaScript fetch、axios、Python requests、Go `net/http` の同等コードを生成します。タブを切り替えて対象言語を選び、スニペットをコピーしてエディタに貼り付けてください。

API ドキュメントが curl の例を出し、自分のスタックが別言語のときに使ってください。ブラウザのネットワークリクエストをリバースエンジニアリングする際(Chrome / Firefox の DevTools で右クリック → cURL としてコピー)や、Postman / Insomnia でリクエストを書いて同等コードをコミットしたいときにも有効です。変換は一般的なオプション(`-X`、複数の `-H` ヘッダ、`-d` / `--data` / `--data-raw`、Basic 認証の `-u`、マルチパートの `--form`、`\` による行継続など)を扱いますが、出力が実際に動くかは必ず確認してください。各言語に独自のエスケープ規則があり、curl - コード変換は珍しいフラグの組み合わせの意図までは推測しきれません。

認証ヘッダ付きの単純な GET

入力
curl https://api.example.com/users/42 \
  -H "Authorization: Bearer eyJhbGciOi..." \
  -H "Accept: application/json"
出力
// fetch
await fetch("https://api.example.com/users/42", {
  headers: {
    "Authorization": "Bearer eyJhbGciOi...",
    "Accept": "application/json",
  },
});

# requests
requests.get(
  "https://api.example.com/users/42",
  headers={
    "Authorization": "Bearer eyJhbGciOi...",
    "Accept": "application/json",
  },
)

ボディなしの GET は最も単純なケースです。`\` で行継続された複数行入力はパース前に 1 行に畳まれるため、貼り付けた順序や空白は問題になりません。出力はどちらもヘッダ名の大文字小文字を元のままに保ちます。HTTP ヘッダは本来大文字小文字を区別しませんが、まれに文字列を厳密に比較する不具合のあるサービスがあるためです。

JSON ボディの POST

入力
curl -X POST https://api.example.com/orders \
  -H "Content-Type: application/json" \
  -d '{"item_id": 42, "quantity": 2}'
出力
// fetch
await fetch("https://api.example.com/orders", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ "item_id": 42, "quantity": 2 }),
});

# requests
requests.post(
  "https://api.example.com/orders",
  json={"item_id": 42, "quantity": 2},
)

curl の `-d` / `--data` フラグは暗黙にメソッドを POST に切り替え、`-H` で上書きしない限り `Content-Type: application/x-www-form-urlencoded` を設定します。本コンバータは JSON ボディを検出し、各言語のイディオム的なヘルパー(JS の `JSON.stringify`、Python の `json=` キーワード引数で Content-Type が自動設定される)を出します。リテラルな form-urlencoded データを送りたい場合は `-d "key=value&key=other"` と書けば、コンバータは `URLSearchParams` / `data=` に切り替えます。

認証付きのマルチパートアップロード

入力
curl -X POST https://api.example.com/upload \
  -u admin:secret \
  --form "[email protected]" \
  --form "caption=hello"
出力
// fetch
const form = new FormData();
form.append("file", fileInput.files[0]);
form.append("caption", "hello");
await fetch("https://api.example.com/upload", {
  method: "POST",
  headers: { "Authorization": "Basic " + btoa("admin:secret") },
  body: form,
});

# requests
requests.post(
  "https://api.example.com/upload",
  auth=("admin", "secret"),
  files={"file": open("photo.jpg", "rb")},
  data={"caption": "hello"},
)

`--form` で multipart/form-data になります。`-u user:pass` は HTTP Basic 認証へ変換され、Python `requests` はタプル引数で、JS fetch は `Basic ` + `user:pass` の base64 を手動で作る必要があります。curl の `@filename` 構文はディスクからファイルを読みますが、JS 出力はブラウザでそれを再現できないため、フォーム入力から得た `File` を期待する形(スニペットにコメントやヒント)で出します。実際のソースに差し替えてください。

よくある質問

DevTools の「cURL としてコピー」出力が長大ですが、すべて重要ですか?

その大半はブラウザが自動で付与するヘッダ — `User-Agent`・`Accept-Language`・`sec-ch-ua-*`・`Cookie`・`Origin`・`Referer` などです。サーバが実際に必要とするもの(通常は `Authorization`・`Content-Type` と独自の `X-...` ヘッダ)に絞ってください。Cookie ヘッダは特にセッションに紐づくため、ログアウト後は失敗するようになります。サーバ間で再現したいなら、適切な API トークンを取得して置き換えてください。本コンバータは与えられた入力をすべて出力するため、入力側で絞り込むのが正しい使い方です。

`--data-raw`・`--data`・`--data-binary` の違いは?

3 つともリクエストボディを送ります。**`--data` / `-d`** は改行や `\r\n` を除去するため、form-urlencoded には十分ですが JSON や意図的な空白を含む内容では破損します。**`--data-raw`** はすべてをリテラルに保ちます(Chrome DevTools の既定出力)。**`--data-binary`** もすべて保ち、加えて Content-Type の自動推定を行わないため、stdin 経由のファイルアップロードやバイナリブロブに使われます。API 呼び出しの 99% は `--data-raw` が無難で、本コンバータはこの 3 つを同等のリクエストボディとして扱います。

`-k` や `--cert` のような TLS / 証明書フラグも扱えますか?

部分的に対応しています。`-k` / `--insecure`(証明書検証の無効化)は Node の `rejectUnauthorized: false`、Python `requests` の `verify=False`、Go の `InsecureSkipVerify: true` に対応付け、警告付きで出力します。クライアント証明書フラグ(`--cert`・`--key`・`--cacert`)は言語間の移植性が大きく下がるため、本コンバータは多くの場合コメントとしてマークするにとどめ、手作業で配線するよう促します。いずれの設定もセキュリティレビューなしに本番コードに入れるべきではありません。

変換されたコードが動きません — なぜですか?

よくある原因です。**CORS**: ブラウザの fetch は同一オリジンとプリフライトのルールを強制しますが、curl はこれを無視します。端末から curl が動いても、ブラウザではサーバ側の協力(`Access-Control-Allow-Origin`)がないと失敗します。**Cookie のスコープ**: ブラウザの fetch はページが見えるクッキーのみを送りますが、`-b` を付けた curl はあなたが書いたものを送ります。**圧縮**: curl は `--compressed` で gzip / brotli を自動展開しますが、fetch や `requests` では明示処理が必要です。**リダイレクト**: curl は `-L` を付けた場合のみ追従しますが、対象ライブラリの中には既定で追従するものがあります。スニペットは必ず一度動かして、実応答を curl と比較し、ヘッダや設定を合わせてください。

Python 出力が `requests` のときと `httpx` のときがあるのはなぜですか?

本ツールは既定で `requests` を出します — 最も普及しており、既にインストール済みの確率も高いためです。async や HTTP/2 を扱う場面では `httpx` がほぼ同一の API を持つ現代的な選択で、両方を提供するコンバータもあります。`asyncio` から呼ぶ必要があれば `requests.post` を `httpx.AsyncClient().post` に置き換えてください。残りの呼び出しは同じです。Go 出力で `resty` などサードパーティではなく標準ライブラリの `net/http` を使うのも同じ理由 — 追加で入れるべき依存がないためです。

逆方向(コード → curl)の変換はできますか?

本ツールは一方向(curl → コード)です。逆方向には、Postman は保存したリクエストを curl としてエクスポートでき、Chrome DevTools のネットワークパネルはキャプチャしたリクエストに対して同じ操作ができ、Insomnia / Bruno も同様です。プログラム的なコード → curl はあまり一般的ではありません。各言語の HTTP ライブラリには curl にない機能(インターセプタ、コネクションプール、ミドルウェアなど)があり、それらは往復できないためです。「ソースコード」よりも「実際に発火したリクエスト」から curl を取るほうが信頼性が高いです。

関連する概念

curl(1997 年、Daniel Stenberg 作)は HTTP の共通言語です。あらゆる Linux ディストリ、macOS、Windows 10 以降、Docker のベースイメージ、CI ランナーに同梱されるコマンドラインクライアントです。その構文はドキュメントを兼ねます。任意の HTTP リクエストは一行の curl で表せるため、Stripe・GitHub・Twilio・AWS など、ほとんどの API ドキュメントは内部の SDK が何であれ curl 例を載せています。curl からの変換は、ドキュメントのネイティブ形式から自分のスタックの形式への変換に等しいのです。

パースは見た目より厄介です。シェルのトークン化(引用符・エスケープ・バックスラッシュ行継続・`$variable` 展開)は curl に届く前に行われるため、堅牢なパーサは POSIX シェルを十分に模倣して入力を正しく分割する必要があります。次に、各フラグに固有の意味があります。`-d` はメソッドを POST に切り替え Content-Type を設定する、`-G` はそれを反転して GET + クエリパラメータにする、`-H` は反復可能、`-u user:pass` は Basic 認証ヘッダを生成する、`--data-urlencode key=value` は値を送信前に URL エンコードする、といった具合です。本格的なコンバータは `man curl` から取ったフラグ表を保持しますが、本ツールは実環境の curl コマンドの 99% に登場する 30 余りのフラグをカバーします。

隣接する 3 概念があります。**OpenAPI / Swagger** は、同じリクエストをコードジェネレータが多数の言語でクライアントを生成できるくらい抽象的に記述します。一回限りの curl - コード問題に対する体系的な解です。**HAR(HTTP Archive)** は DevTools の「全部を HAR で保存」で書き出される JSON 形式で、ヘッダもボディも含めたリクエスト / 応答全体を保持し、`har2curl` などで curl やコードに変換できます。**Postman / Insomnia / Bruno** は同じワークフローの GUI 版で、curl を貼り付けると編集可能なリクエストになり、複数言語へエクスポートできます。本コンバータは、curl とエディタ上のコードを直結する最も素朴な形に位置します。

関連記事

関連ツール