Cara mengatur tajuk khusus di Permintaan Volley

104

Bagaimana cara mengatur tajuk khusus untuk permintaan Volley? Saat ini, ada cara untuk menyetel konten tubuh untuk permintaan POST. Saya memiliki permintaan GET sederhana, tetapi saya harus meneruskan header khusus. Saya tidak melihat bagaimana kelas JsonRequest mendukungnya. Apakah mungkin sama sekali?

bianca
sumber
tolong ubah jawaban yang diterima, yang saat ini diterima salah.
Esteban

Jawaban:

119

Sepertinya Anda mengganti public Map<String, String> getHeaders(), didefinisikan dalamRequest , untuk mengembalikan header HTTP yang Anda inginkan.

CommonsWare
sumber
4
@ JuanJoséMeleroGómez tautannya rusak. 404 Tidak ditemukan
Milon
Berikut contoh lain (cuplikan di akhir halaman): developer.android.com/training/volley/request-custom.html . Class GsonRequestoverrides method getHeaders()untuk mengembalikan Map dengan parameter header yang Anda berikan di konstruktor.
Juan José Melero Gómez
157

Jawaban yang diterima dengan getParams () adalah untuk menyetel data tubuh POST, tetapi pertanyaan dalam judul menanyakan cara menyetel header HTTP seperti User-Agent. Seperti yang dikatakan CommonsWare, Anda mengganti getHeaders (). Berikut beberapa contoh kode yang menetapkan User-Agent menjadi 'Nintendo Gameboy' dan Accept-Language menjadi '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);

}
georgiecasey
sumber
Apakah jawaban ini juga akan berfungsi untuk JSONObjectRequest? JSONObjectRequest postRequest = new JSONObjectRequest ...... karena saya melakukan ini dan getHeaders () saya tidak dipanggil ... ??? Saya memahami bahwa Anda membuat kelas anonim dan menimpa metode. Saya hanya melakukan itu hanya w / JSONObjectRequest daripada StringRequest dan getHeaders () saya tidak dipanggil.
JDOaktown
Bisakah kita menambahkan "Cookie" di metode getHeaders () juga? Akankah ini berfungsi untuk permintaan posting juga?
Arnab Banerjee
Ke mana saya akan mengirim data POST lainnya?
Fernando Torres
30

Jika yang Anda butuhkan adalah memposting data daripada menambahkan info di 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;
}

Jika yang ingin Anda lakukan adalah mengedit header dalam permintaan, inilah yang ingin Anda lakukan:

// 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;
  }
}
thepoosh
sumber
44
Saya tidak memilih karena ini bukan pertanyaan yang diajukan sama sekali. Ini untuk menyetel konten POST, bukan untuk menyetel header HTTP kustom seperti User-Agent. Zh. Atanasov dan CommonsWare benar dengan getHeadersjawaban mereka .
georgiecasey
4
Saya tidak menyukai jawaban ini karena ini bukan yang diminta pengguna.
Dharmendra Pratap Singh
1
Ini untuk menambahkan parameter konten, bukan header, maaf juga tidak disukai. Ini seharusnya tidak menjadi jawaban yang diterima
Juan Cortés
1
Tolong bisakah Anda melihat pertanyaan saya? Ini mirip dengan ini tetapi saya tidak bisa melakukannya dengan benar stackoverflow.com/a/37948318
X09
18

Anda dapat melihat solusi ini . Ini menunjukkan bagaimana mendapatkan / mengatur cookie, tetapi cookie hanyalah salah satu header dalam permintaan / tanggapan. Anda harus mengganti salah satu kelas Permintaan * Volley dan mengatur header yang diperlukangetHeaders()


Berikut adalah sumber yang ditautkan:

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

}

Dan kelas MyApp:

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

}
Zh. Atanasov
sumber
7

Di Kotlin,

Anda harus mengganti metode getHeaders () seperti:

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
            }
        }
devDeejay
sumber
1
Ini adalah satu-satunya sumber daya yang dapat saya temukan untuk mengganti header di Kotlin. Terima kasih!
Mathew Sonke
@AthewSonke aku merasakanmu bro. Btw coba Retrofit untuk jaringan di Android.
devDeejay
6

Mencari solusi untuk masalah ini juga. lihat sesuatu di sini: http://developer.android.com/training/volley/request.html

apakah ide yang bagus untuk langsung menggunakan ImageRequest daripada ImageLoader? Tampaknya ImageLoader menggunakannya secara internal. Apakah itu melewatkan sesuatu yang penting selain dukungan cache ImageLoader?

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);
lannyf
sumber
Akan lebih dihargai dan lebih membantu jika Anda dapat menunjukkan mengapa menurut Anda pertanyaan tersebut salah atau solusi yang diajukan bermasalah, alih-alih hanya memberikan '-1'.
lannyf
1
Peta itu abstrak. Harus HashMap
superuserdo
4

coba ini

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

Anda bisa membuat kelas Permintaan khusus yang memperluas StringRequest dan mengganti metode getHeaders () di dalamnya seperti ini:

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;
    }
}
Khashayar Motarjemi
sumber
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;
}

}
Navneet Boghani
sumber
1

Sebagai tambahan, saya ingin membagikan sesuatu yang saya temukan mengenai Content-Type: Di atas

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

Saya harus menambahkan:

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

Jangan tanya saya mengapa, saya hanya berpikir itu mungkin membantu beberapa orang lain yang tidak bisa mendapatkan Content-Typeset yang benar.

Mendongkrak
sumber
0

Berikut adalah pengaturan header dari sampel github:

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);
M.Kouchi
sumber
0

coba ini

 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);
}
Yigit Yuksel
sumber
@Override public Map <String, String> getHeaders () melontarkan AuthFailureError {return headers; }};
Osama Ibrahim
di mana headernya ??
Osama Ibrahim
Di signutare, Anda dapat mengaturnya saat Anda memanggil dengan header Map <String, String>
Yigit Yuksel
0

Itu adalah kode saya, jangan lupa = objek: jika tidak dimasukkan tidak berfungsi

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)
Dave Rincon
sumber