私はかなり長い間 HttpURLConnection を試していて、ここや他の場所に投稿されたいくつかの解決策を試しましたが、何もうまくいかないようです.
私は次のアーキテクチャを持っています:
- Ruby on Rails Web サービス (JSON を使用した REST インターフェイス)
- RestKit を備えた iPhone クライアント
- HttpURLConnection を持つ Android クライアント
iPhone クライアントは魅力的に機能します。RestKit で Web サービスに接続します。
現在、Android クライアントはまったく別の話です。私は常にサーバーから 401 Unauthorized メッセージを受け取ります (その結果、ローカルの FileNotFoundException が発生します)。
奇妙なことに、iPhone クライアントは同じエラーを受け取りますが、RestKit は同じ要求を再度送信することで何らかの形で処理を管理します。もちろん試してみましたが、同じエラーが2回発生します。
Rails のログ出力では、次のようになります。
Started POST "/api/v1/login" for 127.0.0.1 at 2012-05-03 12:44:56 +0200
Processing by Api::V1::ApiController#session_login as JSON
Parameters: {"device"=>{"model"=>"Simulator", "system"=>"Android", "version"=>"Hugo", "name"=>"Android Simulator"}, "email"=>"florian.letz@simpliflow.com", "api"=>{"device"=>{"model"=>"Simulator", "system"=>"Android", "version"=>"Hugo", "name"=>"Android Simulator"}, "email"=>"florian.letz@simpliflow.com", "action"=>"session_login", "controller"=>"api/v1/api"}}
Filter chain halted as :require_login_from_http_basic rendered or redirected
Completed 401 Unauthorized in 0ms (ActiveRecord: 0.0ms)
iPhone クライアントが接続したときにまったく同じメッセージが表示されますが、突然魔法のような 2 番目の要求が発生し、それが通過します。
Android クライアントでは、次のことを行います。
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod(HTTP_POST);
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("Accept-Encoding", "gzip, deflate");
String userpassword = email + ":" + password;
con.setRequestProperty("Authorization", "Basic " + new String(Base64.encodeBase64(userpassword.getBytes())));
String body = jsonLogin.toString();
byte[] body_bytes = body.getBytes();
con.setRequestProperty("Content-Length", "" + Integer.toString(body_bytes.length));
con.setRequestProperty("Content-Language", "en-US");
con.setInstanceFollowRedirects(false);
con.setUseCaches (false);
con.setDoInput(true);
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream (con.getOutputStream ());
wr.write(body_bytes);
wr.flush ();
wr.close ();
InputStream is = con.getInputStream();
そして最後の行で例外が発生します。
リダイレクトについていくつか読んだことがありますが、サーバーにリダイレクトが実装されておらず、クライアントでも受信しません。私はちょうど 401 Unauthorized を取得します。Web サービスと iphone クライアントのコードは、非常に単純なワークフローを示しています。データを送信して、応答を受け取るだけです。iPhone が接続されたときに 2 回目のログイン コールがどこから発信されたのかわかりません。
ここにいる誰かが、何が問題なのか考えていますか?
どうもありがとう!
編集#1:「魔法の」2番目のリクエストを特定しました。RestKit ログには次のように表示されます。
Asked if canAuthenticateAgainstProtectionSpace: with authenticationMethod = NSURLAuthenticationMethodDefault
これにより、2 番目のリクエストで、意味を理解できない大量のヘッダーが生成されます。
Androidでこれを実装する方法を知っていますか?