2009-06-02 3 views
23

Я пытался использовать Apache Ant Get task, чтобы получить список WSDL, сгенерированных другой командой в нашей компании. Они размещены на веб-сервере 9.x на http://....com:7925/services/. Я могу перейти на страницу через браузер, но задача get дает мне FileNotFoundException при попытке скопировать страницу в локальный файл для разбора. Я все еще мог получить (используя муравьиную задачу) URL-адрес без нестандартного порта 80 для HTTP.URLConnection FileNotFoundException для нестандартных источников HTTP-порта

Я просмотрел исходный код Ant и сузил ошибку до URLConnection. Кажется, что URLConnection не распознает данные, это HTTP-трафик, поскольку он не находится на стандартном порту, хотя протокол указан как HTTP. Я понюхал трафик с помощью WireShark, и страница загрузилась правильно по проводу, но все равно получает исключение FileNotFoundException.

Вот пример, где вы увидите ошибку (с измененным URL для защиты невинных). Ошибка вызывается на connection.getInputStream();

import java.io.File; 
import java.io.InputStream; 
import java.net.URL; 
import java.net.URLConnection; 

    public class TestGet { 
    private static URL source; 
    public static void main(String[] args) { 
     doGet(); 
    } 
    public static void doGet() { 
      try { 
      source = new URL("http", "test.com", 7925, 
        "/services/index.html"); 
      URLConnection connection = source.openConnection(); 
      connection.connect(); 
      InputStream is = connection.getInputStream(); 
     } catch (Exception e) { 
      System.err.println(e.toString()); 
     } 
    } 

} 
+0

Теперь я предполагаю, что это тип, но ваша ссылка находится в порту 7924, и ваш код смотрит на порт 7925 – Gandalf

+0

Yup, это была опечатка, исправленная сейчас, спасибо. – jeffl8n

ответ

7

проверить код ответа возвращаемой сервером

+0

Сервер, на котором я тестирую, дает мне код состояния 200. – jeffl8n

+0

Как вы это проверяете? – objects

+0

Я проверял его с помощью Firefox. Вы правы. Проблема заключалась в том, что сервер возвращает код 404 в код Java, но затем показывает индекс доступных WSDL и, таким образом, отвечает на код состояния OK OK до Firefox. Я думаю, что это поведение по умолчанию для XFire, чтобы отображать список WSDL, когда есть ошибка 404. – jeffl8n

0

Я пробовал локально - с помощью кода при условии, - и я не получаю FileNotFoundException кроме случаев, когда сервер возвращает статус 404 ответа.

Вы уверены, что используете соединение с веб-сервером, к которому собираетесь подключиться? Есть ли вероятность, что вы подключаетесь к другому веб-серверу? (Замечу, что номер порта в коде не совпадает с номером порта в ссылке)

+0

Сервер, на котором я тестирую, дает мне код состояния 200. В приведенном выше примере кода нет действительного URL-адреса, потому что я не знал об общественном HTTP-сервере, не поддерживающем порт. – jeffl8n

+1

402 также дал это исключение. – Pijusn

+0

Также 503 дает это исключение (мое сделано с помощью защиты от DDoS) –

19

Это старая нить, но у меня была аналогичная проблема и нашел решение, которое здесь не указано.

Я получил страницу в браузере, но получил 404, когда попытался получить к нему доступ через HttpURLConnection. URL-адрес, который я пытался получить, содержал номер порта. Когда я попробовал это без номера порта, я успешно получил фиктивную страницу через HttpURLConnection. Таким образом, проблема была в нестандартном порту.

Я начал думать, что доступ ограничен, и в некотором смысле это было. Мое решение состояло в том, что мне нужно было сообщить серверу User-Agent, а также указать типы файлов, которые я ожидаю. Я пытаюсь прочитать файл .json, поэтому я думал, что тип файла также может быть необходимой спецификацией.

Я добавил эти строки, и, наконец, работал:

httpConnection.setRequestProperty("User-Agent","Mozilla/5.0 (compatible) "); 
httpConnection.setRequestProperty("Accept","*/*"); 
+0

Большое спасибо, это работает! –

+0

Это была проблема, с которой я столкнулся. Ваше решение помогло. Благодаря тонну. – naiquevin

44

Ответ на мой запрос HTTP вернулся с кодом состояния 404, в результате чего в FileNotFoundException, когда я назвал getInputStream(). Я все еще хотел прочитать тело ответа, поэтому мне пришлось использовать другой метод: HttpURLConnection # getErrorStream().

Вот JavaDoc фрагмент getErrorStream():

Возвращает поток ошибок, если соединение не удалось, но сервер послал полезные данные, тем не менее. Типичный пример, когда HTTP-сервер отвечает 404, что приведет к FileNotFoundException быть выброшен в Connect, но сервер послал страницу помощи HTML с предложениями, чтобы , что делать.

Пример использования:

public static String httpGet(String url) { 
    HttpURLConnection con = null; 
    InputStream is = null; 
    try { 
     con = (HttpURLConnection) new URL(url).openConnection(); 
     con.connect(); 

     //4xx: client error, 5xx: server error. See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html. 
     boolean isError = con.getResponseCode() >= 400; 
     //In HTTP error cases, HttpURLConnection only gives you the input stream via #getErrorStream(). 
     is = isError ? con.getErrorStream() : con.getInputStream(); 

     String contentEncoding = con.getContentEncoding() != null ? con.getContentEncoding() : "UTF-8"; 
     return IOUtils.toString(is, contentEncoding); //Apache Commons IO 
    } catch (Exception e) { 
     throw new IllegalStateException(e); 
    } finally { 
     //Note: Closing the InputStream manually may be unnecessary, depending on the implementation of HttpURLConnection#disconnect(). Sun/Oracle's implementation does close it for you in said method. 
     if (is != null) { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       throw new IllegalStateException(e); 
      } 
     } 
     if (con != null) { 
      con.disconnect(); 
     } 
    } 
} 
+0

было полезно, но это всего лишь неопределенная страница с ошибками 400. Я использую https://graph.facebook.com/me/photos и в браузере работает, если вы не попытаетесь просмотреть заголовки через аддон веб-разработчика. Таким образом, кажется, что входной поток каким-то образом создает новый запрос, что не имеет смысла ... больше времени, чтобы понять, что один из ... спасибо за отзыв geterrorstream. – Brenden

+1

Он работает. Проверьте код ответа, затем getErrorStream() или getInputStream() соответственно. В этом случае должен быть предоставлен фрагмент кода. – Emerald214

+0

проверка кода ответа помогла мне много. теперь я не нахожу FileNotFoundException..thanks @bcody –

2

Я знаю, что это старый нить, но я нашел решение нет в списке где-нибудь здесь.

Я пытался вытащить данные в формате json из сервлета J2EE на порт 8080, но получал ошибку, не найденную в файле. Я смог вытащить эти же данные json с php-сервера, работающего на порту 80.

Оказывается, в сервлете мне нужно было изменить doGet на doPost.

Надеюсь, это поможет кому-то.

0

я столкнулся с подобным вопросом, но причина, кажется, отличается, здесь есть след исключение:

java.io.FileNotFoundException: http://myhost1:8081/test/api?wait=1 
    at sun.reflect.GeneratedConstructorAccessor2.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1491) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1485) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1139) 
    at com.doitnext.loadmonger.HttpExecution.getBody(HttpExecution.java:85) 
    at com.doitnext.loadmonger.HttpExecution.execute(HttpExecution.java:214) 
    at com.doitnext.loadmonger.ClientWorker.run(ClientWorker.java:126) 
    at java.lang.Thread.run(Thread.java:680) 
Caused by: java.io.FileNotFoundException: http://myhost1:8081/test/api?wait=1 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1434) 
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379) 
    at com.doitnext.loadmonger.HttpExecution.execute(HttpExecution.java:166) 
    ... 2 more 

Так, казалось бы, просто получить код ответа будет вызывать подключение URL к callGetInputStream.

+2

Я исправил проблему, отбросив HttpUrlConnection и используя Apache HttpClient. Гораздо лучше производительность и намного более чистый код. –

0

Я знаю, что это старая нить, но только что заметил что-то на этом, поэтому подумал, что я просто потушу ее там.

Как упоминается Джессика, это исключение выбрасывается при использовании нестандартного порта.

Возможно, это происходит только при использовании DNS. Если я использую IP-номер, я могу указать номер порта, и все работает нормально.

Смежные вопросы