【问题标题】:Send authentication information with Volley request使用 Volley 请求发送身份验证信息
【发布时间】:2016-03-22 11:28:11
【问题描述】:

在我的 Android 应用程序中,我必须调用一个看起来像这样的网络服务

http://mywesite.com/demo/mob/getmenubycategory/1

我正在使用 volley 发送请求,但结果是 VolleyError 401。 我已经重写了getParams() 方法来添加标题,但是它不起作用。

这是我的代码。

RequestQueue requestQueue = volleySingleton.getRequestQueue();
    requestQueue.add(new JsonObjectRequest(Request.Method.GET, url, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            Log.e(TAG, "onResponse = \n " + response.toString());
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e(TAG, "response error \n" + error.networkResponse.statusCode);
        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            try {
                Map<String, String> map = new HashMap<String, String>();
                String key = "Authorization";
                String encodedString = Base64.encodeToString(String.format("%s:%s", "USERNAME", "Password").getBytes(), Base64.NO_WRAP);
                String value = String.format("Basic %s", encodedString);
                map.put(key, value);
                return map;
            } catch (Exception e) {
                Log.e(TAG, "Authentication Filure" );
            }
            return super.getParams();
        }
    });

当我使用浏览器时,它会显示一个对话框来输入我的用户名和密码。如何使用 Volley 将用户名和密码与请求一起发送。

【问题讨论】:

  • 你有错误日志吗?
  • 不,它只是在onErrorResponse(VolleyError error)中记录401
  • 您是否尝试打印error
  • 是的,我试过但没用。只获取状态码

标签: android authentication android-volley basic-authentication


【解决方案1】:

对于身份验证,恕我直言,您应该覆盖 getHeaders 而不是 getParams,请尝试以下操作:

@Override
public Map<String, String> getHeaders() throws AuthFailureError {
       Map<String, String> headers = new HashMap<>();                
       String credentials = "username:password";
       String auth = "Basic "
                        + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);
       headers.put("Content-Type", "application/json");
       headers.put("Authorization", auth);
       return headers;
}

希望对你有帮助!

【讨论】:

  • 谢谢!使用getHeaders() 而不是getParams() 解决了我的问题。
  • 所以这意味着创建你自己的请求扩展?你如何传递用户名:密码数据以及令牌去哪里?
  • @G_V 问题是关于基本身份验证的,正如您在我的示例代码String credentials = "username:password"; 中看到的那样,关于令牌,您是指发送到 Web 服务的访问令牌吗?如果是,它也在getHeaders();
  • @BNK 我对做任何安全事情都是全新的,但这意味着存储用户名和密码,将它们放在标题中,发送它们,获取令牌,然后清除用户/传递以支持存储那么令牌呢?
【解决方案2】:

只需覆盖此方法

 @Override
        public Map<String, String> getHeaders() {
            String username ="danish@gmail.com";
            String password = "dani3173";
            String auth =new String(username + ":" + password);
            byte[] data = auth.getBytes();
            String base64 = Base64.encodeToString(data, Base64.NO_WRAP);
            HashMap<String, String> headers = new HashMap<String, String>();
            headers.put("Authorization",base64);
            headers.put("accept-language","EN");
            headers.put("Content-type","application/json");
            headers.put("Accept","application/json");
            return headers;
        }

【讨论】:

    【解决方案3】:

    使用我在下面使用的 CustomVolleyRequest

    public class CustomVollyRequest extends Request<JSONObject> {
        private Listener<JSONObject> listener;
        private Map<String, String> params;
    
        public CustomVollyRequest(String url, Map<String, String> params, 
                Listener<JSONObject> reponseListener, 
                ErrorListener errorListener) {
            super(Method.GET, url, errorListener);
            this.listener = reponseListener;
            this.params = params;
        }
    
        public CustomVollyRequest(int method, String url, Map<String, String> params, 
                Listener<JSONObject> reponseListener, 
                ErrorListener errorListener) {
            super(method, url, errorListener);
            this.listener = reponseListener;
            this.params = params;
        }
    
        @Override
        protected Map<String, String> getParams() throws com.android.volley.AuthFailureError {
            return params;
        }
    
        @Override
        protected void deliverResponse(JSONObject response) {
            listener.onResponse(response);
        }
    
        @Override
        protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
            try {
                String jsonString = new String(response.data,     HttpHeaderParser.parseCharset(response.headers));
                return Response.success(new JSONObject(jsonString),
                    HttpHeaderParser.parseCacheHeaders(response));
            } catch (UnsupportedEncodingException e) {
                return Response.error(new ParseError(e));
            } catch (JSONException je) {
                return Response.error(new ParseError(je));
        }
    }
    

    使用上面的类如下

    Map<String, String> params = new HashMap<>();
    params.put("key",value);//put your parameters here
    CustomVollyRequest jsObjRequest = new CustomVollyRequest(
            Request.Method.POST, url, params,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    //Log.d("Response: ", response.toString());
                }
            }, 
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError response)
                {
                    Log.d("Response: Error", response.toString());
                }
            }
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      • 2013-11-26
      相关资源
      最近更新 更多