如何只更改java.net.URL对象的协议部分?

tnkciper  于 2023-01-15  发布在  Java
关注(0)|答案(4)|浏览(106)

我有一个java.net.URL对象,它使用HTTPS协议,例如:

https://www.bla.com

我只需要修改这个URL对象的协议部分,这样当我调用它的toString()方法时,就会得到这样的结果:

http://www.bla.com

什么是最好的方法呢?

hc8w905p

hc8w905p1#

你可以使用你可以使用的方法:

URL oldUrl = new URL("https://www.bla.com");
URL newUrl = new URL("http", oldUrl.getHost(), oldUrl.getPort(), oldUrl.getFile(), oldUrl.getRef());

还有一个扩展性更强的set()方法,它包含8个元素,对于更复杂的URL,您可能需要它。
编辑:就像刚才我说的,我没有注意,set()是受保护的。所以URL在技术上是可变的,但是对于我们人类来说,它是不可变的。所以你只需要构造一个新的URL对象。

okxuctiv

okxuctiv2#

也可以使用字符串替换:

URL oldUrl = new URL("https://www.bla.com");
String newUrlString = oldUrl.toString().replaceFirst("^https", "http");
URL newUrl = new URL(newUrlString);
drnojrws

drnojrws3#

也可以使用org.springframework.web.util.UriComponentsBuilder/org.springframework.web.util.UriComponents
参见:Does there exist a mutable URL/URI object in Java?

7cjasjjr

7cjasjjr4#

看起来他们忘了让他们的类有用。从URL.toExternalForm()窃取代码有助于:

public class ICantBelieveThisIsNotInTheStandardLibrary {
    public static final URL makeCopyWithDifferentProtocol(URL u, String protocol) {
        StringBuffer result = new StringBuffer();
        result.append(protocol);
        result.append(":");
        if (u.getAuthority() != null && u.getAuthority().length() > 0) {
            result.append("//");
            result.append(u.getAuthority());
        }
        if (u.getPath() != null) {
            result.append(u.getPath());
        }
        if (u.getQuery() != null) {
            result.append('?');
            result.append(u.getQuery());
        }
        if (u.getRef() != null) {
            result.append("#");
            result.append(u.getRef());
        }
        return new URL(result.toString());
    }
}

建议使用字符串替换的答案更短,但是如果你想改变任何其他URL组件,你将需要这样的东西。

相关问题