FileNotFoundException при вызове веб-сервиса

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


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

person gyozo kudor    schedule 03.03.2011    source источник


Ответы (5)


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

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

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

person Dan Dyer    schedule 03.03.2011
comment
По какой причине я получу эту ошибку, если код ответа на самом деле 400? Так странно! - person Paul Shapiro; 08.03.2011
comment
Код ошибки HTTP 400 — неверный запрос. HttpURLConnection вызовет FileNotFoundException для 400 или выше. - person Dan Dyer; 08.03.2011
comment
Отличный ответ. Кроме того, если вы получаете 400 и выше, и сервер также отправляет тело ответа, вы можете получить это с помощью метода conn.getErrorStream(). - person Stefan Anca; 09.08.2013

Та же проблема, что и у меня: 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....

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

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

person gpiazzese    schedule 29.06.2015

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

connection.setDoInput(true);
connection.setDoOutput(true);
person user1341056    schedule 23.07.2012
comment
Я добавил выше две строки, и это было решено для мобильных данных. - person Chirag Kheni; 20.11.2016

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

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

person jmj    schedule 03.03.2011
comment
Я убедился. Я могу получить доступ к URL-адресу из веб-браузера с Android. Я забыл упомянуть, что это от эмулятора. Эмулятор использует прокси? Где мне это проверить? - person gyozo kudor; 03.03.2011
comment
В эмуляторе ничего не могу найти для прокси, хост-компьютер не использует прокси. - person gyozo kudor; 03.03.2011
comment
убедитесь, что в вашем веб-браузере должен быть настроен прокси - person jmj; 03.03.2011
comment
Прокси-сервер не настроен ни для моего браузера, ни для моего компьютера. - person gyozo kudor; 03.03.2011
comment
Извини, я не понимаю. Я не хочу скачивать файл. Я хочу отправить запрос мыла на адрес 192.168.3.47/service.asmx и вызвать метод веб-службы. - person gyozo kudor; 03.03.2011
comment
ах. да, это моя ошибка, вы не можете продолжить, загрузив его. - person jmj; 03.03.2011

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

person Yogesh Umesh Vaity    schedule 06.04.2016