Подтвердить что ты не робот

FileNotFoundException при вызове webservice

Здравствуйте, я прошёл свою первоначальную проблему . Я полный андроид noob, это мое первое приложение. Я тестирую это на эмуляторе 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();
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 4

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

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

Ответ 5

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