2015-02-24 127 views
4

我开始使用Volley作为我的应用程序,我想为每个请求添加自定义标头作为安全标识符。 我正在使用JsonObjectRequest并覆盖了getHeaders()为Volley库添加自定义标头

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, 
         url, 
         null, 
         new Response.Listener<JSONObject>() { 
          @Override 
          public void onResponse(JSONObject response) { 
           Log.d(TAG, response.toString()); 
          } 
         }, 
         new Response.ErrorListener() { 
          @Override 
          public void onErrorResponse(VolleyError error) { 
           Log.d(TAG, error.toString()); 
          } 
         }) { 
        @Override 
        public Map<String, String> getHeaders() throws AuthFailureError { 
         HashMap<String, String> headers = new HashMap<>(); 
         String mApiKey = "123"; 
         headers.put("APIKEY", mApiKey); 
         return headers; 
        } 

        @Override 
        protected Map<String, String> getParams() throws AuthFailureError { 
         Map<String, String> params = new HashMap<>(); 
         params.put("param1", "1"); 
         params.put("param2", "2"); 
         params.put("param3", "3"); 
         return params; 
        } 
       }; 
       VolleySingleton.getInstance(getActivity()).addToRequestQueue(jsonObjectRequest); 

但我得到这个错误:

E/Volley﹕ [23620] BasicNetwork.performRequest: Unexpected response code 401 for http://... 

AuthFailureError被抛出。

我也尝试使用StringRequest但同样的错误。

如果有人在同一个案中并有解决方案,请提前致谢!

+0

你测试了一个命令行卷曲或者工作邮递员铬插件您的要求标准VolleyRequest覆盖头?你确实得到了回应,这是预期的回应吗?你在期待什么API?您是否尝试拦截您的网络流量(mitm代理)或记录流量,以便您可以查看是否在请求上设置了标头? – 2015-02-24 13:34:18

+0

@ A.S。是的,我尝试了邮差,它的工作原理。更多的时候我尝试使用DefaultHttpClient和HttpGet它也可以。我会尝试拦截我的网络流量,但我怀疑标题未设置。 – Alex 2015-02-24 13:34:58

+0

@ A.S。我不能安装mitm代理,但我很确定标题没有设置为getHeaders() – Alex 2015-02-24 14:12:05

回答

3

这是一个基本的概念,如何在

VolleyRequest networkRequest = new VolleyRequest(request.getHttpMethod(), mUrlBase + request.getUrlSuffix(), responseListener, errorListener) { 
     public String getBodyContentType() { 
      return "application/json; charset=" + getParamsEncoding(); 
     } 

     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError {    
      HashMap<String, String> map = new HashMap<String, String>(); 
      map.put("X-Device-Info","Android FOO BAR"); 

      map.put("Accept-Language", acceptLanguage); 
      map.put("Content-Type", "application/json; charset=UTF-8");   

      return map;    
     } 

     public byte[] getBody() throws AuthFailureError { 

      try { 
       String json = request.toJson().toString(); 
       if (json.length() < 3) 
        return ("{}").getBytes(); 
       // log(json); 
       return json.getBytes(getParamsEncoding()); 
      } catch (UnsupportedEncodingException e) { 
       Log.e(TAG, "getBody(): request has no json"); 
       e.printStackTrace(); 
      } 
      return new byte[0]; 
     } 
    }; 
+1

是的,谢谢。这就是我正在做的,但似乎标题未设置... – Alex 2015-02-24 13:58:11

+1

亚历克斯,我有同样的问题,你有没有得到一个解决方案? – JDOaktown 2016-07-11 18:14:26

+0

感谢你对我的回答工作 – 2017-05-26 10:37:07

0
public class CustomJsonObjectRequest extends JsonObjectRequest 
{ 
    public CustomJsonObjectRequest(int method, String url, JSONObject jsonRequest,Response.Listener listener, Response.ErrorListener errorListener) 
    { 
     super(method, url, jsonRequest, listener, errorListener); 
    } 


@Override 
public Map getHeaders() throws AuthFailureError { 
    Map headers = new HashMap(); 
    headers.put(Constants.accesstoken, Globals.getInstance().getAccessToken()); 
    Logger.debugE(Constants.accesstoken, headers.toString()); 
    return headers; 
    } 

} 
+0

虽然这段代码片段可以解决这个问题,[包括解释](http://meta.stackexchange.com/questions/ 114762/explain-completely-code-based-answers)真的有助于提高你的帖子的质量。请记住,你正在为将来的读者回答这个问题,而这些人可能不知道你的代码建议的原因。尽量不要使用解释性注释来挤占代码,这会降低代码和解释的可读性! – Rizier123 2016-03-07 10:35:22

+0

花点时间阅读[编辑帮助](http://stackoverflow.com/editing帮助)在帮助中心。堆栈溢出的格式与其他站点不同。 – Rizier123 2016-03-07 10:35:30

相关问题