Java, выполняющая команду curl с использованием HttpURLConnection, возвращает 204 (HTTP_NO_CONTENT)

#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.