web-dev-qa-db-ja.com

Webサービスの呼び出し時にFileNotFoundException

こんにちは、最初の 問題 を過ぎました。私は合計ですAndroid noob、これが私の最初のアプリです。Androidエミュレータでこれをテストしています。NETに接続しようとしています_http://192.168.3.47/service.asmx_のwebservice ._FileNotFoundExceptionを取得します。しかし、ISそこにあります。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();
_
20
gyozo kudor

HttpURLConnectionクラスは、400以上のHTTPエラーコードに対してFileNotFoundExceptionをスローするという誤解を招く可能性があります。

したがって、これは必ずしも間違ったURL(404)であるとは限りません。400(不正な要求)、403(禁止)、500(内部サーバーエラー)などの可能性があります。

getResponseCode メソッドを使用して、問題をより正確に示します。

62
Dan Dyer

これは私が抱えていたのと同じ問題です。接続からgetInputStream()を読み取ろうとすると、HttpUrlConnectionがFileNotFoundExceptionを返します。
ステータスコードが400より大きい場合は、代わりにgetErrorStream()を使用する必要があります。

成功ステータスコードは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....

このようにして、成功した場合とエラーの場合の両方で必要な応答を取得できます。

お役に立てれば!

17
gpiazzese

削除してみてください:

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

WebブラウザーからこのURLにアクセスできることを確認してくださいhttp://192.168.3.47/service.asmx

webブラウザーでプロキシーが構成されていないことを確認します(そうであれば、それに応じてコードを構成します)。

2
Jigar Joshi

APIの呼び出し中にこのエラーが発生しました。 APIキーが不足していることに気付きました。同じ問題でこのスレッドを見つけた人は、APIで必要な場合は、APIキーをAPI呼び出しに含めることを忘れないでください。

0