FileNotFoundException при вызове веб-службы - PullRequest
20 голосов
/ 03 марта 2011

Здравствуйте, я преодолел свою первоначальную проблему . Я полный нуб андроид, это мое первое приложение. Я тестирую это на эмуляторе Android. Я пытаюсь подключиться к веб-сервису .NET на http://192.168.3.47/service.asmx. Я получаю FileNotFoundException. Но это там, URL-адрес правильный. Как я могу заставить его увидеть это?


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)

Это происходит здесь: 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();

Ответы [ 5 ]

62 голосов
/ 03 марта 2011

Класс HttpURLConnection вводит в заблуждение, так как он выдаст FileNotFoundException для любого HTTP-кода ошибки 400 или выше.

Так что это не обязательно неверный URL (404), он может быть 400 (неверный запрос), 403 (запрещено), 500 (внутренняя ошибка сервера) или что-то еще.

Используйте метод getResponseCode, чтобы получить более точное представление о проблеме.

17 голосов
/ 29 июня 2015

Это та же проблема, что и у меня: HttpUrlConnection возвращает FileNotFoundException, если вы пытаетесь прочитать getInputStream () из соединения.
Вместо этого вы должны использовать getErrorStream (), когда код состояния выше 400.

Более того, пожалуйста, будьте осторожны, поскольку не только 200 должны быть кодами статуса успеха, даже 201, 204 и т. Д. Часто используются в качестве статусов успеха.

Вот пример того, как я справился с этим

... 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....

Таким образом, вы сможете получить необходимый ответ как в случае успеха, так и в случае ошибки.

Надеюсь, это поможет!

3 голосов
/ 23 июля 2012

Попробуйте удалить:

connection.setDoInput(true);
connection.setDoOutput(true);
2 голосов
/ 03 марта 2011

Убедитесь, что вы можете получить доступ к этому URL из вашего веб-браузера http://192.168.3.47/service.asmx

и убедитесь, что прокси-сервер не настроен в вашем веб-браузере, если это так, настройте свой код соответствующим образом

0 голосов
/ 06 апреля 2016

У меня была эта ошибка при вызове API.Я понял, что мне не хватает ключа API.Любой, кто найдет эту ветку по той же проблеме, не забудьте включить ключ API в вызов API, если это требуется API.

...