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

Я поняла, что, немного погуглив, это произошло из-за символов в 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-адрес со строкой, а затем отформатировать его так его подходит для использования. Я не особенно знаком со всем этим и надеялся, что кто-то сможет указать мне, что мне не хватает, чтобы получить строку А в подходящем отформатированном URL, чтобы затем использовать с замененными правильными символами?

Любые предложения с благодарностью!

7 ответов

Решение

Вам нужно закодировать значения вашего параметра, прежде чем объединять их с 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.

У меня та же проблема, я прочитал 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

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

Согласно оракульной документации

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

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

Вы хотите использовать шаблоны 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&file=\s604132shvw140\Test-Documents\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!

Благодаря ответу Эрхуна я наконец-то понял, что мой JSON mapper возвращает кавычки и вокруг моих данных! Мне нужно было использовать "asText ()" вместо "toString ()"

Это не редкая проблема - мозг не видит ничего плохого в правильных данных, заключенных в кавычки!

discoveryJson.path("some_endpoint").toString();
"https://what.the.com/heck"

discoveryJson.path("some_endpoint").asText();
https://what.the.com/heck

Этот код работал у меня

public static void main(String[] args) {
    try {
        java.net.URL myUr = new java.net.URL("http://path");
        System.out.println("Instantiated new URL: " + connection_url);
    }
    catch (MalformedURLException e) {
        e.printStackTrace();
    }
}

Создан новый URL: http://path/

Очень простое исправление

String encodedURL = UriUtils.encodePath (request.getUrl (), «UTF-8»);

Работает без дополнительных функций.

Я добавлял значение в двойных кавычках ("), когда я изменил пары ключ-значение из своего.propertiesфайл, проблема решена. Пара ключ-значение не должна заключаться в двойные кавычки.

Другие вопросы по тегам