Volley Talebinde özel başlık nasıl ayarlanır


104

Volley isteği için özel başlıklar nasıl ayarlanabilir? Şu anda, bir POST isteği için gövde içeriğini ayarlamanın bir yolu var. Basit bir GET isteğim var, ancak özel başlıkları da iletmem gerekiyor. JsonRequest sınıfının bunu nasıl desteklediğini anlamıyorum. Bütün bunlar mümkün mü?


lütfen kabul edilen cevabı değiştirin, şu anda kabul edilen cevap yanlış.
Esteban

Yanıtlar:


119

Eğer geçersiz gibi görünüyor public Map<String, String> getHeaders(), tanımlananRequest , senin arzu HTTP başlıkları dönmek için.


4
@ JuanJoséMeleroGómez bağlantı koptu. 404 Bulunamadı
Milon

İşte başka bir örnek (sayfanın sonundaki pasaj): developer.android.com/training/volley/request-custom.html . Yapıcıda GsonRequestilettiğiniz başlık parametreleriyle getHeaders()bir Map döndürmek için sınıf geçersiz kılma yöntemi .
Juan José Melero Gómez

158

GetParams () ile kabul edilen yanıt POST gövde verilerini ayarlamak içindir, ancak başlıktaki soru User-Agent gibi HTTP başlıklarının nasıl ayarlanacağını sordu. CommonsWare'in dediği gibi, getHeaders () 'ı geçersiz kılarsınız. Kullanıcı-Aracıyı 'Nintendo Gameboy' ve Kabul-Dili 'fr' olarak ayarlayan bazı örnek kodlar:

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);

}

Bu cevap JSONObjectRequest için de işe yarayacak mı? JSONObjectRequest postRequest = new JSONObjectRequest ...... çünkü bunu yapıyorum ve getHeaders () işlevim çağrılmıyor ... ??? Anonim bir sınıf oluşturduğunuzu ve yöntemleri geçersiz kıldığınızı anlıyorum. StringRequest yerine yalnızca w / JSONObjectRequest yapıyorum ve getHeaders () işlevim çağrılmıyor.
JDOaktown

GetHeaders () yöntemine de "Çerez" ekleyebilir miyiz? Gönderi talepleri için de işe yarayacak mı?
Arnab Banerjee

Geri kalan POST verilerini nereye göndereceğim?
Fernando Torres

30

İhtiyacınız olan şey bilgiyi url'ye eklemek yerine veri göndermekse.

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;
}

Yapmak istediğiniz, istekteki başlıkları düzenlemekse, yapmak istediğiniz şey budur:

// 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;
  }
}

44
Sorunun sorulduğu şey bu olmadığı için olumsuz oy verdim. Bu, POST içeriğini ayarlamak içindir, User-Agent gibi özel HTTP üstbilgilerini ayarlamak için değildir. Zh. Atanasov ve CommonsWare getHeaderscevaplarında haklı .
georgiecasey

4
Bu yanıta olumsuz oy verdim çünkü kullanıcının sorduğu bu değil.
Dharmendra Pratap Singh

1
Bu, başlıkları değil içerik parametrelerini eklemek içindir, kusura bakmayın, olumsuz oy verdik. Gerçekten kabul edilen cevap olmamalı
Juan Cortés

1
Lütfen soruma bir bakar mısınız? Buna benzer ama doğru yapamadım stackoverflow.com/a/37948318
X09

18

Bu çözümü görebilirsiniz . Çerezlerin nasıl alınacağını / ayarlanacağını gösterir, ancak çerezler istek / yanıttaki başlıklardan yalnızca biridir. Volley'in * İstek sınıflarından birini geçersiz kılmalı ve gerekli başlıklarıgetHeaders()


İşte bağlantılı kaynak:

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;
}

}

Ve Uygulamam sınıfı:

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());
        }
    }

}

7

Kotlin'de,

GetHeaders () yöntemini şu şekilde geçersiz kılmalısınız :

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
            }
        }

1
Bu, Kotlin'deki üstbilgileri geçersiz kılmak için bulabildiğim tek kaynak. Teşekkür ederim!
Mathew Sonke

@MathewSonke Seni kardeşim gibi hissediyorum. Btw, Android'de ağ iletişimi için Retrofit'i deneyin.
devDeejay

6

Bu soruna da çözüm aranıyor. burada bir şey görün: http://developer.android.com/training/volley/request.html

ImageLoader yerine doğrudan ImageRequest kullanmak iyi bir fikir mi? Görünüşe göre ImageLoader bunu dahili olarak kullanıyor. ImageLoader'ın önbellek desteğinden başka önemli bir şeyi gözden kaçırıyor mu?

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);

Basitçe '-1' vermek yerine, sorunun neden yanlış olduğunu veya sorulan çözümün sorunlu olduğunu düşündüğünüzü söylerseniz çok takdir edilecek ve daha faydalı olacaktır.
lannyf

1
Harita soyuttur. HashMap olmalı
superuserdo

4

bunu dene

{
    @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;
       }
};

4

StringRequest'i genişleten ve içindeki getHeaders () yöntemini şu şekilde geçersiz kılan özel bir Request sınıfı oluşturabilirsiniz:

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;
    }
}

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;
}

}

1

Ek olarak şu konu ile ilgili bulduğum bir şeyi paylaşmak istiyorum Content-Type:

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

Eklemek zorunda kaldım:

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

Bana nedenini sorma, sadece Content-Typeseti doğru yapamayan diğerlerine yardımcı olabileceğini düşündüm .


0

Github örneğinden başlıkları ayarlama:

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);

0

bunu dene

 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);
}

@Override public Map <String, String> getHeaders () AuthFailureError atar {dönüş başlıkları; }};
Usame Ibrahim

başlık nerede?
Usame Ibrahim

Signutare'de Map <String, String> başlıkları ile aradığınızda ayarlayabilirsiniz
Yiğit Yüksel

0

Bu benim kodum, unutma = nesne: koymazsan işe yaramaz

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.