2012-05-03 8 views
3

レスポンスコードを取得する必要がありますが、IOExceptionがスローされます。私は何が問題なのか分からない!java.io.IOException:受信した認証チャレンジがnullです

try 
    { 
     url = new URL(urlBuilder.toString()); 
     conn = (HttpURLConnection) url.openConnection(); 
     conn.setDoInput(true); 
     conn.setConnectTimeout(TIME_OUT); 
     conn.setRequestMethod(METHOD_GET); 
     conn.setRequestProperty("accept", "*/*"); 
     conn.connect(); 
     int responseCode = conn.getResponseCode(); //throw IOException:Received authentication challenge is null 
     if (responseCode == HTTP_OK) 
     { 
      inStream = conn.getInputStream(); 
      response = getResponse(inStream); 
     } 
     else 
     { 
      response = "response code:"+responseCode; 
     } 
    } catch (Exception e) 
    { 
     throw e; 
    } 
    finally 
    { 
     conn.disconnect(); 
    } 
    return response; 
} 

IOExceptionがある:私は前にこの問題を越え、自分自身を来ている

05-03 20:14:01.577: WARN/System.err(1515): java.io.IOException: Received authentication challenge is null 
05-03 20:14:01.596: WARN/System.err(1515):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.doRequestInternal(HttpURLConnectionImpl.java:1694) 
05-03 20:14:01.577: INFO/QQWeiBo(1515): Received authentication challenge is null 
05-03 20:14:01.577: WARN/System.err(1515): java.io.IOException: Received authentication challenge is null 
05-03 20:14:01.577: WARN/System.err(1515): java.io.IOException: Received authentication challenge is null 
05-03 20:14:01.596: WARN/System.err(1515):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.doRequestInternal(HttpURLConnectionImpl.java:1694) 
05-03 20:14:01.596: WARN/System.err(1515):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.doRequest(HttpURLConnectionImpl.java:1649) 
05-03 20:14:01.596: WARN/System.err(1515):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:1374) 
05-03 20:14:01.596: WARN/System.err(1515):  at com.szy.weibo.service.SyncHttp.httpGet(SyncHttp.java:72) 
05-03 20:14:01.596: WARN/System.err(1515):  at com.szy.weibo.service.Weibo.getRequestToken(Weibo.java:45) 
05-03 20:14:01.606: WARN/System.err(1515):  at com.szy.weibo.MainActivity.startWebView(MainActivity.java:95) 
05-03 20:14:01.606: WARN/System.err(1515):  at com.szy.weibo.MainActivity.authorization(MainActivity.java:83) 
05-03 20:14:01.606: WARN/System.err(1515):  at com.szy.weibo.MainActivity$1.onClick(MainActivity.java:71) 
05-03 20:14:01.606: WARN/System.err(1515):  at android.view.View.performClick(View.java:2408) 
05-03 20:14:01.596: WARN/System.err(1515):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.doRequestInternal(HttpURLConnectionImpl.java:1694) 
05-03 20:14:01.596: WARN/System.err(1515):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.doRequest(HttpURLConnectionImpl.java:1649) 
05-03 20:14:01.596: WARN/System.err(1515):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:1374) 
05-03 20:14:01.596: WARN/System.err(1515):  at com.szy.weibo.service.SyncHttp.httpGet(SyncHttp.java:72) 
05-03 20:14:01.596: WARN/System.err(1515):  at com.szy.weibo.service.Weibo.getRequestToken(Weibo.java:45) 
05-03 20:14:01.606: WARN/System.err(1515):  at com.szy.weibo.MainActivity.startWebView(MainActivity.java:95) 
05-03 20:14:01.606: WARN/System.err(1515):  at com.szy.weibo.MainActivity.authorization(MainActivity.java:83) 
05-03 20:14:01.606: WARN/System.err(1515):  at com.szy.weibo.MainActivity$1.onClick(MainActivity.java:71) 
05-03 20:14:01.606: WARN/System.err(1515):  at android.view.View.performClick(View.java:2408) 
05-03 20:14:01.596: WARN/System.err(1515):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.doRequest(HttpURLConnectionImpl.java:1649) 
05-03 20:14:01.596: WARN/System.err(1515):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:1374) 
05-03 20:14:01.596: WARN/System.err(1515):  at com.szy.weibo.service.SyncHttp.httpGet(SyncHttp.java:72) 
05-03 20:14:01.596: WARN/System.err(1515):  at com.szy.weibo.service.Weibo.getRequestToken(Weibo.java:45) 
05-03 20:14:01.606: WARN/System.err(1515):  at com.szy.weibo.MainActivity.startWebView(MainActivity.java:95) 
05-03 20:14:01.606: WARN/System.err(1515):  at com.szy.weibo.MainActivity.authorization(MainActivity.java:83) 
05-03 20:14:01.606: WARN/System.err(1515):  at com.szy.weibo.MainActivity$1.onClick(MainActivity.java:71) 
05-03 20:14:01.606: WARN/System.err(1515):  at android.view.View.performClick(View.java:2408) 
05-03 20:14:01.606: WARN/System.err(1515):  at android.view.View$PerformClick.run(View.java:8816) 
05-03 20:14:01.616: WARN/System.err(1515):  at android.os.Handler.handleCallback(Handler.java:587) 
05-03 20:14:01.627: WARN/System.err(1515):  at android.os.Handler.dispatchMessage(Handler.java:92) 
05-03 20:14:01.627: WARN/System.err(1515):  at android.os.Looper.loop(Looper.java:123) 
05-03 20:14:01.627: WARN/System.err(1515):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
05-03 20:14:01.627: WARN/System.err(1515):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-03 20:14:01.606: WARN/System.err(1515):  at android.view.View$PerformClick.run(View.java:8816) 
05-03 20:14:01.616: WARN/System.err(1515):  at android.os.Handler.handleCallback(Handler.java:587) 
05-03 20:14:01.627: WARN/System.err(1515):  at android.os.Handler.dispatchMessage(Handler.java:92) 
05-03 20:14:01.627: WARN/System.err(1515):  at android.os.Looper.loop(Looper.java:123) 
05-03 20:14:01.627: WARN/System.err(1515):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
05-03 20:14:01.627: WARN/System.err(1515):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-03 20:14:01.627: WARN/System.err(1515):  at java.lang.reflect.Method.invoke(Method.java:521) 
05-03 20:14:01.647: WARN/System.err(1515):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
05-03 20:14:01.647: WARN/System.err(1515):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
05-03 20:14:01.647: WARN/System.err(1515):  at dalvik.system.NativeStart.main(Native Method) 
05-03 20:14:01.606: WARN/System.err(1515):  at android.view.View$PerformClick.run(View.java:8816) 
05-03 20:14:01.616: WARN/System.err(1515):  at android.os.Handler.handleCallback(Handler.java:587) 
05-03 20:14:01.627: WARN/System.err(1515):  at android.os.Handler.dispatchMessage(Handler.java:92) 
05-03 20:14:01.627: WARN/System.err(1515):  at android.os.Looper.loop(Looper.java:123) 
05-03 20:14:01.627: WARN/System.err(1515):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
05-03 20:14:01.627: WARN/System.err(1515):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-03 20:14:01.627: WARN/System.err(1515):  at java.lang.reflect.Method.invoke(Method.java:521) 
05-03 20:14:01.647: WARN/System.err(1515):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
05-03 20:14:01.647: WARN/System.err(1515):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
05-03 20:14:01.647: WARN/System.err(1515):  at dalvik.system.NativeStart.main(Native Method) 
05-03 20:14:01.627: WARN/System.err(1515):  at java.lang.reflect.Method.invoke(Method.java:521) 
05-03 20:14:01.647: WARN/System.err(1515):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
05-03 20:14:01.647: WARN/System.err(1515):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
05-03 20:14:01.647: WARN/System.err(1515):  at dalvik.system.NativeStart.main(Native Method) 
+0

ご希望の場合は、私の回答と+ 1 /同意してください。 –

答えて

0

。その例外は実際にはgetResponseCodeによってスローされます。これはUnauthorizedのHTTPコードです。これはAndroid実装のHttpURLConnectionに固有のようです。それに対処する最も簡単な方法は、catchブロック内の401を処理することです。

catch (java.io.IOException e) { 
    //Probably got a 401 here 
    response = "response code:"+401; 
} 
+0

この回答に問題がある場合は、少なくともコメントを残してください。 –

+5

これは非常に一般的で、401エラーとは何の関係もないIOExceptionをマスクすることができます。私はその上で、余分なチェックを追加し、あなたのアプローチを使用していますが、:\t \tキャッチ(のIOException e)の{ \t \t \t場合{ \t \t \t \tリターン(e.getMessage()は( "認証チャレンジを")が含まれています。) HttpsURLConnection.HTTP_UNAUTHORIZED;他 \t \t \t} \t \t \t { \t \t \t \tスローE。 \t \t \t} \t \t} – Chiara

+0

@Chiaraそれは良い点です。ありがとう。 –

3

サーバーサイドを変更できる場合は、401ステータスコードで送信された正しいヘッダーがあることを確認できます。 http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2無断

10.4.2 401

からの要求にはユーザー認証が必要です。 応答は、要求されたリソースに適用可能な挑戦 を含むWWW-Authenticateヘッダフィールド(セクション14.47)を含まなければなりません。クライアントは、 要求を適切なAuthorizationヘッダーフィールド(14.8節)で繰り返すことができる(MAY)。 要求にすでに承認資格情報が含まれている場合、401 応答は、それらの資格情報の承認が拒否されたことを示します。 401レスポンスが 以前のレスポンスと同じチャレンジを含み、ユーザエージェントが少なくとも 認証を少なくとも1回試行した場合、そのエンティティには が含まれている可能性があるので、レスポンスで与えられた エンティティを提示すべきである(SHOULD)診断情報。 HTTPアクセス認証は で、「HTTP認証:基本とダイジェストアクセス 認証」[43]で説明しています。

@Chiaraが説明した状況に遭遇するまでは、@ tj-thindと同じコードを使用していました。その後、WWW-AuthenticateContent-Lengthヘッダーをサーバースクリプトに追加しました。getResponseCode()を使用すると、IOExceptionのない正しい401ステータスコードが得られるようになりました。

はあなたの接続二時間に.getResponseCode()を呼び出すことによって応答コードを取得することができ、ほとんどの場合もIOException: "Received authentication challenge is null" (Apache Harmony/Android)

+0

ログで判断してくださいWeiboの問題(私もあまりにも)は、サーバー側を変更することはオプションではありませんが、これは本当に知っておくと便利です、ありがとう! :) –

6

参照してください。

:あなたはこの方法であなたのコードを変更する場合は、応答コードを取得します...

をこれが最初で私のために混乱しましたが、あなたはHttpURLConnectionImplを読めば十分な回数あなたの目は出血を止めると真実が表示されます

try 
    { 
     url = new URL(urlBuilder.toString()); 
     conn = (HttpURLConnection) url.openConnection(); 
     conn.setDoInput(true); 
     conn.setConnectTimeout(TIME_OUT); 
     conn.setRequestMethod(METHOD_GET); 
     conn.setRequestProperty("accept", "*/*"); 
     conn.connect(); 
     int responseCode = conn.getResponseCode(); //throw IOException:Received authentication challenge is null 
     if (responseCode == HTTP_OK) 
     { 
      inStream = conn.getInputStream(); 
      response = getResponse(inStream); 
     } 
     else 
     { 
      response = "response code:"+responseCode; 
     } 
    } catch (Exception e) 
    { 
     // Here you can get the correct response code 
     if (conn != null) { 
      int responseCodeAfterException = conn.getResponseCode(); 
      // Handle according to new response code 
     } 
     // Maybe don't throw e if 401? 
     throw e; 
    } 
    finally 
    { 
     conn.disconnect(); 
    } 
    return response; 
} 

responseCodeAfterExceptionを参照してください。

関連する問題