web-dev-qa-db-ja.com

URIパラメータ値をエンコードするにはどうすればよいですか?

クエリ/マトリックスパラメータの値としてURIを送信したい。既存のURIに追加する前に、RFC 2396に従ってエンコードする必要があります。たとえば、入力が与えられた場合:

http://google.com/resource?key=value1 & value2

私は出力を期待しています:

http%3a%2f%2fgoogle.com%2fresource%3fkey%3dvalue1%2520%26%2520value2

_Java.net.URLEncoder nor Java.net.URIは正しい出力を生成します。 URLEncoderは、RFC 2396と同じではないHTMLフォームエンコーディングを対象としています。URIには、一度に1つの値をエンコードするメカニズムがないため、value1とvalue2が同じキーの一部。

56
Gili

Jerseyの riBuilder は、必要に応じてapplication/x-www-form-urlencodedおよびRFC 3986を使用してURIコンポーネントをエンコードします。 Javadocによると

Builderメソッドは、クエリパラメータのapplication/x-www-form-urlencodedメディアタイプの規則および他のすべてのコンポーネントのRFC 3986に従って、対応するURIコンポーネントで許可されていない文字のコンテキストエンコーディングを実行します。特定のコンポーネントで許可されていない文字のみがエンコードの対象となることに注意してください。たとえば、パスメソッドの1つに提供されるパスには、マトリックスパラメーターまたは複数のパスセグメントが含まれる場合があります。区切り文字は有効な文字であり、エンコードされないためです。エンコードされた値のパーセントも許可されている場合は認識され、二重エンコードされません。

30

また、Springの riUtils を使用することもできます

19
Adam Gent

答えにコメントするほどの評判はありませんが、JSR-311 apiをダウンロードするだけでは機能しないことに注意したいだけです。リファレンス実装をダウンロードする必要があります( jersey )。

JSRページからAPIをダウンロードするだけで、実行時にAPIが実装を検索しようとしたときにClassNotFoundExceptionが発生します。

9
yincrash

私は自分で書いた、それは短く、非常に簡単で、あなたが好きならそれをコピーすることができます: http://www.dmurph.com/2011/01/Java-uri-encoder/

4
Daniel Murphy

Google GData-Java-clientの CharEscapers には、必要なものがあるようです。 uriPathEscaperメソッド、uriQueryStringEscaper、および汎用uriEscaperがあります。 (すべてが実際のエスケープを行うEscaperオブジェクトを返します)。 Apacheライセンス。

2