HTTP リクエストテスター・curl変換

HTTPリクエスト送信・コード生成・curl変換

HTTPリクエスト送信・コード生成・curl変換

URL・メソッド・ヘッダー・ボディを入力して実際の HTTP リクエストを送り、レスポンスをそのまま確認できます。curl コマンドを貼り付けて読み込んだり、今の内容を curl としてコピーすることもできます。

送信先を入力すると、そのリクエストがどこを通るかをここに表示します。

このツールの送信方法(詳細)
  • 既定は直接送信です。「送信」を押すと、ブラウザが対象サーバーへ直接リクエストします。この場合、内容が当サイトのサーバーを通ることはありません。
  • ブラウザに阻まれる場合があります。 対象サーバーが Access-Control-Allow-Origin(CORS)を返さないと、ブラウザがレスポンスの読み取りを拒否します。実運用の API はたいていこの動作です。
  • そのときだけ中継を提案します。 直接送信が阻まれると「サーバー経由で再送信」ボタンが現れます。このボタンを押したときにだけ、URL・ヘッダー・ボディが当サイトの中継サーバー(api.everytooleverywhereallatonce.com、Cloudflare Worker)を通って対象サーバーに渡ります。Authorization や Cookie などの認証情報もそのまま通ります。
  • 中継サーバーは内容を保存しません。 受け取ってすぐ転送し、レスポンスを返したら破棄します。ログにも残しません。残るのは不正利用を防ぐための IP 単位のリクエスト回数カウンターだけです。
  • 中継時は、接続元 IP を偽装できるヘッダー(x-forwarded-*・cf-*・host など)を取り除きます。User-Agent を指定しない場合は、このツールであることを示す値を付けて送ります。
  • プライベート・localhost アドレスは中継しません(内部ネットワーク探索の防止)。それらは直接送信でのみ確認できます。
  • 制限: リクエストボディ 512KB・レスポンス 2MB(超過分は切り捨て)・20 秒タイムアウト・IP ごとに毎分 20 回。
curl コマンドの読み込み / 書き出し

使い方

  • メソッドと URL を入れて「送信」を押します。ヘッダータブで名前と値を行ごとに追加し、ボディタブに JSON などを貼り付けます。
  • ブラウザの開発者ツールで「Copy as cURL」したコマンドを貼り付けて「読み込む」を押すと、メソッド・URL・ヘッダー・ボディが埋まります。
  • ブラウザは User-Agent・Cookie・Referer などをスクリプトから指定できないようにしています。入力した場合はヘッダータブの下に表示されます。
  • 直接送信ではレスポンスヘッダーも CORS の安全リスト(Content-Type・Cache-Control など)しか見えません。すべて必要ならサーバー経由で送信してください。
  • 入力内容はどこにも保存しません — 再読み込みすると消えます。

リクエストの経路

  • 既定の経路 — ブラウザ → 対象サーバー。「送信」は常に直接送信から始まります。内容が当サイトのサーバーを通ることはなく、対象サーバーから見える IP もあなた自身の IP です。
  • 中継経路 — ブラウザ → api.everytooleverywhereallatonce.com → 対象サーバー。 直接送信が CORS で阻まれ、あなたが「サーバー経由で再送信」を押したときにだけ使われます。自動で切り替わることはありません(「この訪問中は自動で再送信」を自分でオンにした場合を除き、その場合も各レスポンスに経路バッジが付きます)。
  • 中継サーバーの動作。 受け取ったリクエストをそのまま転送し、レスポンスをそのまま返します。URL・ヘッダー・ボディ・レスポンスを保存・記録・キャッシュしません。残るのは不正利用を防ぐための IP 単位のリクエスト回数カウンターだけです。
  • 中継サーバーが変えるもの。 接続元 IP を偽装できるヘッダー(x-forwarded-*・cf-*・forwarded・host)と接続単位のヘッダーを取り除きます。User-Agent を指定しない場合は、このツールであることを示す値を付けて、対象サーバーの運用者がトラフィックの正体を分かるようにします。
  • 中継しないもの。 localhost・プライベート範囲・クラウドメタデータのアドレスは中継しません。直接送信をお使いください。
  • 制限。 リクエストボディ 512KB、レスポンス 2MB(超過分は切り捨て)、20 秒タイムアウト、IP ごとに毎分 20 回。
  • このツールは、当サイトで数少ない「データがブラウザの外に出うる」ツールです。その場合と扱いはプライバシーポリシー第 4 項に記載しています。

HTTP リクエストテスター・curl変換について

このページには3つのモードがあります。リクエストテストは実際に送信してレスポンスを表示し、リクエストビルダーはクエリ・ヘッダー・ボディを表で入力してcurlコマンドを作り(送信はしません)、curl変換はcurlコマンドをJavaScript fetch、Python requests、Node.js axios、PHP cURLのコードに直します。

リクエストテストは標準で、あなたのブラウザから対象サーバーへ直接fetchします。そのため、ターミナルのcurlでは200が返るAPIがここでは失敗することがよくあります。以下ではその理由と、失敗したときの選択肢を説明します。

curlでは通るのにブラウザでは失敗する理由

ブラウザは、ページと異なるオリジン(スキーム・ホスト・ポート)のサーバーの応答を、そのサーバーがAccess-Control-Allow-Originで許可しない限りスクリプトに渡しません。これがCORSです。curlには「ページ」がないので関係ありません。決済・地図・行政データのAPIの多くはサーバー間通信を前提にしており、このヘッダーを返しません。

単純リクエストでない場合、ブラウザは本番の前にOPTIONSでプリフライトを送ります。Content-Type: application/jsonを付ける、Authorizationヘッダーを入れる、PUTやDELETEを使う、のいずれでも対象になります。サーバーがAccess-Control-Allow-Methods・Allow-Headersで答えなければ、本番のリクエストは送られません。GETは通るのにJSONのPOSTは失敗する、という現象の多くはこれです。

CORSによる遮断とDNS失敗・接続拒否は、スクリプトからはどちらも「Failed to fetch」(TypeError)にしか見えません。ブラウザが意図的に区別を隠しているため、このツールも「CORSまたはネットワーク」とまとめて表示します。本当の原因は開発者ツールのコンソールに出ます。確実に区別できるのは、https のこのページからhttp://へ送った混在コンテンツと、キャンセル操作の2つだけです。

直接送信でブラウザが変えること

  • Cookie、Host、Origin、Referer、Content-Length、Connectionなどの禁止ヘッダーはスクリプトから設定できず、黙って落とされます。ツールは入力した時点で名前を表示します(User-Agentも同様に案内します)。
  • Cookieは送りません。credentials: omitでfetchするので、対象サイトにログイン中でもセッションは付きません。
  • 読めるレスポンスヘッダーはCache-Control、Content-Language、Content-Length、Content-Type、Expires、Last-Modified、Pragmaだけです。サーバーがAccess-Control-Expose-Headersで公開しない限り、X-RateLimit-Remainingなどは見えません。
  • 「リダイレクトを追う」をオフにすると、3xxは中身の読めないopaqueredirectになります。ステータスやLocationを見るには中継を使います。

中継(プロキシ)経由で送る場合

直接送信が遮断されたあと「サーバー経由で送る」を押すと、このサイトの中継サーバーを通って送られます。サーバー間なのでCORSはなく、禁止ヘッダーもそのまま渡ります。その代わりURL・ヘッダー・ボディ全体が中継を通るため、Authorizationやapi_keyのような項目名を示して同意を求めます。本番キーよりテスト用キーを使ってください。

制限はリクエストボディ512KB、レスポンス2MB(超過分は切り捨て)、タイムアウト20秒、IPごとに毎分20回です。localhost・プライベートIP・クラウドのメタデータアドレスは中継しません。対象サーバーには中継サーバーのIPが記録されます。

curlオプションの対応

  • -d、--data-raw、--data-binary:ボディになり、-XがなければPOST、Content-Typeがなければapplication/x-www-form-urlencodedが付きます(curl本体と同じ動作)。-d @ファイルのように@で始まる値は、curlならファイルの中身を読みますが、ここではファイルを読めないため文字どおりボディに入れて警告します。このツールが作るcurlコマンドは、この誤解が起きないようボディを--data-rawで渡します。
  • --json:ボディに加えてContent-TypeとAccept: application/jsonを追加します。
  • -G:-dのデータをクエリに移してGETにします。--data-urlencodeの値はパーセントエンコードされます。
  • -u user:passはAuthorization: Basicに、-IはHEAD、-bはCookie、-AはUser-Agent、-eはRefererになります。ただし-HでAuthorizationを直接指定している場合は、curlと同じく-Hの値を使い、-uは無視して知らせます。
  • -F(ファイルアップロード)、-T、--proxy、証明書関連は移せないので警告が出ます。-kはブラウザも中継も証明書検証を省けないため無視されます。

リクエストビルダーとcurl変換

ビルダーはチェックした行だけをencodeURIComponentでクエリに付け、ボディがJSONのときは先にJSON.parseで検査し、不正ならコマンドを作りません。生成されるコマンドはボディを-dではなく--data-rawで渡します。-dは@で始まる値をファイル名として読むからです。

curl変換は4言語それぞれの書き方に合わせます。-uはfetch・axiosではBasicヘッダー、requestsではauth=("user", "pass")、PHPではCURLOPT_USERPWDになります。-kはPythonではverify=Falseになりますが、ブラウザのfetchに証明書検証を切る方法はありません。

例

「Copy as cURL」の読み込み

入力
curl 'https://api.example.com/v1/items?page=2' -H 'Authorization: Bearer abc' -u admin:secret --json '{"name":"pen"}' -k -F file=@a.png
結果
POST https://api.example.com/v1/items?page=2 Authorization: Bearer abc Content-Type: application/json Accept: application/json ボディ: {"name":"pen"} 警告: -k は無視、-F は非対応、-H Authorization があるため -u は無視

-H Authorizationと-uが両方あると、curlは-Hの値を送り、-uで作るBasicヘッダーは捨てます。このツールも同じく、Authorizationを1行だけ残して警告します。Basic認証を使うなら-Hの行を消して取り込み直してください(admin:secretはBasic YWRtaW46c2VjcmV0になります)。

-Gでクエリを作る

入力
curl -G https://api.example.com/search -d q=hello --data-urlencode 'city=São Paulo'
結果
GET https://api.example.com/search?q=hello&city=S%C3%A3o+Paulo

ãはUTF-8で2バイト(C3 A3)、空白はクエリでは+で表されます。

使い方

  1. メソッドとURLを入力するか、curlコマンドを貼って読み込みます。
  2. ヘッダー・ボディを入力して送信します。
  3. CORSで遮断されたら説明を読み、必要なときだけ中継で送り直します。
  4. コードが必要ならビルダーやcurl変換のタブからコピーします。

よくある質問

Postmanでは動くのにここではCORSエラーになります。

Postmanのデスクトップアプリはブラウザではないため、CORSの検査をしません。ここでの直接送信はブラウザの規則に従います。

自分のAPIのCORS設定を確認できますか?

直接送信で試してください。成功すればこのサイトのオリジンが許可されています。中継での成功はCORSとは無関係です。

localhostのAPIは試せますか?

直接送信のみです。ローカルサーバーがこのサイトのオリジンをCORSで許可している必要があります。

レスポンスヘッダーが少ししか見えません。

直接送信ではCORSセーフリストのヘッダーしか読めません。すべて見るには中継で送ってください。

出典

基準日:

プライバシーとデータの扱い