#java #curl #httpurlconnection
#Ява #локон #httpurlconnection
Вопрос:
Я использую Java 11. У меня есть следующая команда curl, когда я выполняю ее в командной строке:
curl --location --request GET 'http://xxx.xxx.co.za:8080/document/details/Select docId From 'Workflow Club/Customer Invoices' where recursive = true and invoice_number ='1221669023'' --header 'Authorization: Basic xxx'
Возвращает следующее:
{errorMessage: 'PaperTrail API only available in enterprise edition'}
Однако, когда я пытаюсь выполнить тот же URL-адрес в приложении Java с помощью HttpURLConnection
, он возвращает пустой ответ.
private static final String USER_AGENT = "Mozilla/5.0"; private static final String GET_URL = "http://xxx.xxx.co.za:8080/document/details/"; private static final String GET_URL_QRY = "Select docId From 'Workflow Club/Customer Invoices' where recursive = true and invoice_number =':1'"; private static final String GET_AUTH_ENC = "Basic xxx"; @Override public String getDocId(Long invoiceNumber) { String get_url_qry = StringUtils.replace(GET_URL_QRY, ":1", Long.toString(invoiceNumber)); get_url_qry = URLEncoder.encode(get_url_qry, StandardCharsets.UTF_8); final String get_url = GET_URL get_url_qry; try { URL url = new URL(get_url); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestProperty("Authorization", GET_AUTH_ENC); con.setRequestMethod("GET"); con.setRequestProperty("User-Agent", USER_AGENT); int responseCode = con.getResponseCode(); logger.info(get_url " -gt; GET Response Code :: " responseCode); if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { // success BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); String resp = response.toString(); logger.info(responseCode " Response: '" resp "'."); } else { logger.error("GET request did not work (responseCode: " responseCode ")."); } } catch (MalformedURLException e) { logger.error("MalformedURLException creating URL '" get_url "'. " e.getMessage()); } catch (IOException e) { logger.error("IOException creating connection from URL '" get_url "'. " e.getMessage()); } return null; }
Выводит следующее с пустым ответом:
204 Response: ''.
Вопрос
Как заставить приложение Java также возвращать то же самое, что и вызов командной строки?
Обновить
У меня есть другой URL-адрес для публикации, который мне тоже нужно вызвать, и я могу успешно его вызвать. Так что с моим звонком что-то не так.
private static final String USER_AGENT = "Mozilla/5.0";
E.g. GET call that returns a 204, with no content.
private String getDocId(Long invoiceNumber) { String get_url_qry = StringUtils.replace(GET_URL_QRY, ":1", Long.toString(invoiceNumber)); get_url_qry = URLEncoder.encode(get_url_qry, StandardCharsets.UTF_8); final String get_url = GET_URL get_url_qry; try { URL url = new URL(get_url); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestProperty("Authorization", GET_AUTH_ENC); con.setRequestMethod("GET"); con.setRequestProperty("User-Agent", USER_AGENT); con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); Maplt;String,Stringgt; data = handleResponse(con); return data.get("docId"); } catch (MalformedURLException e) { logger.error("MalformedURLException creating URL '" get_url "'. " e.getMessage()); } catch (IOException e) { logger.error("IOException creating connection from URL '" get_url "'. " e.getMessage()); } return null; }
Вызов POST, который возвращает 200, и ожидаемое содержимое.
private String getDocLink(String docId) { if (StringUtils.isNotBlank(docId)) { try { URL url = new URL(POST_URL); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestProperty("Authorization", GET_AUTH_ENC); con.setRequestMethod("POST"); con.setRequestProperty("User-Agent", USER_AGENT); con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); byte[] postDataBytes = getPostData(docId); con.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); con.setDoOutput(true); con.getOutputStream().write(postDataBytes); Maplt;String,Stringgt; data = handleResponse(con); return data.get("url"); } catch (IOException e) { logger.error("IOException creating connection from URL '" POST_URL "'. " e.getMessage()); } } else { logger.error("No docId provided when trying to get a document link."); } return null; }
Поэтому, видя, что вызов POST работает, я думаю, что, должно быть, я делаю что-то не так с вызовом GET.
Ответ №1:
Вы пробовали установить тот же пользовательский агент в своем коде Java, который будет использовать cURL? что-то вроде curl/7.37.0
? Насколько я могу судить, это должно быть все, что отличается. Отложите завиток в сторону после перенаправления. Но поскольку перенаправления нет, я предполагаю, что это может быть Агент пользователя, который что-то меняет.
Существует множество серверных приложений, которые ведут себя по-другому, когда они вызываются браузером (например, вы заставляете его думать, устанавливая значение User-Agent Mozilla/5.0
), а не каким-либо другим приложением, таким как cURL.
Комментарии:
1. спасибо за ваш ответ. Я добавил ОБНОВЛЕНИЕ к своему первоначальному сообщению выше. Я могу позвонить на работу по почте, но не по телефону «ПОЛУЧИТЬ».
2. Вы действительно пытались установить пользовательский агент curl/7.37.0? Я не смог прочитать это из вашего комментария или обновленного вопроса.
3. Спасибо, что сработало ` USER_AGENT = «curl/7.37.0»;`
Ответ №2:
Из того, что вы описали, следует, что исходный вызов приводит к ошибке.
Предполагая, что вы также получаете какую-либо форму ошибки в коде java вашего GET, вы поймаете исключение и просто зарегистрируете его. Затем вы вернетесь null
вместо строки, которая приведет к тому, что ваш ответ не будет содержать содержимого, т. е. 204.