Я пытаюсь отправить почтовый запрос на URL-адрес с помощью HttpURLConnection (для использования cUrl в java). Содержимым запроса является xml, и в конечной точке приложение обрабатывает xml и сохраняет запись в базе данных, а затем отправляет ответ в виде строки xml. Приложение размещено на apache-tomcat локально.
Когда я выполняю этот код с терминала, в базу данных добавляется строка, как и ожидалось. Но при получении InputStream из соединения возникает исключение.
java.io.FileNotFoundException: http://localhost:8080/myapp/service/generate
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1401)
at org.kodeplay.helloworld.HttpCurl.main(HttpCurl.java:30)
Вот код
public class HttpCurl {
public static void main(String [] args) {
HttpURLConnection con;
try {
con = (HttpURLConnection) new URL("http://localhost:8080/myapp/service/generate").openConnection();
con.setRequestMethod("POST");
con.setDoOutput(true);
con.setDoInput(true);
File xmlFile = new File("test.xml");
String xml = ReadWriteTextFile.getContents(xmlFile);
con.getOutputStream().write(xml.getBytes("UTF-8"));
InputStream response = con.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(response));
for (String line ; (line = reader.readLine()) != null;) {
System.out.println(line);
}
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Это сбивает с толку, потому что исключение отслеживается до строки, InputStream response = con.getInputStream();
и похоже, что для FileNotFoundException нет какого-либо файла.
Когда я пытаюсь открыть соединение с XML-файлом напрямую, это исключение не возникает.
Приложение-служба использует платформу Spring и Jaxb2Marshaller для создания XML-ответа.
Класс ReadWriteTextFile взят отсюда
Спасибо.
Изменить: он сохраняет данные в БД и одновременно отправляет обратно код состояния ответа 404.
Я также попытался сделать завиток с помощью php и распечатать, CURLINFO_HTTP_CODE
который оказался 200.
Любые идеи о том, как мне отладить это? И служба, и клиент находятся на локальном сервере.
Постановили: я мог бы решить проблему, обратившись к ответу о самой SO.
Кажется, что HttpURLConnection всегда возвращает ответ 404 при подключении к URL-адресу с нестандартным портом.
Добавление этих строк решило это
con.setRequestProperty("User-Agent","Mozilla/5.0 ( compatible ) ");
con.setRequestProperty("Accept","*/*");
Ответы:
Я не знаю о вашей комбинации Spring / JAXB, но средний веб-сервис REST не будет возвращать тело ответа при POST / PUT, а только статус ответа . Вы бы хотели определить его вместо тела.
Заменить
по
Все доступные коды состояния и их значения доступны в спецификации HTTP, как указано ранее. Сам веб-сервис также должен сопровождаться некоторой документацией, в которой рассматриваются все коды состояния, поддерживаемые веб-сервисом, и их особое значение, если таковое имеется.
Если статус начинается с
4nn
или5nn
, вы хотели бы использоватьgetErrorStream()
вместо него чтение тела ответа, которое может содержать сведения об ошибке.источник
getErrorStream()
как предлагалось. Это вызывает исключение NullPointerExceptionnew InputStreamReader(con.getErrorStream())
.URLConnection
проблематичным. Интересно, почему разработчики Java просто не реализовали егоgetInputStream()
вHttpUrlConnection
духеreturn responseCode == 200 ? super.getInputStream() : this.getErrorStream()
. Но в любом случае; информативный ответ, +1.FileNotFound
это просто досадное исключение, используемое, чтобы указать, что веб-сервер вернул 404.источник
getResponseCode()
прежде чем звонитьgetInputStream()
.Для тех, кто столкнется с этой проблемой в будущем, причина в том, что код состояния был 404 (или в моем случае был 500). Похоже, что
InpuStream
функция выдаст ошибку, если код состояния не равен 200.В моем случае я управляю своим собственным сервером и возвращал код состояния 500, чтобы указать, что произошла ошибка. Несмотря на то, что я также отправлял тело со строковым сообщением с подробным описанием ошибки, сообщение об ошибке
inputstream
выдавалось независимо от того, было ли тело полностью читаемым.Если вы управляете своим сервером, я полагаю, что с этим можно справиться, отправив себе код состояния 200, а затем обработав любой ответ с ошибкой строки.
источник
Для всех, кто сталкивался с этим, то же самое случилось со мной, когда я пытался отправить заголовок запроса SOAP в службу SOAP. Проблема заключалась в неправильном порядке в коде, я сначала запросил входной поток перед отправкой тела XML. В приведенном ниже фрагменте кода строка идет
InputStream in = conn.getInputStream();
сразу после,ByteArrayOutputStream out = new ByteArrayOutputStream();
что является неправильным порядком вещей.FileNotFound
в данном случае это был неудачный способ кодирования кода ответа HTTP 400.источник
new ByteArrayOutputStream()
не имеет к этому никакого отношения. Проблема заключается в порядке междуgetInputStream()
иgetResponseCode()
.FileNotFound в данном случае означает, что вы получили 404-е от вашего сервера - может быть, серверу не нравятся запросы POST?
источник
Решение:
просто измените localhost на IP-адрес вашего ПК,
если вы хотите это знать: Windows + r> cmd> ipconfig,
пример: http: // 192.168.0.107 /directory/service/program.php?action=sendSomething
просто замените 192.168 .0.107 для вашего собственного IP (не пытайтесь 127.0.0.1, потому что он такой же, как localhost )
источник
Пожалуйста измените
Чтобы
источник