【问题标题】:How to send Authorization header in Android using Volley library?如何使用 Volley 库在 Android 中发送授权标头?
【发布时间】:2017-10-15 11:04:49
【问题描述】:

如何使用 Android 中的 Volley 库为 GET 方法发送 Authorization 标头?

这是我的请求代码:

JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET, url,
            null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            Log.d("Response", response.toString());
            pd.dismiss();
            
            Toast.makeText(MainActivity.this, "" + response.toString(), Toast.LENGTH_SHORT).show();
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d("Error", "Error: " + error.getMessage());
            Toast.makeText(MainActivity.this, "" + error.getMessage(), Toast.LENGTH_SHORT).show();
            pd.dismiss();

        }
    }) {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            HashMap<String, String> headers = new HashMap<String, String>();
            headers.put("Authorization", "2e96e0a4ff05ba86dc8f778ac49a8dc0");
            return headers;
        }
    };

【问题讨论】:

  • 您已经使用 Map getHeaders() 发送您的授权标头。
  • 你得到什么错误?
  • 我收到了这个错误:com.android.volley.ServerErro

标签: android android-volley


【解决方案1】:

试试下面的代码:

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

【讨论】:

  • public void onErrorResponse(VolleyError error) ----它给出了错误null
  • 您是否将“用户名”和“密码”字符串替换为您的身份验证变量?
  • 同样的 public void onErrorResponse(VolleyError error) ----它给出了错误 nul
【解决方案2】:
StringRequest request = new StringRequest(Request.Method.POST, YourUrl, new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        if (!response.equals(null)) {
            Log.e("Your Array Response", response);                    
        } else {
            Log.e("Your Array Response", "Data Null");
        }
    }

}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        Log.e("error is ", "" + error);
    }
}) {    

 //This is for Headers If You Needed
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> params = new HashMap<String, String>();
        params.put("Content-Type", "application/json; charset=UTF-8");
        params.put("token", ACCESS_TOKEN);
        return params;
    }

 //Pass Your Parameters here
    @Override
    protected Map<String, String> getParams() {
        Map<String, String> params = new HashMap<String, String>();
        params.put("User", UserName);
        params.put("Pass", PassWord);
        return params;
    }
};
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
queue.add(request);

【讨论】:

  • 当我使用 TLS(Https) 加密服务器端并将令牌作为 Authorization Header 发送时,如 ("Authorization: Basic xyzToken"),令牌是否以加密形式传输?
【解决方案3】:

1.尝试使用getBodyContentType()::

     JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET, url,
        null, new Response.Listener<JSONObject>() {

    @Override
    public void onResponse(JSONObject response) {
        Log.d("Response", response.toString());
        pd.dismiss();

        Toast.makeText(MainActivity.this, "" + response.toString(), Toast.LENGTH_SHORT).show();
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        VolleyLog.d("Error", "Error: " + error.getMessage());
        Toast.makeText(MainActivity.this, "" + error.getMessage(), Toast.LENGTH_SHORT).show();
        pd.dismiss();

    }
}) 
{
     @Override
        public String getBodyContentType() {
            return "application/json; charset=utf-8";
        }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        HashMap<String, String> headers = new HashMap<String, String>();
        headers.put("Authorization", "2e96e0a4ff05ba86dc8f778ac49a8dc0");
        return headers;
    }
};

【讨论】:

    【解决方案4】:

    如果 API 需要授权标头,那么使用 Volley 我们需要这样做:

    JsonObjectRequest jsonObejct = new JsonObjectRequest(Request.Method.GET, URL, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
    
                Log.wtf("The Response ",response.toString());
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
    
            }
        }){
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> params = new HashMap<String, String>();
                params.put("Authorization", "XXXX");
                return params;
            }
          };
    

    【讨论】:

      【解决方案5】:

      试试这个代码

       @Override
      public Map<String, String> getHeaders() throws AuthFailureError {
          String credentials = preferenceHelper.getEmail() + ":" + preferenceHelper.getPassword();
          String base64EncodedCredentials = Base64.encodeToString(credentials.getBytes(), Base64.DEFAULT);
          HashMap<String, String> headers = new HashMap<>();
          headers.put("Authorization", "Basic " + base64EncodedCredentials);
          return headers;
      }
      

      【讨论】:

        【解决方案6】:

        这可以通过使用 getHeaders() 来简单地实现;

        @Override
                    public Map<String, String> getHeaders() throws AuthFailureError {
                        Map<String, String> headerMap = new HashMap<String, String>();
                        headerMap.put("Content-Type", "application/json");
                        headerMap.put("Authorization", "Bearer " + ACCESS_TOKEN);
                        return headerMap;
                    }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-03-24
          • 2017-10-29
          • 2015-04-25
          • 2019-07-03
          • 2017-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多