Java.net.MalformedURLException: нет протокола по URL-адресу на основе строки, измененной с помощью URLEncoder

Итак, я пытался использовать эту строку в URL-адресе: -

http://site-test.collercapital.com/Meetings/IC/DownloadDocument?meetingId=c21c905c-8359-4bd6-b864-844709e05754&itemId=a4b724d1-282e-4b36-9d16-d619a807ba67&file=\\s604132shvw140\Test-Documents\c21c905c-8359-4bd6-b864-844709e05754_attachments\7e89c3cb-ce53-4a04-a9ee-1a584e157987\myDoc.pdf

В этом коде: -

String fileToDownloadLocation = //The above string
URL fileToDownload = new URL(fileToDownloadLocation);
HttpGet httpget = new HttpGet(fileToDownload.toURI());

Но в этот момент я получаю ошибку: -

java.net.URISyntaxException: Illegal character in query at index 169:Blahblahblah

Я понял с небольшим количеством googling, это было из-за символов в URL-адресе (угадывание &), поэтому я добавил в некоторый код, чтобы он теперь выглядел так: -

String fileToDownloadLocation = //The above string
fileToDownloadLocation = URLEncoder.encode(fileToDownloadLocation, "UTF-8");
URL fileToDownload = new URL(fileToDownloadLocation);
HttpGet httpget = new HttpGet(fileToDownload.toURI());

Однако, когда я пытаюсь запустить это, я получаю сообщение об ошибке при попытке создания URL-адреса, ошибка затем читает: -

java.net.MalformedURLException: no protocol: http%3A%2F%2Fsite-test.collercapital.com%2FMeetings%2FIC%2FDownloadDocument%3FmeetingId%3Dc21c905c-8359-4bd6-b864-844709e05754%26itemId%3Da4b724d1-282e-4b36-9d16-d619a807ba67%26file%3D%5C%5Cs604132shvw140%5CTest-Documents%5Cc21c905c-8359-4bd6-b864-844709e05754_attachments%5C7e89c3cb-ce53-4a04-a9ee-1a584e157987%myDoc.pdf

Похоже, что я не могу сделать кодировку до тех пор, пока не создаю URL-адрес, иначе он заменит косые черты и вещи, которые он не должен, но я не вижу, как я могу создать URL-адрес со строкой, а затем отформатируйте его так, чтобы он был подходящим для использования. Я не очень хорошо знаком со всем этим и надеялся, что кто-то сможет указать мне, чего мне не хватает, чтобы получить строку A в подходящем отформатированном URL-адресе, чтобы затем использовать с замененными правильными символами?

Любые предложения, которые были высоко оценены!

Ответы

Ответ 1

Вам необходимо закодировать значения параметров перед их конкатенацией по URL.
Обратная косая черта \ - это специальный символ, который должен быть экранирован как %5C

Пример экранирования:

String paramValue = "param\\with\\backslash";
String yourURLStr = "http://host.com?param=" + java.net.URLEncoder.encode(paramValue, "UTF-8");
java.net.URL url = new java.net.URL(yourURLStr);

Результатом является http://host.com?param=param%5Cwith%5Cbackslash, который является правильно отформатированной строкой url.

Ответ 2

У меня такая же проблема, я читаю url с файлом свойств:

String configFile = System.getenv("system.Environment");
        if (configFile == null || "".equalsIgnoreCase(configFile.trim())) {
            configFile = "dev.properties";
        }
        // Load properties 
        Properties properties = new Properties();
        properties.load(getClass().getResourceAsStream("/" + configFile));
       //read url from file
        apiUrl = properties.getProperty("url").trim();
            URL url = new URL(apiUrl);
            //throw exception here
    URLConnection conn = url.openConnection();

dev.properties

url = "https://myDevServer.com/dev/api/gate"

он должен быть

dev.properties

url = https://myDevServer.com/dev/api/gate

без "", и моя проблема решена.

Согласно документации oracle

  • Подчеркнуто, что произошел неправильный URL. Любой законный протокол не может быть найден в строке спецификации или в строке не может быть проанализирован.

Значит, это не анализируется внутри строки.

Ответ 3

Вы хотите использовать шаблоны URI. Посмотрите внимательно на README этого проекта: URLEncoder.encode() НЕ работает для URI.

Возьмем ваш оригинальный URL:

HTTP://site-test.collercapital.com/Meetings/IC/DownloadDocument meetingId = c21c905c-8359-4bd6-b864-844709e05754 & Itemid = a4b724d1-282e-4b36-9d16-d619a807ba67 & файл =\s604132shvw140\Тест-документы\c21c905c-8359-4bd6-b864-844709e05754_attachments\7e89c3cb-ce53-4a04-a9ee-1a584e157987\mydoc.pdf

и преобразовать его в шаблон URI с двумя переменными (для ясности на нескольких строках):

http://site-test.collercapital.com/Meetings/IC/DownloadDocument
    ?meetingId={meetingID}&itemId={itemID}&file={file}

Теперь построим переменную карту с этими тремя переменными, используя библиотеку, указанную в ссылке:

final VariableMap = VariableMap.newBuilder()
    .addScalarValue("meetingID", "c21c905c-8359-4bd6-b864-844709e05754")
    .addScalarValue("itemID", "a4b724d1-282e-4b36-9d16-d619a807ba67e")
    .addScalarValue("file", "\\\\s604132shvw140\\Test-Documents"
        + "\\c21c905c-8359-4bd6-b864-844709e05754_attachments"
        + "\\7e89c3cb-ce53-4a04-a9ee-1a584e157987\\myDoc.pdf")
    .build();

final URITemplate template
    = new URITemplate("http://site-test.collercapital.com/Meetings/IC/DownloadDocument"
        + "meetingId={meetingID}&itemId={itemID}&file={file}");

// Generate URL as a String
final String theURL = template.expand(vars);

Это ГАРАНТИРОВАНО, чтобы вернуть полностью функциональный URL-адрес!