Почему выполнение cURL из Java приводит к ошибке, а в терминале – нет? [закрыто]

Вопрос или проблема

Во-первых, извините, если это дубликат. Я заметил эту ошибку только в контексте более сложного использования.

Я пытаюсь загрузить набор запросов через cURL с помощью Java. Команда терминала:

curl -o путь/к/файлу "https://issues.apache.org/jira/sr/jira.issueviews:searchrequest-csv-all-fields/temp/SearchRequest.csv?jqlQuery=project+%3D+MNG+AND+issuetype+%3D+Bug&tempMax=1000&pager/start=0"

Она работает, когда выполняется в командной строке Mac, однако, когда я запускаю её с помощью класса Process в Java, я получаю следующую ошибку:

curl: (3) URL rejected: Port number was not a decimal number between 0 and 65535

Кто-нибудь знает, в чем проблема?

Ответ или решение

Ваша проблема с тем, что команда cURL работает в терминале, но вызывает ошибку, когда вы пытаетесь выполнить её через класс Process в Java, может быть связана с тем, как строка команды формируется и обрабатывается в Java.

Ошибка curl: (3) URL rejected: Port number was not a decimal number between 0 and 65535 обычно возникает, когда cURL не может корректно распознать URL, который вы передали. В вашем случае, это может быть связано с тем, что вы не экранируете специальные символы должным образом при передаче их из Java.

Вот несколько рекомендаций, которые могут помочь вам решить эту проблему:

  1. Экранирование символов: Убедитесь, что символы, используемые в URL (такие как ?, &, =, и +), правильно экранированы или заключены в кавычки. При передаче обучающему процессу командной строки через Java, вы должны быть особенно внимательны к тому, чтобы избежать путаницы с параметрами командной строки.

  2. Используйте массив строк для аргументов: Вместо того, чтобы передавать всю команду в одну строку, используйте массив строк, чтобы разделить команду и её аргументы. Примерный код может выглядеть так:

    String[] command = {
        "curl",
        "-o", "path/to/file",
        "https://issues.apache.org/jira/sr/jira.issueviews:searchrequest-csv-all-fields/temp/SearchRequest.csv?jqlQuery=project+%3D+MNG+AND+issuetype+%3D+Bug&tempMax=1000&pager/start=0"
    };
    
    ProcessBuilder processBuilder = new ProcessBuilder(command);
    Process process = processBuilder.start();
  3. Проверка URL: Убедитесь, что URL, который вы используете, правильно сформирован и не содержит недопустимых символов, например, & должен быть именно &, а не &.

  4. Обработка ошибок: Сделайте вывод ошибок из процесса, чтобы лучше понять, что именно вызывает проблемы. Вы можете добавить следующий код для захвата стандартного и ошибочного вывода:

    InputStream errorStream = process.getErrorStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(errorStream));
    String line;
    while ((line = reader.readLine()) != null) {
        System.err.println(line);
    }
  5. Переменные окружения: Убедитесь, что ваше окружение Java имеет доступ к cURL и он правильно настроен.

Следуя этим рекомендациям, вы должны быть в состоянии корректно выполнить команду cURL из Java, устранив возникшую у вас ошибку. Если проблема сохраняется, рассмотрите возможность использования библиотеки Java для HTTP-запросов, такой как Apache HttpClient или java.net.HttpURLConnection, которые могут обеспечить более удобный и надежный способ взаимодействия с HTTP-ресурсами.

Оцените материал
Добавить комментарий

Капча загружается...