curlコマンド生成ツール
HTTPメソッド、URL、ヘッダー、ボディ、認証オプションから、実際に動作するcurlコマンドを生成します — 正しいシェルのクォーティングは自動的に適用され、ワンクリックでコピーできます。
237回閲覧
curlの簡単な歴史
curlは1998年、スウェーデン人開発者のDaniel Stenbergによって作られました。彼が最初のバージョンを書いたきっかけは、スウェーデンのチャットチャンネルにあるIRCボットのために為替レートを自動的に取得することでした — 壮大なインフラ構築計画ではなく、小さな個人的な必要性からの出発でした。人々はより多くのプロトコルやオプションを求め続け、この小さなユーティリティは、HTTP、HTTPS、FTP、そしてやがて数十もの他のプロトコルを介してデータを転送する汎用コマンドラインツールへと成長しました。Stenbergはその後、事実上curlの全歴史を通じて主要なメンテナーであり続けています。現在curlは、macOS、事実上すべてのLinuxディストリビューション、そして2018年以降はWindows 10以降にも標準搭載されており、ルーターや自動車からゲーム機、APIと通信するほぼすべての継続的インテグレーションパイプラインに至るまで、世界中の数十億台のデバイスで動作していると推定されています。1つの狭い個人的な問題の解決策として始まったものが、今日ではおそらく現存する中で最も広く使われているコマンドラインHTTPクライアントであり、インターネットが静かに最も依存しているオープンソースソフトウェアの1つとなっています。
このツールが生成するフラグを読み解く
デフォルトでは、curlはHTTPリダイレクトを追跡しません。サーバーが301や302のステータスと、別の場所を指すLocationヘッダーで応答した場合、素のcurlはそのリダイレクト応答 — あるいは空のボディ — を表示して停止します。Webブラウザが静かに行うように、自動的に新しいURLを追いかけることはありません。これは初めてcurlを使う非常に多くの人を混乱させます。ブラウザでは完璧に動作するURLが、curlでは一見理由もなく分かりにくい空の応答や誤った応答を返すのです — これは単に、ブラウザがcurlが追跡しなかったリダイレクトを追跡したからにすぎません。解決策は-L(--location)フラグで、これはcurlにリダイレクトの連鎖を最終的な行き先まで追跡するよう指示します。これはあまりに一般的な要件であるため、多くのエンジニアは、意図的にリダイレクトの挙動自体をテストしているのでない限り、デフォルトで-Lを使うようにしています。
コマンドに空白、引用符、あるいはシェル特有の文字($、&、;、バッククォート)を含むヘッダーやボディの内容が含まれるようになると、クォーティングの方法はもはや見た目だけの問題ではなくなります — それは、動作するリクエストと、curlが目にする前にシェルによって壊されてしまうリクエストとの違いを分けるものです。Authorization: Bearer abc 123のようなヘッダーを引用符なしで入力すると、シェルによって空白の箇所で分割されてしまい、curlは1つのまとまりではなくAuthorization:とBearerという2つの壊れた別々の引数を受け取ることになります。値全体をシングルクォートで囲むと、シェルは空白を含めて中身をすべてそのまま扱うようになります — ただし、シングルクォート自体の中にリテラルなシングルクォート文字を含めることはできません。その文字自体がクォートを閉じてしまうからです。この場合の標準的なエスケープ方法は、クォートを閉じ、バックスラッシュでエスケープしたシングルクォートを挿入し、再びクォートを開くというものです: '\''。このツールは、挿入するすべての値にこのエスケープ処理を自動的に適用するため、空白、引用符、その他の特殊文字を含むヘッダー、ボディの内容、認証情報が、常に正しく動作するコマンドを生成します — エスケープのルールを自分で覚えておく必要はありません。
よくある質問
一部のcurlコマンドで-Lフラグが必要なのはなぜですか?
curlはデフォルトではHTTPリダイレクトを追跡しません。呼び出したサーバーが301や302のステータスとLocationヘッダーで応答した場合、素のcurlは最終的なコンテンツの代わりにそのリダイレクト応答を表示し、そこで停止します。ブラウザはリダイレクトを静かに追跡するため、「ブラウザでは動作する」URLがcurlでは空の応答や予期しない応答を返すことがあります。-L(--location)を追加すると、curlは最終的な行き先に到達するまでリダイレクトの連鎖を自動的に追跡するようになります。
ヘッダーに空白が含まれているとcurlコマンドが失敗するのはなぜですか?
コマンドラインを個別の引数に分割するのはcurlではなくシェルであり、シェルはデフォルトで引用符に囲まれていない空白の箇所で分割します。Bearer abc123のようなヘッダー値を引用符なしで入力すると、シェルはそれを2つの別々の単語に分け、あたかも2つの異なる引数であるかのようにcurlへ渡してしまい、ヘッダーが壊れます。値をシングルクォートで囲むと、シェルに「中身はすべて、空白を含めて1つのリテラルなかたまりとして扱え」と指示することになります。これはまさに、このツールが入力されたすべてのフィールドに対して自動的に行っていることです。
リクエストボディのJSONモードとRawモードの違いは何ですか?
JSONモードは、ボディと一緒にContent-Type: application/jsonヘッダーを自動的に追加し、サーバーにペイロードをJSONとして解析するよう伝えます — 最近のAPIの多くは、このヘッダーが存在することを要求しており、なければリクエストを拒否したり誤って解釈したりします。Rawモードは、想定されるコンテンツタイプなしに、入力したテキストをそのまま送信します。これは、フォームエンコードされたデータ、プレーンテキスト、XML、あるいはヘッダーセクションでContent-Typeヘッダーを自分で手動設定したい場合に適した選択です。
Bearerトークン認証はBasic認証と同じものですか?
いいえ、両者の動作は異なります。Bearer認証は、通常OAuthフローやAPIキーシステムによって発行される不透明なアクセストークンを運ぶAuthorization: Bearer <token>ヘッダーを送信します — サーバーはトークンをデコードするのではなく照会します。Basic認証はAuthorization: Basic <base64(username:password)>を送信します。これは単にユーザー名とパスワードを結合してbase64エンコードしただけのものです — エンコードは暗号化ではないため、Basic認証は必ずHTTPS経由でのみ使用しなければならず、平文のHTTPで使うと認証情報は実質的に平文で送信されることになります。
curlを作ったのは誰で、今も活発に開発が続けられていますか?
curlは1998年にDaniel Stenbergによって作られ、もともとはIRCボットのために為替レートを取得する目的でした。Stenbergは事実上curlの全歴史を通じて主要なメンテナーであり続け、現在も活発に開発を続けています。趣味のプロジェクトどころか、curlは今日、オペレーティングシステムや組み込みデバイス、無数のアプリケーションに組み込まれた、世界で最も広く配布されているソフトウェアの1つとなっており、そのセキュリティと正確性は、大規模なコントリビューターコミュニティによって相応の真剣さで扱われています。
関連ツール
問題を報告
curlコマンド生成ツール
コメント
まだコメントはありません — 最初のコメントを書いてみましょう!