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 = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=
はい、クエリ文字列でエンコードする必要があります。正しいエンコーディングは%3A
です。
ただし、UriBuilderが:
をエンコードしない理由は理解できます。プロトコルの後(例:http:
)またはユーザー名とパスワードの間(例:ftp://username:[email protected]
)のコロンを絶対URIでエンコードしないでください。
Java SDKには、UriBuilder
はありません。JAX-RSによって定義されています。 documentation は、クエリパラメータをURLエンコードする必要があることを示していますが、他のコンポーネントはRFC3986を使用してエンコードされます。
Builderメソッドは、クエリパラメーターの
application/x-www-form-urlencoded
メディアタイプおよび他のすべてのコンポーネントのRFC 3986の規則に従って、対応するURIコンポーネントで許可されていない文字のコンテキストエンコーディングを実行します。
ただし、JAX-RSのJersey実装はこの仕様では機能せず、RFC 3986に従ってすべてをエンコードします。これはバグです。 JIRAチケット を参照してください。