2

私はかなり長い間 HttpURLConnection を試していて、ここや他の場所に投稿されたいくつかの解決策を試しましたが、何もうまくいかないようです.

私は次のアーキテクチャを持っています:

  1. Ruby on Rails Web サービス (JSON を使用した REST インターフェイス)
  2. RestKit を備えた iPhone クライアント
  3. 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でこれを実装する方法を知っていますか?

4

0 に答える 0