6

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

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/long?query=http://local:282/rand&action=aaaa

しかし、私が得たものは次のとおりです。

 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);

それはうまくいきます。

4

2 に答える 2

4

自分で返答したいのですが。Javadocは本当に正しく説明しています。URI#resolve()が言うように、セクション3.bで:

それ以外の場合、指定されたURIのパスは相対的であるため、新しいURIのパスは、指定されたURIのパスをこのURIのパスに対して解決することによって計算されます。これは、このURIのパスの最後のセグメント(存在する場合)を除くすべてを指定されたURIのパスと連結し、normalizeメソッドを呼び出すかのように結果を正規化することによって行われます。

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

于 2012-05-02T10:02:53.557 に答える
1

最初のケース:

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

query評価されます

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

method のドキュメントによると public URI resolve(URI uri)、クエリ URI をベース URI に対して解決します。メソッドがクエリ URI でパスを見つけた場合は解決中に、新しい解決済み URI に同じパスを割り当てます。この場合、 に関連付けられたパスはありませんqueryresolve()以下の関数のスニペットを見ると、より明確になります。

//スニペット

 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());
        }

cp は子です(あなたの場合はクエリパス)。ここでは null であるため、フローは else ループに入り、解決されたクエリにベース URI からのパスが割り当てられます。

/something/more/最後の「/」文字の後のすべてを削除するため、新しい URI にはこのパスがあります。

2 番目のケース:

base = http://example.com/something/more/long であり、次のようにquery評価されます

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

ここで、クエリ パスを新しい URI のパスに割り当てる if ループに進みます。クエリ URI のパスは/something/more/longここにあります。つまり、"long" 値も含まれています。これがURIの解決方法である可能性があります。ドキュメントに目を通すと、より明確なアイデアが得られます。

于 2012-04-26T09:40:08.077 に答える