2013-05-29 66 views

回答

9

是的,这是可能的。您需要重写Request.getHeaders()。我很懒,我使用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(); 
    } 
} 

这里是我如何建立权威性头

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

谢谢你的回复。然而,这看起来像是一个非常常见的/基本的功能,我认为像volley这样的图书馆应该以一种更简单的方式实现它。我正在尝试这个库,它看起来很有前途(对一个好的缓存HTTP库真的很兴奋),但是我发现某些部分没什么意义:像我想要的解析部分(json,xml)。 ..)成为Listener的一部分,而不是Request,这样我就可以创建自己的基本请求,它会一直添加这些头文件。也许它应该是RequestQueue,它有一些默认选项(标题)...有一些想法。 – LocoMike

+0

我不确定这是你想要做什么,但是你可以用getHeaders()方法来创建类似https://gist.github.com/alexmazza/5659606的东西。我在那里使用杰克逊,但你可以使用Gson或其他任何东西,然后总是使用该类作为你的认证请求的基类 – alex

+0

是的,但如果我想获得一些JSON数据,以及后来的一些XML数据,我将不得不复制逻辑,或创建一个基类,它具有标题代码,然后我将不得不创建2个子类,并且我将无法使用默认的JsonRequest等等。对我来说,它看起来像响应和请求应该在不同的类(解析应该属于听众),以便你可以混合起来。继承问题! ;)无论如何感谢您的答复。 – LocoMike

71

对于那些不想使用Spring的Android只是针对谁,这里是如何做到这一点。

@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; 
} 

请注意,您可能需要使用Base64.NO_WRAP,而不是Base64.DEFAULT这个工作。正如评论中指出的那样。

API 8+

+1

这真的很不错,因为APK的最终大小对于小型项目非常重要。 – slott

+7

值得注意的是我需要使用Base64.NO_WRAP而不是Base64.DEFAULT才能为我工作。 – 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); 
相关问题