26

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

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

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

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

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


アップデート:

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    = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=
4

2 に答える 2

11

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

ただし、UriBuilder が encoding ではない理由は理解できます:。絶対 URI で、プロトコルの後 (例: http:) またはユーザー名とパスワードの間(例: )にコロンをエンコードする必要はありません。ftp://username:password@domain.com

于 2012-12-04T23:19:47.003 に答える
5

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

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

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

于 2014-08-26T08:24:40.937 に答える