调用 web 服务时出现 FileNotFoundException

Posted

技术标签:

【中文标题】调用 web 服务时出现 FileNotFoundException【英文标题】:FileNotFoundException when calling webservice 【发布时间】:2011-07-07 22:17:18 【问题描述】:

您好,我已经通过了最初的problem。我是一个完全的 android noob,这是我的第一个应用程序。我正在 Android 模拟器上对此进行测试。我尝试连接到http://192.168.3.47/service.asmx 的.NET 网络服务。 我得到一个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();

【问题讨论】:

【参考方案1】:

HttpURLConnection 类具有误导性,因为它会针对任何 400 或更高的 HTTP 错误代码抛出 FileNotFoundException

所以它不一定是不正确的 URL (404),它可能是 400(错误请求)、403(禁止)、500(内部服务器错误)或其他。

使用getResponseCode 方法更准确地指示问题。

【讨论】:

如果响应代码实际上是 400,我会收到此错误的任何原因?好奇怪! HTTP 错误代码 400 是“错误请求”。 HttpURLConnection 将抛出 400 或以上的 FileNotFoundException。 很好的答案。此外,如果您获得 400 及以上,并且服务器也向响应发送了正文,您可以使用 conn.getErrorStream() 方法获得。【参考方案2】:

这与我遇到的问题相同: 如果您尝试从连接中读取 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....

通过这种方式,您将能够在成功和错误情况下获得所需的响应。 希望这会有所帮助!

【讨论】:

【参考方案3】:

尝试删除:

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

【讨论】:

我在上面添加了两行,已经解决了移动数据问题。【参考方案4】:

确保您可以通过网络浏览器访问此 URL http://192.168.3.47/service.asmx

并确保您的网络浏览器没有配置代理,如果有,请相应地配置您的代码

【讨论】:

我确定了。我可以从 android 的网络浏览器访问 url。我忘了提到它来自模拟器。模拟器是否使用代理?我在哪里检查? and make sure there is no proxy configured with your web browser ? 我在模拟器中找不到任何代理,主机没有使用代理。 确保您的网络浏览器必须配置代理 没有为我的浏览器或计算机配置代理。【参考方案5】:

调用 API 时出现此错误。我意识到我错过了 API 密钥。如果 API 需要,请不要忘记在 API 调用中包含 API 密钥。

【讨论】:

以上是关于调用 web 服务时出现 FileNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章

调用 web 服务时出现 FileNotFoundException

仅在特定机器上调用 Web 服务时出现 401

调用 Sitefinity WCF Web 服务时出现错误 401

调用 WCF Web 服务时出现错误的 Json 响应

尝试从我的 android 服务调用 web 服务时出现 android.os.NetworkOnMainThreadException 异常?

为啥在我的 Web 服务中调用此方法时出现错误“无法将类型 'void' 隐式转换为 'string'?