Pregunta

Yo estaba tratando de utilizar la tarea Get Apache Ant para obtener una lista de WSDL generados por otro equipo en nuestra empresa. Han ellas alojada en un servidor WebLogic 9.x en http: //....com: 7925 / servicios / . Soy capaz de llegar a la página a través de un navegador, pero la tarea get me da un FileNotFoundException al intentar copiar la página en un archivo local para analizar. Todavía era capaz de conseguir (mediante la tarea de hormiga) una URL sin el puerto no estándar 80 para HTTP.

Miré a través del código fuente de hormiga y se ha restringido el error hasta el URLConnection. Parece como si el URLConnection no reconoce los datos es el tráfico HTTP, ya que no está en el puerto estándar, a pesar de que el protocolo se especifica como HTTP. Olí el tráfico Uso de Wireshark y la página se carga correctamente a través del cable, pero todavía se pone FileNotFoundException.

Este es un ejemplo donde se encuentra el error (con la URL cambiado para proteger a los inocentes). El error es lanzada en 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());
        }
    }

}
¿Fue útil?

Solución

Comprobar el código de respuesta que se devuelve por el servidor

Otros consejos

La respuesta a mi solicitud HTTP volvió con un código de estado 404, lo que resultó en un FileNotFoundException cuando llamé getInputStream (). Todavía quería leer el cuerpo de la respuesta, así que tuve que utilizar un método diferente:. HttpURLConnection # getErrorStream ()

He aquí un fragmento de JavaDoc getErrorStream ():

  

Devuelve el flujo de error si el   conexión ha fallado pero el servidor envía   datos útiles no obstante. Lo tipico   ejemplo es cuando un servidor HTTP   responde con un 404, lo que provocará   un FileNotFoundException a ser lanzado   en la conexión, pero el servidor envía una   HTML página de ayuda con sugerencias en cuanto a   qué hacer.

Ejemplo de uso:

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();
        }
    }
}

Este es un viejo hilo, pero tuve un problema similar y ha encontrado una solución que no aparece en esta lista.

que estaba recibiendo la multa página en el navegador, pero tengo un 404 cuando traté de acceder a él a través de la HttpURLConnection. La URL que estaba tratando de acceso contenía un número de puerto. Cuando lo probé sin el número de puerto llegué correctamente una página ficticia a través de la HttpURLConnection. Por lo que parecía el puerto no estándar era el problema.

Empecé a pensar en el acceso estaba restringido, y en cierto sentido lo era. Mi solución fue que tenía que decirle al servidor de agente de usuario y también especificar los tipos de archivos que cabe esperar. Estoy tratando de leer un archivo .json, así que pensé que el tipo de archivo podría ser necesaria una especificación también.

He añadido estas líneas y finalmente funcionó:

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

Sé que esto es un hilo viejo, pero he encontrado una solución no aparece en cualquier lugar aquí.

Yo estaba tratando de tirar de datos en formato JSON desde un servlet J2EE en el puerto 8080, pero estaba recibiendo el archivo no se encuentra el error. Yo era capaz de tirar de estos mismos datos JSON desde un servidor PHP que se ejecuta en el puerto 80.

Resulta que en el servlet, que necesitaba cambiar a doGet doPost.

Espero que esto ayude a alguien.

He intentado que localmente - utilizando el código proporcionado -. Y yo no consigo un FileNotFoundException excepto cuando el servidor devuelve un estado de respuesta 404

¿Está seguro de que se va a conectar al servidor web tiene la intención de ser la conexión a? ¿Hay alguna posibilidad de que se está conectando a un servidor web diferente? (Tomo nota de que el número de puerto en el código no coincide con el número de puerto en el enlace)

Me he encontrado con un problema similar, pero la razón parece ser diferente, aquí está la traza excepción:

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

Por lo que parece que acaba de conseguir el código de respuesta hará que la conexión URL para callGetInputStream.

Sé que esto es un viejo hilo, pero apenas notado algo en esto así que pensé simplemente voy a ponerlo ahí.

Al igual que Jessica se ha mencionado, esta excepción se produce cuando se utiliza el puerto no estándar.

Sólo parece ocurrir cuando se utiliza DNS sin embargo. Si utilizo el número de IP que puedo especificar el número de puerto y todo funciona bien.

Se puede usar OkHttp :

OkHttpClient client = new OkHttpClient();

String run(String url) throws IOException {
  Request request = new Request.Builder()
      .url(url)
      .build();

  Response response = client.newCall(request).execute();
  return response.body().string();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top