2011-09-09 1 views
8

私は、クエリ文字列を操作するためにjava.net.URIを使用しようとしましたが、あるURLからクエリ文字列を取得して別のURLに配置するような非常に単純なタスクでも失敗しました。java.net.URIの使い方

あなたが仕事

の下にこのコードを作成する方法
URI sample = new URI("test?param1=x%3D1"); 
URI uri2 = new URI(
      "http", 
      "domain", 
      "/a-path", 
      sample.getRawQuery(), 
      sample.getFragment()); 
を知っています uri2.toASCIIString()へのコールが返す必要があり

http://domain/a-path?param1=x%3D1 それが返されます:http://domain/a-path?param1=x%253D1(ダブルエンコーディング)

私はgetQueryを(使用する場合)の代わりに、 getRawQuery()クエリ文字列はまったくエンコードされず、URLは次のようになります。http://domain/a-path?param1=x=1

答えて

1

問題は、2番目のコンストラクタがqu URLエンコーディングを使用して断片化します。しかし、=は法的なURI文字なので、それをエンコードしません。 %は法的なURI文字ではないため、となります。これはまさにあなたが望むものとは正反対です。

したがって、2番目のコンストラクタは使用できません。文字列の各部分を連結して、最初のものを使用してください。

+0

したがって、URIインターフェイスは設計が貧弱です(2番目のコンストラクタの理由はほとんど分かりません)。より良いURIクラスを知っていますか?日付/カレンダークラスを置き換えるjoda-timeのように? –

+0

いいえ、私は...そして、 'URI'はすでに独自の問題を抱えている古い' java.net.URL'クラスの再作成です。 – Jesper

0

java.net.URLEncoder.encode(String)を呼び出してgetQuery()に電話をかけることができますか?

URI sample = new URI("test?param1=x%3D1"); 
URI uri2 = new URI(
     "http", 
     "domain", 
     "/a-path", 
     URLEncoder.encode(sample.getQuery(), "UTF-8"), 
     sample.getFragment()); 
+0

これを確認しましたか? 'URLEncoder.encode(sample.getQuery())'は 'sample.getRawQuery()'とほぼ同じですので、同じ問題が発生します –