Android経由でGETを送信しようとしていますHttpURLConnection
(インポート元org.Apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection
)、応答を受信すると、IOExceptionがスローされます。
doRequestInternal()の場合:「受信した認証チャレンジはnullです」
このエラーはどういう意味ですか、そしてこれを引き起こしているのは何ですか?私はOAuthパラメーターをAuthorizationヘッダーに書き込んでいますが、他の場合にも問題なくこれを行っています。
if (connection == null) {
connection = (HttpURLConnection) new URL(endpointUrl).openConnection();
connection.setRequestMethod("GET");
}
//... do some OAuth message signing
connection.connect();
int statusCode = connection.getResponseCode(); // throws IOException
その理由がわかりました。
まず第一に、このエラーが何を意味するのかを知らないすべての人に(私は確かにそうではありませんでした):サーバーが401で応答した場合、この例外がスローされます。getResponseCode()でスローされたことを考えると、非常に直感的です(iow自分で401をチェックすることはできませんが、代わりにこのIOExceptionをキャッチする必要があります...)。
401の実際の原因は、この時点で予期されていた場所にOAuth検証コードを送信しなかったことです。
多分誰かのために役立つでしょう...
この例外は、不正な形式の回答ヘッダーを意味します。「WWW-Authenticate」ヘッダーが見つかりませんでした。また、401コードのチャンク回答はサポートされていないため、「Content-Length」ヘッダーが必要になります(ゼロにすることができます)。
このヘッダーをリクエストに追加するだけです(サーバー側):
WWW-Authenticate: None
HTTP認証 と トークンベースの認証 の2つの認証アプローチがあることに注意してください。 HTTP認証を使用している場合は、参照されている仕様に従う必要があります。サーバー側でWWW-Authenticateヘッダーフィールドを含め、ローカルで_Java.net.Authenticator
_を使用します。など。トークンベースの認証を使用している場合は、明らかにCookieを使用してトークンを保存し、長期間有効なセッションを維持できるようにする必要があります。そのような場合は、次のコードをAndroid.app.Application.onCreate()
に入れてください
_CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);
_
また、WWW-AuthenticateヘッダーフィールドがないサーバーからHTTP401を受信するときに問題が発生することはありません。