Come impostare l’intestazione personalizzata in Volley Richiesta

Come intestazioni personalizzate per una Volley richiesta? Al momento, non c’è modo di impostare il contenuto del corpo per una richiesta POST. Ho una semplice richiesta, ma ho bisogno di passare le intestazioni personalizzate alongwith. Non vedo come JsonRequest classe supporta. E ‘ possibile a tutti?

  • si prega di modificare il accettato la risposta, quello attualmente accettato è corretto.
InformationsquelleAutor bianca | 2013-06-11

 

13 Replies
  1. 138

    Accettato di rispondere con getParams() è per l’impostazione dei dati del corpo del POST, ma la domanda nel titolo è stato chiesto come impostare intestazioni HTTP come User-Agent. Come CommonsWare detto, si esegue l’override di getHeaders(). Ecco un esempio di codice che imposta l’Utente-Agente ‘Nintendo Gameboy” e Accettare il Linguaggio per ‘fr’:

    public void requestWithSomeHttpHeaders() {
        RequestQueue queue = Volley.newRequestQueue(this);
        String url = "http://www.somewebsite.com";
        StringRequest getRequest = new StringRequest(Request.Method.GET, url, 
            new Response.Listener<String>() 
            {
                @Override
                public void onResponse(String response) {
                    //response
                    Log.d("Response", response);
                }
            }, 
            new Response.ErrorListener() 
            {
                @Override
                public void onErrorResponse(VolleyError error) {
                    //TODO Auto-generated method stub
                    Log.d("ERROR","error => "+error.toString());
                }
            }
        ) {     
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError { 
                    Map<String, String>  params = new HashMap<String, String>();  
                    params.put("User-Agent", "Nintendo Gameboy");  
                    params.put("Accept-Language", "fr");
    
                    return params;  
            }
        };
        queue.add(getRequest);
    
    }
    • Sarà questa la risposta di lavoro per JSONObjectRequest troppo? JSONObjectRequest postRequest = new JSONObjectRequest…… perché sto facendo questo e il mio getHeaders() non viene chiamato…??? Capisco che si sta creando una classe anonima e l’override dei metodi. Sto facendo solo w/ JSONObjectRequest invece di StringRequest e il mio getHeaders() non viene chiamato.
  2. 29

    Se ciò di cui avete bisogno è quello di inviare i dati, invece di aggiungere le informazioni nel url.

    public Request post(String url, String username, String password, 
          Listener listener, ErrorListener errorListener) {
      JSONObject params = new JSONObject();
      params.put("user", username);
      params.put("pass", password);
      Request req = new Request(
         Method.POST,
         url,
         params.toString(),
         listener,
         errorListener
      );
    
      return req;
    }

    Se quello che vuoi fare è modificare le intestazioni della richiesta, questo è quello che vuoi fare:

    //could be any class that implements Map
    Map<String, String> mHeaders = new ArrayMap<String, String>();
    mHeaders.put("user", USER);
    mHeaders.put("pass", PASSWORD);
    Request req = new Request(url, postBody, listener, errorListener) {
      public Map<String, String> getHeaders() {
        return mHeaders;
      }
    }
    • Ho downvoted come questo non è ciò che la domanda a tutti. Questo è per l’impostazione del contenuto del POST, non per l’impostazione personalizzata intestazioni HTTP come User-Agent. Zh. Atanasov e CommonsWare sono corretto con loro getHeaders risposte.
    • Ho downvoted questa risposta perché questo non è ciò che l’utente ha richiesto.
    • downvoted così, questo è fuorviante
    • Questo è per l’aggiunta di contenuti params non intestazioni, mi dispiace downvoted troppo. Davvero non dovrebbe essere accettato risposta
    • getHeaders ha funzionato per me
    • Per favore puoi dare un’occhiata alla mia domanda? È simile a questo, ma non riuscivo a farlo bene stackoverflow.com/a/37948318

  3. 17

    Si può vedere questo soluzione. Essa mostra come ottenere/impostare i cookie, i cookie, ma sono solo una delle intestazioni di richiesta/risposta. È necessario sostituire uno del Volley *Richiesta di classi e impostare le intestazioni in getHeaders()


    Ecco il link fonte:

    public class StringRequest extends com.android.volley.toolbox.StringRequest {
    
    private final Map<String, String> _params;
    
    /**
     * @param method
     * @param url
     * @param params
     *            A {@link HashMap} to post with the request. Null is allowed
     *            and indicates no parameters will be posted along with request.
     * @param listener
     * @param errorListener
     */
    public StringRequest(int method, String url, Map<String, String> params, Listener<String> listener,
            ErrorListener errorListener) {
        super(method, url, listener, errorListener);
    
        _params = params;
    }
    
    @Override
    protected Map<String, String> getParams() {
        return _params;
    }
    
    /* (non-Javadoc)
     * @see com.android.volley.toolbox.StringRequest#parseNetworkResponse(com.android.volley.NetworkResponse)
     */
    @Override
    protected Response<String> parseNetworkResponse(NetworkResponse response) {
        //since we don't know which of the two underlying network vehicles
        //will Volley use, we have to handle and store session cookies manually
        MyApp.get().checkSessionCookie(response.headers);
    
        return super.parseNetworkResponse(response);
    }
    
    /* (non-Javadoc)
     * @see com.android.volley.Request#getHeaders()
     */
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> headers = super.getHeaders();
    
        if (headers == null
                || headers.equals(Collections.emptyMap())) {
            headers = new HashMap<String, String>();
        }
    
        MyApp.get().addSessionCookie(headers);
    
        return headers;
    }

    }

    E MyApp classe:

    public class MyApp extends Application {
        private static final String SET_COOKIE_KEY = "Set-Cookie";
        private static final String COOKIE_KEY = "Cookie";
        private static final String SESSION_COOKIE = "sessionid";
    
        private static MyApp _instance;
        private RequestQueue _requestQueue;
        private SharedPreferences _preferences;
    
        public static MyApp get() {
            return _instance;
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
            _instance = this;
                _preferences = PreferenceManager.getDefaultSharedPreferences(this);
            _requestQueue = Volley.newRequestQueue(this);
        }
    
        public RequestQueue getRequestQueue() {
            return _requestQueue;
        }
    
    
        /**
         * Checks the response headers for session cookie and saves it
         * if it finds it.
         * @param headers Response Headers.
         */
        public final void checkSessionCookie(Map<String, String> headers) {
            if (headers.containsKey(SET_COOKIE_KEY)
                    && headers.get(SET_COOKIE_KEY).startsWith(SESSION_COOKIE)) {
                    String cookie = headers.get(SET_COOKIE_KEY);
                    if (cookie.length() > 0) {
                        String[] splitCookie = cookie.split(";");
                        String[] splitSessionId = splitCookie[0].split("=");
                        cookie = splitSessionId[1];
                        Editor prefEditor = _preferences.edit();
                        prefEditor.putString(SESSION_COOKIE, cookie);
                        prefEditor.commit();
                    }
                }
        }
    
        /**
         * Adds session cookie to headers if exists.
         * @param headers
         */
        public final void addSessionCookie(Map<String, String> headers) {
            String sessionId = _preferences.getString(SESSION_COOKIE, "");
            if (sessionId.length() > 0) {
                StringBuilder builder = new StringBuilder();
                builder.append(SESSION_COOKIE);
                builder.append("=");
                builder.append(sessionId);
                if (headers.containsKey(COOKIE_KEY)) {
                    builder.append("; ");
                    builder.append(headers.get(COOKIE_KEY));
                }
                headers.put(COOKIE_KEY, builder.toString());
            }
        }
    
    }
    • grazie per l’esempio
  4. 4

    Cercando una soluzione a questo problema.
    vedere qualcosa qui: http://developer.android.com/training/volley/request.html

    è una buona idea di utilizzare direttamente ImageRequest invece di ImageLoader? Sembra ImageLoader utilizza internamente in ogni caso. Non perdere nulla di importante, diverso ImageLoader cache del supporto?

    ImageView mImageView;
    String url = "http://i.imgur.com/7spzG.png";
    mImageView = (ImageView) findViewById(R.id.myImage);
    ...
    
    //Retrieves an image specified by the URL, displays it in the UI.
    mRequestQueue = Volley.newRequestQueue(context);;
    ImageRequest request = new ImageRequest(url,
      new Response.Listener() {
          @Override
          public void onResponse(Bitmap bitmap) {
              mImageView.setImageBitmap(bitmap);
          }
      }, 0, 0, null,
      new Response.ErrorListener() {
          public void onErrorResponse(VolleyError error) {
              mImageView.setImageResource(R.drawable.image_load_error);
          }
      })   {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> params = new Map<String, String>();
            params.put("User-Agent", "one");
            params.put("header22", "two");
    
            return params;
        };
    mRequestQueue.add(request);
    • Sarebbe molto gradita e utile, se è in grado di indicare il motivo pensi che la domanda è sbagliata o la soluzione chiesto ha il problema, invece di semplicemente dare un ‘-1’.
    • La mappa è una cosa astratta. Dovrebbe essere HashMap
  5. 4

    Si può fare una Richiesta personalizzata di classe che estende la StringRequest e ignorare il getHeaders() metodo al suo interno, come questo:

    public class CustomVolleyRequest extends StringRequest {
    
        public CustomVolleyRequest(int method, String url,
                               Response.Listener<String> listener,
                               Response.ErrorListener errorListener) {
            super(method, url, listener, errorListener);
        }
    
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> headers = new HashMap<>();
            headers.put("key1","value1");
            headers.put("key2","value2");
            return headers;
        }
    }
  6. 3

    provare questo

    {
        @Override
           public Map<String, String> getHeaders() throws AuthFailureError {
               String bearer = "Bearer ".concat(token);
                Map<String, String> headersSys = super.getHeaders();
                Map<String, String> headers = new HashMap<String, String>();
                headersSys.remove("Authorization");
                headers.put("Authorization", bearer);
                headers.putAll(headersSys);
                return headers;
           }
    };
  7. 3

    In Kotlin,

    È necessario sostituire getHeaders() metodo come :

    val volleyEnrollRequest = object : JsonObjectRequest(GET_POST_PARAM, TARGET_URL, PAYLOAD_BODY_IF_YOU_WISH,
                Response.Listener {
                    //Success Part  
                },
    
                Response.ErrorListener {
                    //Failure Part
                }
            ) {
                //Providing Request Headers
    
                override fun getHeaders(): Map<String, String> {
                   //Create HashMap of your Headers as the example provided below
    
                    val headers = HashMap<String, String>()
                    headers["Content-Type"] = "application/json"
                    headers["app_id"] = APP_ID
                    headers["app_key"] = API_KEY
    
                    return headers
                }
            }
  8. 1
    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("AppId", "xyz");
    
        return headers;
    }
    
    }
  9. 1

    Come aggiunta mi piacerebbe condividere qualcosa che ho trovato per quanto riguarda il Content-Type:
    Sulla cima di

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
    Map<String, String> params = new HashMap<String, String>();
    .
    .
    .
    return params;
    }

    Ho dovuto aggiungere:

    @Override
    public String getBodyContentType() {
    return /*(for exmaple)*/ "application/json";
    }

    Non mi chiedete il perchè, ho solo pensato che potrebbe aiutare alcuni altri che non possono ottenere il Content-Type impostato in modo corretto.

  10. 0

    Qui è la creazione di intestazioni da github esempio:

    StringRequest myReq = new StringRequest(Method.POST,
                           "http://ave.bolyartech.com/params.php",
                            createMyReqSuccessListener(),
                            createMyReqErrorListener()) {
    
     protected Map<String, String> getParams() throws 
             com.android.volley.AuthFailureError {
                            Map<String, String> params = new HashMap<String, String>();
                            params.put("param1", num1);
                            params.put("param2", num2);
                            return params;
                        };
                    };
                    queue.add(myReq);
  11. 0

    provare questo

     public void VolleyPostReqWithResponseListenerwithHeaders(String URL,final Map<String, String> params,final Map<String, String> headers,Response.Listener<String> responseListener) {
    
    
        String url = URL;
    
        Log.i("url:", ":" + url);
        StringRequest mStringRequest = new StringRequest(Request.Method.POST,
                url, responseListener, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                //error
    
    
                //Log.d("Error.Response", error.getLocalizedMessage());
            }
        }){
            @Override
            protected Map<String, String> getParams() {
                return params;
            }
    
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                return headers;
            }
        };
    
    
    
        mStringRequest.setRetryPolicy(new DefaultRetryPolicy(
                60000,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    
        mStringRequest.setShouldCache(true);
    
    
    
        // dialog.show();
        SingletonRequestQueue.getInstance(context).addToRequestQueue(mStringRequest);
    }
    • Mappa pubblica<String, String> getHeaders() throws AuthFailureError { return intestazioni; } };
    • wheres l’intestazione ??
    • Su signutare, è possibile impostare quando si chiama con Mappa<String, String> intestazioni
  12. 0

    Che è il mio codice, non dimenticate = oggetto: se non mettete non funziona

    val queue = Volley.newRequestQueue(this)
            val url = "http://35.237.133.137:8080/lamarrullaWS/rest/lamarrullaAPI"
            //Request a string response from the provided URL.
            val jsonObjectRequest = object: JsonObjectRequest(Request.Method.GET, url, null,
                    Response.Listener { response ->
                        txtPrueba.text = "Response: %s".format(response.toString())
                    },
                    Response.ErrorListener { txtPrueba.text = "That didn't work!" }
            )
            {
                @Throws(AuthFailureError::class)
                override fun getHeaders(): Map<String, String> {
                    val headers = HashMap<String, String>()
                    headers.put("Content-Type", "application/json")
                    return headers
                }
            }
            queue.add(jsonObjectRequest)

Lascia un commento