2009-06-02 1 views
23

Stavo cercando di utilizzare Apache Ant Get task per ottenere un elenco di WSDL generati da un altro team nella nostra azienda. Li hanno ospitati su un server weblogic 9.x su http://....com:7925/services/. Sono in grado di accedere alla pagina tramite un browser, ma il task get mi dà un oggetto FileNotFoundException quando provo a copiare la pagina in un file locale per analizzarla. Ero ancora in grado di ottenere (usando l'attività ant) ​​un URL senza la porta 80 non standard per HTTP.URLConnection FileNotFoundException per origini porte HTTP non standard

Ho controllato il codice sorgente Ant e ho ridotto l'errore a URLConnection. Sembra che URLConnection non riconosca che i dati sono traffico HTTP, poiché non si trova sulla porta standard, anche se il protocollo è specificato come HTTP. Ho annusato il traffico usando WireShark e la pagina si carica correttamente attraverso il cavo, ma ottiene comunque FileNotFoundException.

Ecco un esempio in cui viene visualizzato l'errore (con l'URL modificato per proteggere l'innocente). L'errore viene generato su 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

Ora presumo che sia un tipo ma il tuo collegamento è alla porta 7924 e il tuo codice sta guardando la porta 7925 – Gandalf

+0

Sì, era un refuso, risolto ora, grazie. – jeffl8n

risposta

7

verifica il codice di risposta viene restituito dal server

+0

Il server che sto testando mi dà un 200 codice di stato. – jeffl8n

+0

Come stai verificando? – objects

+0

Lo stavo controllando con Firefox. Hai ragione, però. Il problema era che il server stava restituendo un codice 404 al codice Java, ma poi visualizzava l'indice dei WSDL disponibili e rispondeva quindi con un codice di stato 200 OK a Firefox. Penso che sia il comportamento predefinito per XFire per visualizzare l'elenco dei WSDL ogni volta che si verifica un errore 404. – jeffl8n

0

Ho provato che a livello locale - utilizzando il codice fornito - e non si ottiene un FileNotFoundException tranne quando il server restituisce lo stato 404 risposta.

Sei sicuro di essere connesso al server web a cui desideri collegarti? C'è qualche possibilità che ti connetti a un server web diverso? (Faccio notare che il numero di porta nel codice non corrisponde al numero di porta nel link)

+0

Il server che sto testando mi dà un codice di stato 200. L'esempio di codice sopra non ha un URL valido perché non ero a conoscenza di un server HTTP pubblico non 80 porte. – jeffl8n

+1

402 ha anche dato questa eccezione. – Pijusn

+0

Anche 503 fornisce questa eccezione (la mia creata da una protezione Anti-DDoS) –

19

Questo è un vecchio thread, ma ho avuto un problema simile e ho trovato una soluzione che non è elencata qui.

Stavo ricevendo la pagina fine nel browser, ma ho ottenuto un 404 quando ho provato ad accedervi tramite HttpURLConnection. L'URL che stavo cercando di accedere conteneva un numero di porta. Quando ho provato senza il numero di porta ho ottenuto con successo una pagina fittizia attraverso HttpURLConnection. Quindi sembrava che il porto non standard fosse il problema.

Ho iniziato a pensare che l'accesso fosse limitato, e in un certo senso lo era. La mia soluzione era che dovevo dire al server l'User-Agent e anche specificare i tipi di file che mi aspetto. Sto cercando di leggere un file .json, quindi ho pensato che anche il tipo di file potesse essere una specifica necessaria.

ho aggiunto queste righe e finalmente funzionato:

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

Grazie mille, funziona! –

+0

Questo era esattamente il problema che stavo affrontando. La tua soluzione ha aiutato. Grazie mille. – naiquevin

44

La risposta alla mia richiesta HTTP restituito con un codice di stato 404, che ha comportato una FileNotFoundException quando ho chiamato getInputStream(). Volevo comunque leggere il corpo della risposta, quindi ho dovuto utilizzare un metodo diverso: HttpURLConnection # getErrorStream().

Ecco un frammento di JavaDoc getErrorStream():

Restituisce il flusso di errore se la connessione non è riuscita ma il server ha inviato dati utili comunque. Il tipico esempio è quando un server HTTP risponde con un 404, che causerà un FileNotFoundException per essere gettato in connessione, ma il server ha inviato una pagina di aiuto HTML con suggerimenti per cosa fare.

Esempio di utilizzo:

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

questo è stato utile, ma è solo una vaga pagina di errore 400. Sto usando https://graph.facebook.com/me/photos e nel browser funziona a meno che non provi a visualizzare le intestazioni tramite l'addon dello sviluppatore web. Quindi sembra che l'inputstream stia creando una nuova richiesta in qualche modo, il che non ha senso ... più tempo per capirlo ... grazie per il suggerimento geterrorstream però. – Brenden

+1

Funziona. Controllare il codice di risposta quindi getErrorStream() o getInputStream() in modo corrispondente. Lo snippet di codice dovrebbe essere fornito in questo caso. – Emerald214

+0

controllare il codice di risposta mi ha aiutato molto. ora non sto trovando FileNotFoundException..thanks @bcody –

2

So che questo è un vecchio thread, ma ho trovato una soluzione non elencata da nessuna parte qui.

Stavo cercando di estrarre i dati in formato json da un servlet J2EE sulla porta 8080 ma stavo ricevendo il file errore non trovato. Sono stato in grado di estrarre questi stessi dati JSON da un server php in esecuzione sulla porta 80.

Si scopre che nel servlet, avevo bisogno di cambiare doGet to doPost.

Spero che questo aiuti qualcuno.

0

ho incontrato un problema simile, ma la ragione sembra essere diverso, qui è la traccia eccezione:

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 

così sembrerebbe che solo ottenere il codice di risposta farà sì che il collegamento URL callGetInputStream.

+2

Ho risolto il problema lanciando HttpUrlConnection e utilizzando Apache HttpClient. Prestazioni molto migliori e codice molto più pulito. –

0

So che questo è un thread vecchio ma ho appena notato qualcosa su questo, quindi ho pensato di metterlo da parte.

Come menzionato da Jessica, questa eccezione viene generata quando si utilizza una porta non standard.

Sembra solo che accada quando si utilizza il DNS però. Se uso il numero IP, posso specificare il numero di porta e tutto funziona correttamente.