小编Mar*_*ain的帖子

当相对URI包含空路径时,Java的URI.resolve是否与RFC 3986不兼容?

我相信Java的URI.resolve方法的定义和实现与RFC 3986第5.2.2节不兼容.我知道Java API定义了该方法的工作方式,如果它现在被更改,它会破坏现有的应用程序,但我的问题是:任何人都可以确认我的理解这个方法与RFC 3986不兼容吗?

我正在使用这个问题中的示例:java.net.URI仅针对查询字符串进行解析,我将在此处复制:


我正在尝试使用JDK java.net.URI构建URI.我想附加一个绝对URI对象,一个查询(在String中).例如:

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);
Run Code Online (Sandbox Code Playgroud)

理论(或我认为)是决心应该回归:

http://example.com/something/more/long?query=http://local:282/rand&action=aaaa
Run Code Online (Sandbox Code Playgroud)

但我得到的是:

http://example.com/something/more/?query=http://local:282/rand&action=aaaa
Run Code Online (Sandbox Code Playgroud)

我对RFC 3986第5.2.2节的理解是,如果相对URI的路径为空,那么将使用基URI的整个路径:

        if (R.path == "") then
           T.path = Base.path;
           if defined(R.query) then
              T.query = R.query;
           else
              T.query = Base.query;
           endif;
Run Code Online (Sandbox Code Playgroud)

并且仅当指定了路径时才是要与基本路径合并的相对路径:

        else
           if (R.path starts-with "/") then
              T.path = remove_dot_segments(R.path);
           else
              T.path = merge(Base.path, R.path);
              T.path = remove_dot_segments(T.path);
           endif; …
Run Code Online (Sandbox Code Playgroud)

java uri rfc3986 relative-url query-string

13
推荐指数
1
解决办法
1524
查看次数

标签 统计

java ×1

query-string ×1

relative-url ×1

rfc3986 ×1

uri ×1