0

そうです、私はAndroidで基本認証を理解しようとして取り組んでいるので、URLからjsonデータを取得できます。これまでのところ、基本認証は私に多くの問題を引き起こしているようです. 最後に、3 日間の適切な調査の後、同様の手法を使用して xml をプルダウンする例をオンラインで見つけました。これは私が持っているものです:

 String MY_APP_TAG = "basic.authentication";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

    
    String username = "username";
    String host = "www.example.com";
    String password = "password";
    String urlBasePath = "http://www.example.com/api/core/v1/my";
    String urlApiCall_FindAllRepositories = urlBasePath;

    try {
        HttpClient client = new DefaultHttpClient();
        AuthScope as = new AuthScope(host, 80);
        UsernamePasswordCredentials upc = new UsernamePasswordCredentials(
                username, password);

        ((AbstractHttpClient) client).getCredentialsProvider()
                .setCredentials(as, upc);

        BasicHttpContext localContext = new BasicHttpContext();
        BasicScheme basicAuth = new BasicScheme();
        localContext.setAttribute("preemptive-auth", basicAuth);

        HttpHost targetHost = new HttpHost(host, 80, "http");
        HttpGet httpget = new HttpGet(urlApiCall_FindAllRepositories);
        HttpResponse response = client.execute(targetHost, httpget,
                localContext);

        HttpEntity entity = response.getEntity();
        Object content = EntityUtils.toString(entity);
        
     
        
        String decoded_password = new String(Base64.decode(content.toString(), Base64.DEFAULT));
        System.out.println("RESULT: " + decoded_password);

        Log.d(MY_APP_TAG, content.toString());
        System.out.println(content.toString().getBytes().toString());

    } catch (Exception e) {
        e.printStackTrace();
        Log.d(MY_APP_TAG, "Error: " + e);
    }

}
}

コードからわかるように、私は認証を渡し、base 64 を使用して結果をデコードしようとしています。奇妙なことは、これが返されることです:

07-04 21:55:01.726: D/gralloc_goldfish(639): GPU エミュレーションなしのエミュレーターが検出されました。

07-04 21:58:19.256: I/dalvikvm(753): threadid=3: シグナル 3 に反応しています

07-04 21:58:19.297: I/dalvikvm(753): スタック トレースを「/data/anr/traces.txt」に書き込みました

07-04 21:58:19.656: W/DefaultRequestDirector(753): 認証エラー: これらのチャレンジのいずれにも応答できません: {}

07-04 21:58:19.676: I/System.out(753): 結果: �N�7���|�22�</p>

07-04 21:58:19.676: D/basic.authentication(753): ������������1Â0��÷¼ÂÊÒ!

07-04 21:58:19.676: D/basic.authentication(753): &ÄÄʬÄ4L¶£¿²îÎÊ

07-04 21:58:19.676: D/basic.authentication(753): 2Ëzc¦ùN&]]jð@6ÚOçð ��ñIf¸PÄKì^¨yMè¡é(½{ÕjÑ< `J£/C _RÇÝöLÿãããaã÷²� ������

07-04 21:58:19.676: I/System.out(753): [B@412d87a0

07-04 21:58:19.746: I/dalvikvm(753): threadid=3: シグナル 3 に反応しています

07-04 21:58:19.756: I/dalvikvm(753): スタック トレースを「/data/anr/traces.txt」に書き込みました

07-04 21:58:19.946: D/gralloc_goldfish(753): GPU エミュレーションなしのエミュレーターが検出されました。

ご覧のとおり、奇妙なコードが返されますが、認証エラーがあることも示されています。

何が起こっているのかを理解しようとするのを手伝ってくれる人はいますか?

4

2 に答える 2

0

で一度認証を試みたのUsernamePasswordCredentialsですが、なぜかうまくいきませんでした。エラーなどはありませんでしたが、Authorization ヘッダーなしで HTTP 要求が送信されました。

次のように「手動で」設定を終了しました。

request.setHeader(new BasicHeader("Authorization", "Basic " + new String(Base64.encodeBase64((user + ":" + password).getBytes()))));

Base64 の場合、ここからダウンロードした apache commons コーデックを使用しました。

http://commons.apache.org/codec/download_codec.cgi

ヘッダーを表示するには、Fiddler Web デバッガーなどの Web デバッグ ツールを使用できます。ヘッダー付きのリクエストとレスポンスが非常に明確に表示されるため、何が起こっているかがわかります。

于 2012-07-04T22:09:43.530 に答える
0

ここでは 2 つのことが起こっています。メイン スレッドでネットワーク操作を実行していて、Android から ANR (アプリケーションが応答していません) を受け取っています。AsyncTask などを使用するようにアプリを変更します。2 番目のことは、Bae64 デコードはゴミを生成するように見えるため、返されるデータはおそらく期待したものではないということです。生の応答をダンプし、ブラウザーで結果を確認/比較します。

于 2012-07-05T03:15:33.780 に答える