使用有效签名URL实例化URL对象时触发MalformedURLException异常
签名URL实例化URL对象触发MalformedURLException异常的解决
尝试通过签名URL访问并下载Google Cloud Storage(GCS)上托管的图片时,遇到如下问题:直接将签名URL字符串变量传入URL构造方法会触发MalformedURLException,但把该变量打印输出的字符串硬编码到代码中却能正常运行,且该URL在浏览器中可正常访问。
无法运行的代码
URL url = new URL(signedUrl);
可正常运行的代码
System.out.println(signedUrl); URL url = new URL("https://storage.googleapis.com/rydr/insurance_documents/test123.png?X...");
抛出的异常信息
java.lang.RuntimeException: java.net.MalformedURLException: no protocol: "https://storage.googleapis.com/rydr/insurance_documents/test123.png?X..."
此前尝试过Stack Overflow上类似问题的解决方案(调用trim()方法),但未解决问题;使用DownloadManager时也触发了类似异常:
java.lang.IllegalArgumentException: Can only download HTTP/HTTPS URIs: "https://storage.googleapis.com/rydr/insurance_documents/test123.png?X..."
问题原因与解决方案
从异常信息可以直接看出,你的signedUrl字符串被额外的双引号包裹(格式为"https://..."),这就是URL构造方法无法识别HTTPS协议的根本原因——trim()方法只能去除空白字符,无法处理这种首尾的引号。
解决方法是精准移除字符串首尾的双引号,代码示例如下:
// 移除首尾的双引号 String cleanedUrl = signedUrl.replaceAll("^\"|\"$", ""); URL url = new URL(cleanedUrl);
内容的提问来源于stack exchange,提问作者Leif Giering
相关产品推荐
相关产品推荐

