curl コマンドの作成・変換ツール

curl コマンドを作成し、fetch、Python、HTTPie に変換します。

このツールについて

メソッド、URL、ヘッダー、ボディ、認証を入力すれば、すぐに実行できる curl コマンドが得られます。既存の curl コマンドを貼り付けて編集することもできます。すべてのリクエストは JavaScript の fetch、Python の requests、HTTPie でも表示されます。何も送信されません。このツールはコマンドを書き出すだけです。

使い方

  1. 既存の curl コマンドを貼り付けてインポートします。たとえばブラウザーの開発者ツールの「Copy as cURL」でコピーしたものが使えます。
  2. またはメソッドと URL を設定し、ヘッダー、認証、JSON・フォーム・raw のボディを追加します。
  3. リダイレクトをたどる、レスポンスヘッダーを表示するなどのオプションを選びます。
  4. 結果を curl、JavaScript の fetch、Python の requests、HTTPie としてコピーします。

よくある質問

curl で JSON を送信するには?
-H 'Content-Type: application/json' と --data-raw '{"key":"value"}' を一緒に使います。新しいバージョンの curl には --json もあり、Content-Type と Accept の両方のヘッダーを設定してくれます。ここでボディの種類に JSON を選べば、適切なフラグが追加されます。
このツールはリクエストを送信しますか?
いいえ。コードを書き出すだけです。何もブラウザーの外に出ないため、トークンを含むコマンドを貼り付けても安全ですが、コマンドを共有する前に本物の秘密情報をプレースホルダーに置き換えるのがよい習慣です。
-d と --data-raw の違いは何ですか?
-d では、@ で始まる値はファイルから読み込まれます。--data-raw はテキストを書かれたとおりに送信するため、JSON や @ で始まる可能性のある値にはこちらの方が安全です。
curl がリダイレクトをたどらないのはなぜですか?
curl はデフォルトでリダイレクトの応答そのものを表示します。新しい場所に移動するには -L(リダイレクトをたどる)を追加してください。fetch や多くのライブラリは自動的にリダイレクトをたどります。
どの curl オプションをインポートできますか?
メソッド、URL、ヘッダー、データ系オプション、--json、-u、ユーザーエージェント、Cookie、リファラー、-G、-L、-i、-s、-k、-v、--head、--compressed に対応しています。マルチパートの -F フィールドやその他のまれなオプションは、注記付きでスキップされます。
curl でフォームデータを送るには?
curl -d "name=Ada&role=admin" URL は URL エンコードされたフォームを送り、メソッドを自動的に POST に切り替えます。値にスペースや記号が含まれる場合は --data-urlencode "q=hello world" を使います。ファイルのアップロードにはマルチパートの -F "file=@photo.jpg" が必要ですが、このツールはインポート時にこれをスキップするため、手で追加してください。
curl の GET リクエストにクエリパラメーターを追加するには?
URL に含め、URL 全体をダブルクォートで囲みます。& と ? はシェルにとって意味を持つためです。あるいは -G --data-urlencode "q=red shoes" で別々に指定すれば、ボディを送る代わりに、エンコードされた値が URL に追加されます。ここでのインポートは -G を解釈し、値を URL に移します。
curl でレスポンスヘッダーを確認するには?
-i はボディの前にステータス行とヘッダーを出力します。-I(--head)は HEAD リクエストを送ってヘッダーだけを表示しますが、HEAD に GET とは異なる応答を返すサーバーもあります。-v はリクエストヘッダーと TLS ハンドシェイクも表示するため、リダイレクト、認証、証明書のエラーをデバッグするときに役立ちます。

curl を Python の requests に変換する方法

「curl コマンドをインポート」欄に curl コマンドを貼り付けて、Python を選びます。ヘッダーは dict になり、JSON のボディは json=payload になって requests がシリアライズと Content-Type の設定を行い、フォームや raw のボディは data=payload になります。-u の Basic 認証は auth=(user, password) に、-k は verify=False になります。Bearer トークンは Authorization エントリーとしてヘッダーに残ります。

意外に思うかもしれない行が 2 つあります。requests はデフォルトでリダイレクトをたどりますが curl はたどらないため、curl コマンドに -L がない限り、コードには allow_redirects=False が追加されます。また、requests にはデフォルトのタイムアウトがなく、応答しないサーバーをいつまでも待ち続けることがあるため、timeout=30 が追加されます。そのまま残すか、数値を変更してください。同じリクエストは、ワンクリックで JavaScript の fetch や HTTPie でも表示できます。

curl では動くリクエストが fetch では動かないのはなぜですか?

よくある原因は CORS です。curl はリクエストを送って返ってきたものをそのまま出力しますが、ブラウザーがページにクロスオリジンのレスポンスを読ませるのは、サーバーが Access-Control-Allow-Origin で許可した場合だけです。また、ブラウザーは Cookie や Host など一部のヘッダーをコードから設定することを拒否します。同じ fetch のコードでも Node で実行すれば CORS のチェックはないため、curl と同じように動作します。

動作する出発点を得るには、ブラウザーの開発者ツールで「ネットワーク」タブを開き、リクエストを右クリックして「Copy as cURL」(cURL としてコピー)を選びます。Windows では bash 版を選んでください。cmd 版はエスケープの方式が異なります。コピーしたコマンドには、sec-ch-ua や長い Cookie など、ほとんど不要なブラウザーのヘッダーが多数含まれているので、変換する前にヘッダーのリストで削除してください。

HTTPie と curl の構文を比較

curl は、macOS や Windows 10 以降を含め、ほぼどこにでもインストールされています。HTTPie(http コマンド)は構文が短く、出力に色が付きます。ヘッダーは -H なしで Name:value と書き、フォームのフィールドは --form と name=value で指定し、-L の代わりに --follow、-k の代わりに --verify=no を使います。生成される HTTPie コマンドは JSON のボディをヒアストリングで渡します。これは bash や zsh では動きますが、PowerShell では動きません。

Basic 認証では、curl -u user:password も HTTPie -a user:password も、Authorization ヘッダーを自動で組み立てます。認証情報は Base64 エンコードされているだけで暗号化はされていないため(Base64 ツールで確認できます)、必ず HTTPS で送ってください。トークンの場合、curl は -H "Authorization: Bearer TOKEN"、HTTPie は -A bearer -a TOKEN を使います。curl コマンドをインポートすると、Bearer ヘッダーは自動的に「認証」欄に移されます。

うまく動かない、または結果がおかしいですか? このツールの問題を報告