调用 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
调用 Sitefinity WCF Web 服务时出现错误 401
尝试从我的 android 服务调用 web 服务时出现 android.os.NetworkOnMainThreadException 异常?