2012-04-26 10 views
3

私は、JDK java.net.URIを使用してURIを構築しようとしています。
絶対URIオブジェクトにクエリ(String内)を追加したい。例では:java.net.URIクエリ文字列のみに対して解決する

http://example.com/something/more/long?query=http://local:282/rand&action=aaaa 

しかし、私が得たことは次のとおりです:

URI base = new URI("http://example.com/something/more/long"); 
String queryString = "query=http://local:282/rand&action=aaaa"; 
URI query = new URI(null, null, null, queryString, null); 
URI result = base.resolve(query); 

理論(または何私が思うには)決意を返すべきであるということです

http://example.com/something/more/?query=http://local:282/rand&action=aaaa 

なぜ#resolve() "食べる" 最後パス?新しいURI(query)が次のように構築されている場合:

URI query = new URI(null, null, base.getPath(), queryString, null); 

これはうまくいきます。

+0

これをチェックする - http://stackoverflow.com/questions/2793150/how-to-use-java-net-urlconnection-to-fire-and-handle-http-requests –

答えて

3

私は自分自身に返答したいと思います。 Javadocは本当に正しく説明しています。 URI#resolve()は:

セクション3.Bに、言うようにそれ以外の場合は指定されたURIのパスは相対的で、かつので、新しいURIのパス が このURIのパスに対して指定されたURIのパスを解決することにより計算されます。これは、 の最後のセグメントを除くすべてのセグメントをこのURIのパスがあればそれを指定されたURIのパスに連結し、次に 正規化メソッドを呼び出すことによって結果を正規化することによって行われます。

だから私は正しく読まなかった。この回答を削除する必要がありますか?それとも、それは自分で応答させますか?

1

最初のケース:

base = http://example.com/something/more/long 

query方法public URI resolve(URI uri)の文書によると、それがベースURIに対してクエリのURIを解決する

query = ?query=http://local:282/rand&action=aaaa. 

であることを評価します。メソッドがクエリURI内のパスを検出した場合、新しい解決済みURIに同じパスが割り当てられます。この場合、queryに関連付けられたパスはありません。 resolve()機能の下のスニペットが表示される場合は、より明確になります。

//は、CPは(あなたのケースのクエリパスで)子です

String cp = (child.path == null) ? "" : child.path; 
     if ((cp.length() > 0) && (cp.charAt(0) == '/')) { 
     // 5.2 (5): Child path is absolute 
     ru.path = child.path; 
     } else { 
     // 5.2 (6): Resolve relative path 
     ru.path = resolvePath(base.path, cp, base.isAbsolute()); 
     } 

スニペット。そのヌルとして、フローは、解決されたクエリがベースURIから割り当てられたパスであるelseループに入ります。

新しいURIには、最後の "/"文字の後のすべてを削除するので、このパスは/something/more/です。

第二ケース:

ベース= http://example.com/something/more/longquery

query = /something/more/long?query=http://local:282/rand&action=aaaa 

であることを評価ここでは、新しいURIのパスにクエリパスを割り当てる場合ループに入ります。クエリURIのパスは/something/more/longです。つまり、「長い」値も含まれています。これがURIの解決方法です。あなたはそれをより明確に知ることができるドキュメントを見てください。

+0

"if"がループではない。 – immibis

関連する問題