Я пытаюсь получить доступ к изображению, размещенному в Google Cloud Storage, и загрузить его с подписанным URL-адресом, но оно выдает исключение MalformedURLException, если я передаю подписанную строку URL-адреса в качестве параметра. Я знаю, что это действительный URL-адрес, поскольку вставка его в мой браузер работает.
Это не работает:
URL url = new URL(signedUrl);
Однако вставка вывода System.out.println(signedUrl) в объект URL работает.
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..."
Несколько лет назад у пользователя StackOverflow возникла аналогичная проблема здесь, но предложения по использованию .trim() не помогли мне решить проблему.
Я также пробовал использовать DownloadManager, но он выдает аналогичное исключение:
java.lang.IllegalArgumentException: Can only download HTTP/HTTPS URIs: "https://storage.googleapis.com/rydr/insurance_documents/test123.png?X..."
«Я знаю, что это действительный URL-адрес, поскольку вставка его в мой браузер работает». - Это не окончательный тест. Строка URL-адреса типичного браузера автоматически «исправляет» различные проблемы в URL-адресе, чтобы сделать его действительным. Класс URL не такой снисходительный. Если URL говорит, что это недействительно, то это >не< недействительно.




Просмотрев PHP-скрипт, который генерирует подписанный URL-адрес в браузере, я обнаружил, что он выводит URL-адрес в двойных кавычках.
Удаление двойных кавычек в Java вручную устранило проблему:
URL url = new URL(signedUrl.replace("\"", ""));
Еще лучше исправить PHP, источник проблемы. В противном случае вы просто пишете программу с тысячей костылей.
Очевидно, что в
https:есть невидимый символ. Проверять.