web-dev-qa-db-ja.com

コロンはURIクエリパラメータでエンコードする必要がありますか?

JavaのUriBuilderが、クエリパラメータ値(ISO 8601形式の文字列)に含まれる:文字をエンコードしていないことに気づきました。

ウィキペディアによると、コロンはエンコードする必要があるようです。

特に、クエリ文字列のエンコードには次のルールが使用されます。

  • 文字(A-Zおよびa-z)、数字(0-9)、および文字 '。'、 '-'、 '〜'、および '_'はそのまま残されます
  • SPACEは、「+」または%20 [要出典]としてエンコードされます。
  • 他のすべての文字は%FF 16進表現としてエンコードされ、非ASCII文字は最初にUTF-8(または他の指定されたエンコード)としてエンコードされます。

それで、取引は何ですか?クエリパラメータのコロンをエンコードする必要がありますか?


更新:

URI構文仕様( RFC 3986 )を調べたところ、クエリパラメータでコロンをエンコードする必要はないようです。これは、URIのABNFからの抜粋です。

URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=
20
HolySamosa

はい、クエリ文字列でエンコードする必要があります。正しいエンコーディングは%3Aです。

ただし、UriBuilderが:をエンコードしない理由は理解できます。プロトコルの後(例:http:)またはユーザー名とパスワードの間(例:ftp://username:[email protected])のコロンを絶対URIでエンコードしないでください。

9
Enrico

Java SDKには、UriBuilderはありません。JAX-RSによって定義されています。 documentation は、クエリパラメータをURLエンコードする必要があることを示していますが、他のコンポーネントはRFC3986を使用してエンコードされます。

Builderメソッドは、クエリパラメーターのapplication/x-www-form-urlencodedメディアタイプおよび他のすべてのコンポーネントのRFC 3986の規則に従って、対応するURIコンポーネントで許可されていない文字のコンテキストエンコーディングを実行します。

ただし、JAX-RSのJersey実装はこの仕様では機能せず、RFC 3986に従ってすべてをエンコードします。これはバグです。 JIRAチケット を参照してください。

4
andras