2013-05-29 18 views

答えて

9

はい、可能です。 Request.getHeaders()をオーバーライドする必要があります。私は怠惰だし、Android用のSpringからHttpHeadersとHttpAuthenticationを使用しましたが、authヘッダーを作成してメソッドから返すことができます。 getHeaders()から基本認証のauthヘッダーを返すことができます。これは、基本認証のサンプルリクエストです。

public class GetUser extends Request<User> { 

    private static final String TAG = GetUser.class.getName(); 

    private Response.Listener<User> mListener; 
    private ObjectMapper mMapper = new ObjectMapper(); 

    public GetUser(Response.ErrorListener errorListener, Response.Listener<User> listener){ 
     super(Method.GET, PoisUtils.BASE_URL + "/users", errorListener); 

     mListener = listener; 
    } 

    @Override 
    protected Response<User> parseNetworkResponse(NetworkResponse response) { 
     String jsonString = new String(response.data); 
     try { 
      User result = mMapper.readValue(jsonString, User.class); 
      return Response.success(result, getCacheEntry()); 
     } catch (IOException e) { 
      Log.d(TAG, e.getMessage()); 
     } 
     return null; 
    } 

    @Override 
    protected void deliverResponse(User response) { 
     mListener.onResponse(response); 
    } 

    @Override 
    public Map<String, String> getHeaders() throws AuthFailureError { 
     return AuthUtils.buildAuthHeaders().toSingleValueMap(); 
    } 
} 

そして、ここで私は、認証ヘッダにちょうどそのためのAndroidのための春を使用したくない人のために

public static HttpHeaders buildAuthHeaders(){ 

    if(UserUtils.isUserLogged()){ 
     HttpHeaders requestHeaders = new HttpHeaders(); 
     User user = PoisApplication.get().getUser(); 

     HttpAuthentication auth = new HttpBasicAuthentication(
       user.getUsername(), user.getPassword()); 
     requestHeaders.setAuthorization(auth); 

     return requestHeaders; 
    } 
    return null; 
} 
+0

は、返信いただきありがとうございます。しかし、これは非常に一般的な/基本的な機能のように見えます。私は、ボレーのような図書館はこれを何らかの方法で簡単に実装するべきだと思います。私はこのライブラリを試していますが、これは有望です(HTTPライブラリのキャッシングについては本当に興奮しています)が、あまり意味を持たない特定の部分を見つけています。 ..)はリスナーの一部であり、リクエストではないので、私は自分のベースリクエストを作成してこれらのヘッダーを常に追加することができます。たぶん、いくつかのデフォルトオプション(ヘッダー)を持っているRequestQueueでなければなりません。いくつかのアイデア。 – LocoMike

+0

私はそれがあなたがしたいことではないのか分かりませんが、getHeaders()メソッドを実装したhttps://gist.github.com/alexmazza/5659606のようなものを作成することができます。私はそこでjacksonを使用していますが、Gsonやその他のものを使用して、そのクラスを認証済みリクエストの基本クラスとして使用することができます。 – alex

+0

ええ、JSONデータを取得したい場合は、ロジックを複製するか、ヘッダーコードを持つ基本クラスを作成し、2つのサブクラスを作成する必要があり、デフォルトのJsonRequestなどを使用することはできません。レスポンスのように見え、リクエストは異なるクラスにある必要があります(解析はListenerに属している必要があります)。継承の問題! ;)とにかく返事をありがとう。 – LocoMike

71

を構築する方法で、ここでそれを行う方法です。あなたが動作するように、このためにBase64.NO_WRAPの代わりBase64.DEFAULTを使用する必要があり

@Override 
public Map<String, String> getHeaders() throws AuthFailureError { 
    HashMap<String, String> params = new HashMap<String, String>(); 
    String creds = String.format("%s:%s","USERNAME","PASSWORD"); 
    String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.DEFAULT); 
    params.put("Authorization", auth); 
    return params; 
} 

注意。コメントで指摘されている通り。

API 8+

+1

APKの最終的なサイズは小規模なプロジェクトにとって非常に重要なので、これは本当に良いことです。 – slott

+7

Base64.DEFAULTの代わりにBase64.NO_WRAPを使用する必要があることに注意してください。 – Logiraptor

+0

@Logiraptorあなたのご意見はAndrpiod 2.3デバイスで400エラーを修正するのに役立ちました。問題の原因は何でしょうか? – dimetil

0

(イカのような)プロキシ認証のために、このヘッダを使用します。

String credentials = proxyUsername + ":" + proxyPassword; 
String auth = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);     
headers.put("Proxy-Authorization", auth); 
関連する問題