背景(質問はさらに下)
私はこれを何度もグーグルで調べて、RFCとSOの質問を読んでこれを解こうとしましたが、それでもジャックはありません。
だから、私たちは「最良の」答えに投票するだけだと思います、それだけですか?
基本的には、これに要約されます。
3.4。クエリコンポーネント
クエリコンポーネントは、リソースによって解釈される情報の文字列です。
query = *uric
クエリコンポーネント内では、文字「;」、「/」、「?」、「:」、「@」、「&」、「=」、「+」、「、」、および「$」は予約されています。
最初に私を驚かせることは* uricがこのように定義されていることです
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
ただし、これは次のような段落でいくらか明確になります。
上記の「予約済み」構文クラスは、URI内では許可されているが、汎用URI構文の特定のコンポーネント内では許可されていない可能性がある文字を指します。これらは、セクション3で説明するコンポーネントの区切り文字として使用されます。
「予約済み」セットの文字は、すべてのコンテキストで予約されているわけではありません。特定のURIコンポーネント内で実際に予約されている文字のセットは、そのコンポーネントによって定義されます。一般に、文字がエスケープされたUS-ASCIIエンコーディングで置き換えられた場合にURIのセマンティクスが変更されると、文字は予約されます。
この最後の抜粋はやや逆に感じられますが、予約された文字セットはコンテキストに依存すると明確に述べています。しかし3.4では、すべての予約文字はクエリコンポーネント内で予約されていると述べていますが、URIはクエリ文字列の概念を定義していないため、ここでセマンティクスを変更するのは疑問符(?)をエスケープすることだけです。
この時点で私は完全にRFCをあきらめましたが、RFC 1738は特に興味深いものでした。
HTTP URLの形式は次のとおりです。
http://<host>:<port>/<path>?<searchpart>
<path>および<searchpart>コンポーネント内で、「/」、「;」、「?」予約されています。"/"文字は、階層構造を指定するためにHTTP内で使用できます。
私はこれを、RFC 1738がRFC 2396に取って代わるHTTP URLに関して少なくとも解釈します。URIクエリにはクエリ文字列の概念がないため、予約済みの解釈では、慣れているクエリ文字列を定義できません。今までにやっている。
質問
これはすべて、別のリソースのリクエストとともに数値のリストを渡したいときに始まりました。私はそれについてはあまり考えず、コンマ区切りの値として渡しただけです。驚いたことに、コンマはエスケープされました。page.html?q=1,2,3
エンコードされたクエリは機能しますpage.html?q=1%2C2%2C3
が、醜く、期待していませんでした。それは私がRFCを通過し始めたときです。
私の最初の質問は単純です、コンマのエンコードは本当に必要ですか?
RFC 2396によると私の答え:はい、RFC 1738によると:いいえ
後で、リクエスト間のリストの受け渡しに関する関連記事を見つけました。csvアプローチが悪いとして準備されていたところ。代わりにこれが表示されました(これを見たことがない)。
page.html?q=1;q=2;q=3
2つ目の質問ですが、これは有効なURLですか?
RFC 2396による私の回答:いいえ、RFC 1738による:いいえ(;予約済み)
数値であればcsvを渡すことには何の問題もありませんが、はい、何かがカンマが突然必要になった場合、値をエンコードおよびデコードしなければならないというリスクに遭遇します。とにかく、私はASP.NETでセミコロンクエリ文字列を試しましたが、結果は期待したものではありませんでした。
Default.aspx?a=1;a=2&b=1&a=3
Request.QueryString["a"] = "1;a=2,3"
Request.QueryString["b"] = "1"
これがcsvアプローチと大きく異なる点を確認できません。「a」を要求すると、コンマを含む文字列が返されます。ASP.NETは確かにリファレンス実装ではありませんが、まだ失望していません。
しかし、最も重要なのは-私の3番目の質問-これの仕様はどこにあるのですか?そして、あなたは何をしますか?