如何在Android上使用Volley进行基本身份验证?

Loc*_*ike 20 android android-volley

我正在查看示例和代码,但我没有看到任何实现.这个阶段有可能吗?

And*_*son 82

对于那些不想仅仅为了Android而使用Spring for 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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,您可能必须使用Base64.NO_WRAP而不是Base64.DEFAULT为此工作.正如评论中指出的那样.

API 8+

  • 值得注意的是,我需要使用Base64.NO_WRAP而不是Base64.DEFAULT才能使这对我有用. (8认同)
  • 是的,您必须使用NO_WRAP,否则换行符可能会将编码的字符串拆分为两行,而HTTP标头则不允许这样做.换行符始终表示新的标题行.base64字符串的第二行不是导致此异常的有效标题行. (5认同)
  • 这非常好,因为APK的最终大小对于小项目非常重要. (3认同)

ale*_*lex 9

是的,这是可能的.您需要覆盖Request.getHeaders().我很懒,我使用Spring for Android的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();
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我如何构建auth标头

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 我发现了这个https://github.com/njzk2/VolleyTwitter/blob/master/src/com/njzk2/twitterbrowser/TokenRequest.java (2认同)