setreadtimeout - setrequestproperty en java
URLConnection FileNotFoundException para orígenes de puerto HTTP no estándar (8)
Estaba intentando usar la tarea Apache Ant Get
para obtener una lista de WSDL generados por otro equipo de nuestra empresa. Los tienen alojados en un servidor weblogic 9.x en http: //....com: 7925 / services / . Puedo acceder a la página a través de un navegador, pero la tarea de obtención me da una excepción FileNotFoundException cuando intento copiar la página en un archivo local para analizar. Todavía podía obtener (usando la tarea ant) una URL sin el puerto 80 no estándar para HTTP.
Revisé el código fuente de Ant y reduje el error a la conexión URLC. Parece que la conexión URLC no reconoce que los datos son tráfico HTTP, ya que no está en el puerto estándar, aunque el protocolo está especificado como HTTP. Detecté el tráfico utilizando WireShark y la página se carga correctamente a través del cable, pero todavía recibe la excepción FileNotFoundException.
Aquí hay un ejemplo donde verá el error (con la URL cambiada para proteger a los inocentes). El error se produce 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());
}
}
}
Este es un hilo antiguo, pero tuve un problema similar y encontré una solución que no se encuentra aquí.
Recibí la multa de la página en el navegador, pero obtuve un 404 cuando intenté acceder a él a través de HttpURLConnection. La URL a la que intentaba acceder contenía un número de puerto. Cuando lo probé sin el número de puerto conseguí una página ficticia a través de HttpURLConnection. Así que parecía que el puerto no estándar era el problema.
Comencé a pensar que el acceso estaba restringido, y en cierto sentido lo era. Mi solución fue que necesitaba comunicarle al servidor el User-Agent y también especificar los tipos de archivos que espero. Estoy intentando leer un archivo .json, así que pensé que el tipo de archivo también podría ser una especificación necesaria.
Agregué estas líneas y finalmente funcionó:
httpConnection.setRequestProperty("User-Agent","Mozilla/5.0 ( compatible ) ");
httpConnection.setRequestProperty("Accept","*/*");
La respuesta a mi solicitud HTTP regresó con un código de estado 404, que resultó en una excepción FileNotFoundException cuando llamé a getInputStream (). Todavía quería leer el cuerpo de la respuesta, así que tuve que usar un método diferente: HttpURLConnection # getErrorStream () .
Aquí hay un fragmento de JavaDoc de getErrorStream ():
Devuelve la secuencia de error si la conexión falló, pero el servidor envió datos útiles, no obstante. El ejemplo típico es cuando un servidor HTTP responde con un 404, lo que provocará que se genere una excepción FileNotFoundException, pero el servidor envió una página de ayuda HTML con sugerencias sobre 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();
}
}
}
Lo he intentado localmente, utilizando el código provisto, y no obtengo una excepción FileNotFoundException
excepto cuando el servidor devuelve una respuesta de estado 404.
¿Está seguro de que se está conectando al servidor web al que desea conectarse? ¿Hay alguna posibilidad de que te estés conectando a un servidor web diferente? (Observo 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 de 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 tanto, parece que el simple hecho de obtener el código de respuesta causará que la conexión de la URL sea callGetInputStream.
Podrías 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(); }
Sé que este es un hilo viejo, pero me di cuenta de algo en este, así que pensé que solo lo pondría ahí.
Como mencionó Jessica, esta excepción se produce cuando se utiliza un puerto no estándar.
Aunque solo parece suceder cuando se usa DNS. Si uso el número de IP, puedo especificar el número de puerto y todo funciona bien.
Sé que este es un tema antiguo, pero encontré una solución que no figura en ninguna parte aquí.
Estaba intentando extraer datos en formato json de un servlet J2EE en el puerto 8080, pero estaba recibiendo el error de archivo no encontrado. Pude obtener estos mismos datos json de un servidor php que se ejecuta en el puerto 80.
Resulta que en el servlet, necesitaba cambiar doGet a doPost.
Espero que esto ayude a alguien.
Verifique el código de respuesta que está devolviendo el servidor.