【问题标题】:HttpURLConnection url.openStream() java.io.IOException: No authentication challenges foundHttpURLConnection url.openStream() java.io.IOException:未找到身份验证挑战
【发布时间】:2015-10-23 23:57:16
【问题描述】:

我正在尝试使用 Android 和 REST 从我的服务器加载图像。但是当我尝试打开流时,它会因以下异常而崩溃:

myapp: W/System.err? java.io.IOException: No authentication challenges found
myapp: W/System.err? at libcore.net.http.HttpURLConnectionImpl.getAuthorizationCredentials(HttpURLConnectionImpl.java:427)
myapp: W/System.err? at libcore.net.http.HttpURLConnectionImpl.processAuthHeader(HttpURLConnectionImpl.java:407)
myapp: W/System.err? at libcore.net.http.HttpURLConnectionImpl.processResponseHeaders(HttpURLConnectionImpl.java:356)
myapp: W/System.err? at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:292)
myapp: W/System.err? at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
myapp: W/System.err? at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)
myapp: W/System.err? at java.net.URL.openStream(URL.java:462)
myapp: W/System.err? at de.facentis.GenerstoAndroidTester.Rest.asynctasks.TheOneAndOnlyAsync.getStream(TheOneAndOnlyAsync.java:199)
myapp: W/System.err? at de.facentis.GenerstoAndroidTester.Rest.asynctasks.TheOneAndOnlyAsync.doInBackground(TheOneAndOnlyAsync.java:74)
myapp: W/System.err? at de.facentis.GenerstoAndroidTester.Rest.asynctasks.TheOneAndOnlyAsync.doInBackground(TheOneAndOnlyAsync.java:22)
myapp: W/System.err? at android.os.AsyncTask$2.call(AsyncTask.java:287)
myapp: W/System.err? at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
myapp: W/System.err? at java.util.concurrent.FutureTask.run(FutureTask.java:137)
myapp: W/System.err? at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
myapp: W/System.err? at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
myapp: W/System.err? at java.lang.Thread.run(Thread.java:856)

我在其他线程中发现,在 stackoverflow 上,它可能是来自服务器的 401。我检查了一下,我的服务器向我发送了一个 200 状态码。来自服务器的方法在其他客户端上正常工作。

这是我使用的方法:

try {
    InputStream input = null;
    OutputStream output = null;

    try {
        URL url = new URL(methodUri);
        HttpURLConnection connection = (HttpURLConnection)url.openConnection();

        connection.setRequestProperty("Authorization", basicHeader);
        connection.setRequestProperty("Accept", "application/json");
        connection.setRequestProperty("Content-Type", "application/json");
        connection.setRequestProperty("Accept-Language", Locale.getDefault().getLanguage());
        connection.setConnectTimeout(5000);
        connection.connect();

        input = new BufferedInputStream(url.openStream());      // <--- Crash
        output = new FileOutputStream(context.getFileStreamPath(filename));

        byte data[] = new byte[1024];
        int count;
        while ((count = input.read(data)) != -1) {
            output.write(data, 0, count);
        }

        return;
    } catch (java.net.SocketTimeoutException ex) {
        ex.printStackTrace();
    } catch (Exception ex) {
        ex.printStackTrace();
    }finally{
        try {
            output.flush();
            output.close();
            input.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}catch (Exception ex) {
    ex.printStackTrace();
}
return;

有人知道吗?

最好的问候

【问题讨论】:

  • 我是另一篇帖子的案例,用户得到 401。我得到 200 作为答案。我在同一个项目中有一个 GET 和 POST 方法都可以正常工作。只是流崩溃了。

标签: android json


【解决方案1】:

我找到了一个解决方案,但不知道它为什么有效。如果有人可以解释它为什么起作用,欢迎您。

我切换自:

input = new BufferedInputStream(url.openStream());

到:

input = connection.getInputStream();

最好的问候

【讨论】:

    猜你喜欢
    • 2013-06-11
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    相关资源
    最近更新 更多