2015-02-24 4 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

Вы проверили ваш запрос с линией завитка команды или почтальона хромированной плагин, если он работает? Вы получаете ответ, так ли это ожидаемый ответ? Что вы ожидаете от API? вы пытались перехватить свой сетевой трафик (mitm proxy) или зарегистрировать трафик, чтобы вы могли видеть, установлен ли заголовок в запросе? –

+0

@ A.S. Да, я пробовал с Postman, и он работает. Больше, когда я пытаюсь использовать DefaultHttpClient и HttpGet, он также работает. Я попытаюсь перехватить мой сетевой трафик, но я подозреваю, что заголовок не установлен. – Alex

+0

@ A.S. Я не могу установить прокси-сервер mitm, но я уверен, что заголовки не заданы с помощью getHeaders() – Alex

ответ

3

Это базовое понятие, как переопределить заголовок в стандартном VolleyRequest

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

+1

Alex, У меня такая же проблема. Вы когда-нибудь получали решение? – JDOaktown

+0

благодарю за ваш ответ за работу –

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/explaining-whole-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. попробуйте не толковать код с пояснительными комментариями, это уменьшает читабельность кода и объяснений! – Rizier123

+0

Найдите минутку, чтобы прочитать [редактирование справки] (http://stackoverflow.com/editing -help) в справочном центре. Форматирование переполнения стека отличается от других сайтов. – Rizier123

Смежные вопросы