URLクエリ文字列をキーと値のオブジェクトに解析
この解析ツールは、完全な絶対URLまたはクエリ文字列だけの入力を、キーと値からなる構造化オブジェクトに変換します。パーセントエスケープとフォーム形式のプラス記号を復号し、空の値を保持したまま、同じパラメーターを元の順序で配列にまとめます。不正なエスケープや無効なUTF-8は、文字を黙って置き換えず明確なエラーにします。ブラウザーでリンクを調べる場合にも、アプリケーション、テスト、取り込み処理から1項目あたり$0.002で決定論的なAPIを呼び出す場合にもご利用いただけます。
無料で実行
入力元に合う形式をお選びください
<code>https://example.com/search?q=red+shoes</code>のような完全な絶対URL、<code>q=red+shoes&page=2</code>のようなクエリ文字列、または先頭に疑問符を付けた同じ文字列を入力できます。絶対URLではクエリ部分だけを解析し、スキーム、オーソリティ、パス、フラグメントを項目にはしません。クエリのないURLからは空のパラメーターオブジェクトが返ります。クエリ文字列だけを入力した場合は、任意の先頭の疑問符を除いた全体をクエリデータとして扱います。フレームワーク、アクセスログ、Webhook、ブラウザーAPIなどが、すでにアドレスのほかの部分からクエリを分離している場合に便利です。各アンパサンドから新しい組が始まり、最初の等号で名前と値を分けます。等号のない名前も、明示的に空の値を割り当てた名前も、空文字列の値として保持します。連続するアンパサンド間の空区間は無視します。結果には、異なるキーの数と解析した組の数も含まれます。そのため、オブジェクトを数え直さなくても、固有の名前と繰り返された項目を判別できます。
復号と重複キーの扱いをご確認ください
名前と値は、URLクエリのフォームで一般的な規則に従い、それぞれ個別に復号します。プラス記号は空白になり、<code>%HH</code>形式の並びはUTF-8のバイトとして解釈します。そのため、<code>city=San+Jos%C3%A9</code>は読みやすいUnicode文字列になり、<code>%26</code>のように符号化された区切り記号は、新しい項目の開始と誤認されず、1つの値の中に残ります。復号は正確に1回だけ行います。<code>%2520</code>の結果は<code>%20</code>であり、空白にはなりません。キーが1回だけ現れる場合、その値は文字列です。同じ復号済みキーが再び現れると、値は元の出現順ですべてを収めた配列になります。この規則により、チェックボックス群、絞り込み条件、タグ、複数選択を、情報を捨てたり番号付きプロパティを作ったりせずに表現できます。重複は復号後に判定するため、同じ名前の等価な符号化表記もまとめられます。繰り返された空の値も保持します。真偽値、数値、日付を推測せず、角括弧表記を入れ子オブジェクトとしても解釈しません。すべての単純値を文字列のまま返すため、後続処理で業務仕様に合う変換を明示的に適用できます。
破損したデータを処理前に拒否できます
寛容すぎる解析器は、単独のパーセント記号や1桁だけのエスケープを受け入れたり、符号化バイトが正しいUTF-8でないときに代替文字を挿入したりすることがあります。その結果、壊れた識別子が利用可能に見え、ブラウザー、サーバー、署名検証処理の間に追跡しにくい差が生じます。この機能は、すべてのパーセント記号の直後に16進数字が正確に2桁あることを確認し、さらに復号した各バイト列が有効なUTF-8であることを検証します。いずれかの条件を満たさない場合、不完全なオブジェクトではなく入力エラーを返します。処理は純粋かつ決定論的です。ネットワークへ接続せず、リダイレクトを追跡せず、時刻や乱数を使わず、呼び出し間の状態も保持しません。返された文字列はデータとして扱い、信頼済みのHTML、コード、ファイルパス、データベース式として直接使用しないでください。復号は文字を復元しますが、その後の利用を安全にする処理ではありません。自動化では1項目あたり$0.002のAPIを、検証、振り分け、比較、保存より前の安定した正規化工程として利用できます。ブラウザーでは同じロジックにより、リンク先へ接続せずコピーしたリンクをすぐ確認できます。
活用例
コピーしたURLの確認
検索、キャンペーン、コールバックの長いURLを、リンク先へ接続せず読みやすい項目に変換できます。
Webhook入力の正規化
アプリケーション固有の検証より前にクエリを解析し、重複パラメーターの値をすべて保持できます。
再現可能なテストデータの作成
結合テストや取り込み処理で、復号、空の値、重複キーの挙動を正確に確認できます。
よくある質問
APIリクエストの料金はいくらですか?
解析する1項目あたり$0.002です。ブラウザーの対話型ツールにも同じ決定論的な処理を使用しています。
同じキーが複数回現れるとどうなりますか?
1回だけなら値は文字列です。繰り返された場合は、すべての値を元の順序で含む配列になります。
プラス記号は空白に変換されますか?
はい。一般的なフォーム符号化ではプラス記号が空白を表します。文字としてのプラス記号を残す場合は%2Bを使用してください。
数値や真偽値を自動判定しますか?
いいえ。空文字列、数値に見える文字、true、falseを含め、単純値はすべて文字列です。必要な変換はご自身のスキーマに従って行ってください。
どのようなパーセントエンコードエラーを拒否しますか?
直後に16進数字2桁がないパーセント記号と、有効なUTF-8にならない符号化バイト列を拒否します。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/web/query-string-parse \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"https://example.com/search?q=red+shoes&tag=sale&tag=new&empty="}'const res = await fetch("https://api.kit.forhosting.com/web/query-string-parse", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "https://example.com/search?q=red+shoes&tag=sale&tag=new&empty="
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/query-string-parse",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "https://example.com/search?q=red+shoes&tag=sale&tag=new&empty="
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/query-string-parse", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"https://example.com/search?q=red+shoes&tag=sale&tag=new&empty="}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"https://example.com/search?q=red+shoes&tag=sale&tag=new&empty="}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/query-string-parse", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"text": "https://example.com/search?q=red+shoes&tag=sale&tag=new&empty="
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.query_string_parse",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
timeout_sec | 30 |
max_crawl_pages | 25 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |