2011-03-03 24 views
19

Hola supere mi inicial problem. Soy un novato androide total, esta es mi primera aplicación. Estoy probando esto en el emulador de Android. Intento conectarme a un servicio web .NET al http://192.168.3.47/service.asmx. obtengo un FileNotFoundException. Pero está ahí, la url es correcta. ¿Cómo puedo hacer que vea eso?FileNotFoundException al llamar al servicio web


03-03 11:23:49.741: WARN/System.err(455): java.io.FileNotFoundException: http://192.168.3.47/service.asmx 
03-03 11:23:49.751: WARN/System.err(455):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:521) 
03-03 11:23:49.801: WARN/System.err(455):  at gyozo.HelloWorld.HelloActivity.onClick(HelloActivity.java:62) 
03-03 11:23:49.831: WARN/System.err(455):  at android.view.View.performClick(View.java:2485) 
03-03 11:23:49.851: WARN/System.err(455):  at android.view.View$PerformClick.run(View.java:9080) 
03-03 11:23:49.871: WARN/System.err(455):  at android.os.Handler.handleCallback(Handler.java:587) 
03-03 11:23:49.910: WARN/System.err(455):  at android.os.Handler.dispatchMessage(Handler.java:92) 
03-03 11:23:49.940: WARN/System.err(455):  at android.os.Looper.loop(Looper.java:123) 
03-03 11:23:49.950: WARN/System.err(455):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
03-03 11:23:50.010: WARN/System.err(455):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-03 11:23:50.050: WARN/System.err(455):  at java.lang.reflect.Method.invoke(Method.java:507) 
03-03 11:23:50.070: WARN/System.err(455):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
03-03 11:23:50.090: WARN/System.err(455):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
03-03 11:23:50.110: WARN/System.err(455):  at dalvik.system.NativeStart.main(Native Method) 

Esto sucede aquí: InputStream is = connection.getInputStream();


URL url = new URL("http://192.168.3.47/service.asmx"); 
HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 
connection.setRequestMethod("POST"); 
connection.setRequestProperty("Content-Type", 
"application/soap+xml; charset=utf-8"); 

connection.setUseCaches(false); 
connection.setDoInput(true); 
connection.setDoOutput(true); 

String soapRequest = String.format(getText(R.string.ws_listemain_ds_new).toString(), city, keyword); 
connection.setRequestProperty("Content-Length", Integer.toString(soapRequest.getBytes("UTF-8").length)); 
//Send request 
OutputStreamWriter owr = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); 

owr.write(soapRequest); 
owr.flush(); 
owr.close(); 

//Get Response 
InputStream is = connection.getInputStream(); 

Respuesta

56

La clase HttpURLConnection es engañosa ya que arrojará un FileNotFoundException para cualquier código de error HTTP de 400 o superior.

Así que no es necesariamente una URL incorrecta (404) podría ser 400 (solicitud incorrecta), 403 (prohibido), 500 (error interno del servidor) u otra cosa.

Utilice el método getResponseCode para obtener una indicación más precisa del problema.

+0

¿Alguna razón me daría este error si el código de respuesta es en realidad 400? ¡Tan extraña! –

+0

El código de error HTTP 400 es "Solicitud incorrecta".HttpURLConnection arrojará una excepción FileNotFoundException para 400 o superior. –

+5

Gran respuesta. Además, si obtienes 400 o más y el servidor también envía un cuerpo a la respuesta, puedes obtenerlo con el método 'conn.getErrorStream()'. –

2

Asegúrese de que puede acceder a esta URL desde el navegador web http://192.168.3.47/service.asmx

y asegúrese de que no hay proxy configurado con su navegador web, si así lo configure su código en consecuencia

+0

Me aseguré. Puedo acceder a la url desde el navegador web desde Android. Me olvido de mencionar que es del emulador. ¿El emulador usa proxy? ¿Dónde lo verifico? –

+1

'y asegúrese de que no haya ningún proxy configurado con su navegador web' –

+0

No puedo encontrar nada en el emulador para proxies, la computadora host no usa proxy. –

2

Trate de no incluir:

connection.setDoInput(true); 
connection.setDoOutput(true); 
+0

He agregado las dos líneas anteriores y se ha resuelto para datos móviles. –

14

Es el mismo problema que tenía: HttpURLConnection devuelve FileNotFoundException si intenta leer el getInputStream() de la conexión.
su lugar, debe utilizar getErrorStream() cuando el código de estado es mayor que 400.

Más que esto, por favor tener cuidado ya que no es sólo de 200 a ser el código de estado de éxito, incluso 201, 204, etc., son a menudo utilizado como estados de éxito.

Aquí es un ejemplo de cómo fui a manejarlo

... connection code code code ... 

// Get the response code 
int statusCode = connection.getResponseCode(); 

InputStream is = null; 

if (statusCode >= 200 && statusCode < 400) { 
    // Create an InputStream in order to extract the response object 
    is = connection.getInputStream(); 
} 
else { 
    is = connection.getErrorStream(); 
} 

... callback/response to your handler.... 

De esta manera, usted será capaz de obtener la respuesta necesaria en ambos casos de éxito y error.

Espero que esto ayude!

+1

Respuesta perfecta +1 –

0

Tuve este error al llamar a la API. Me di cuenta de que me faltaba la clave API. Cualquiera que encuentre este hilo por el mismo problema, no se olvide de incluir la clave API en la llamada API, si la API lo requiere.

Cuestiones relacionadas