Как установить пользовательский заголовок в запросе Volley
Как можно настроить пользовательские заголовки для запроса залпа? На данный момент существует способ установить содержимое тела для запроса POST. У меня есть простой запрос GET, но мне нужно передать пользовательские заголовки вместе с ним. Я не вижу, как класс JsonRequest поддерживает его. Возможно ли это вообще?
12 ответов:
похоже, вы переопределяете
public Map<String, String> getHeaders()
,определена вRequest
, чтобы вернуть нужные заголовки HTTP.
принятый ответ с getParams () предназначен для установки данных тела сообщения, но вопрос в заголовке спросил, как установить заголовки HTTP, такие как User-Agent. Как сказал CommonsWare, вы переопределяете getHeaders (). Вот пример кода, который устанавливает User-Agent в "Nintendo Gameboy" и Accept-Language в "fr":
public void requestWithSomeHttpHeaders() { RequestQueue queue = Volley.newRequestQueue(this); String url = "http://www.somewebsite.com"; StringRequest postRequest = 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(postRequest); }
Если вам нужно опубликовать данные вместо добавления информации в 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; }
Если то, что вы хотите сделать, это изменить заголовки в запросе, это то, что вы хотите сделать:
// 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; } }
вы можете ознакомиться этой решение. Он показывает, как получить/установить куки, но куки-это только один из заголовков в запрос/ответ. Вы должны переопределить один из классов запроса Volley *и установить необходимые заголовки в
getHeaders()
вот связанный источник:
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; }
}
и класс 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()); } } }
ищем решение и этой проблемы. смотрите что-то здесь:http://developer.android.com/training/volley/request.html
это хорошая идея, чтобы напрямую использовать ImageRequest вместо ImageLoader? Кажется, ImageLoader использует его внутри в любом случае. Он пропускает что-нибудь важное, кроме поддержки кэша 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);
попробуй такое
{ @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; } };
вы можете создать пользовательский класс запроса, который расширяет StringRequest и переопределяет метод getHeaders () внутри него следующим образом:
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; } }
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; } }
в качестве дополнения я хотел бы поделиться тем, что я нашел относительно
Content-Type
: На вершине@Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> params = new HashMap<String, String>(); . . . return params; }
Я добавил:
@Override public String getBodyContentType() { return /*(for exmaple)*/ "application/json"; }
не спрашивайте меня, почему, я просто думал, что это может помочь некоторым другим, которые не могут получить
Content-Type
установить право.
вот настройка заголовков из образца 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);
попробуй такое
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); }
Это мой код, не забывайте = объект: если не ставить не работает
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)