Вопрос или проблема
Во-первых, извините, если это дубликат. Я заметил эту ошибку только в контексте более сложного использования.
Я пытаюсь загрузить набор запросов через 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.
Вот несколько рекомендаций, которые могут помочь вам решить эту проблему:
-
Экранирование символов: Убедитесь, что символы, используемые в URL (такие как
?
,&
,=
, и+
), правильно экранированы или заключены в кавычки. При передаче обучающему процессу командной строки через Java, вы должны быть особенно внимательны к тому, чтобы избежать путаницы с параметрами командной строки. -
Используйте массив строк для аргументов: Вместо того, чтобы передавать всю команду в одну строку, используйте массив строк, чтобы разделить команду и её аргументы. Примерный код может выглядеть так:
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();
-
Проверка URL: Убедитесь, что URL, который вы используете, правильно сформирован и не содержит недопустимых символов, например,
&
должен быть именно&
, а не&
. -
Обработка ошибок: Сделайте вывод ошибок из процесса, чтобы лучше понять, что именно вызывает проблемы. Вы можете добавить следующий код для захвата стандартного и ошибочного вывода:
InputStream errorStream = process.getErrorStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(errorStream)); String line; while ((line = reader.readLine()) != null) { System.err.println(line); }
-
Переменные окружения: Убедитесь, что ваше окружение Java имеет доступ к cURL и он правильно настроен.
Следуя этим рекомендациям, вы должны быть в состоянии корректно выполнить команду cURL из Java, устранив возникшую у вас ошибку. Если проблема сохраняется, рассмотрите возможность использования библиотеки Java для HTTP-запросов, такой как Apache HttpClient или java.net.HttpURLConnection
, которые могут обеспечить более удобный и надежный способ взаимодействия с HTTP-ресурсами.