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

如何仅更改java.net.URL对象的协议部分?,java,http,Java,Http,我有一个使用HTTPS协议的java.net.URL对象,例如: https://www.bla.com 我只需要更改这个URL对象的协议部分,这样当我调用它的toString()方法时,我就可以得到: http://www.bla.com 最好的方法是什么?您可以使用以下可用的方法: URL oldUrl = new URL("https://www.bla.com"); URL newUrl = new URL("http", oldUrl.getHost(), oldUrl.getPo

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

https://www.bla.com
我只需要更改这个URL对象的协议部分,这样当我调用它的toString()方法时,我就可以得到:

http://www.bla.com

最好的方法是什么?

您可以使用以下可用的方法:

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对象。

您还可以使用字符串替换:

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

或者您可以使用
org.springframework.web.util.UriComponentsBuilder
/
org.springframework.web.util.UriComponents


请参阅:

set()方法受保护。看起来您为构造函数获取了URL.set()方法的参数,但实际不存在具有该原型的构造函数。这是一个错误答案。没有具有该签名的构造函数。URL刚发出臭味此答案不处理未指定端口且getPort()返回-1的情况,因此您必须依赖getDefaultPort()