Cách đặt tiêu đề tùy chỉnh trong Yêu cầu bóng


104

Làm cách nào để có thể đặt tiêu đề tùy chỉnh cho yêu cầu Volley? Hiện tại, có cách để đặt nội dung nội dung cho một yêu cầu ĐĂNG. Tôi có một yêu cầu GET đơn giản, nhưng tôi cần chuyển các tiêu đề tùy chỉnh cùng với đó. Tôi không thấy cách lớp JsonRequest hỗ trợ nó. Có thể ở tất cả?


vui lòng thay đổi câu trả lời được chấp nhận, câu trả lời hiện được chấp nhận không chính xác.
Esteban

Câu trả lời:


119

Có vẻ như bạn ghi đè public Map<String, String> getHeaders(), được xác định trongRequest , để trả về các tiêu đề HTTP mong muốn của bạn.


4
@ JuanJoséMeleroGómez liên kết bị hỏng. 404 Không tìm thấy
Milon

Đây là một ví dụ khác (đoạn mã ở cuối trang): developer.android.com/training/volley/request-custom.html . GsonRequestPhương thức ghi đè lớp getHeaders()để trả về một Bản đồ với các tham số tiêu đề mà bạn truyền vào hàm tạo.
Juan José Melero Gómez

157

Câu trả lời được chấp nhận với getParams () là để thiết lập dữ liệu nội dung POST, nhưng câu hỏi trong tiêu đề hỏi cách đặt tiêu đề HTTP như User-Agent. Như CommonsWare đã nói, bạn ghi đè getHeaders (). Đây là một số mã mẫu đặt Tác nhân người dùng thành 'Nintendo Gameboy' và Ngôn ngữ chấp nhận thành '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);

}

Câu trả lời này cũng sẽ hoạt động cho JSONObjectRequest chứ? JSONObjectRequest postRequest = new JSONObjectRequest ...... bởi vì tôi đang làm điều này và getHeaders () của tôi không được gọi ... ??? Tôi hiểu rằng bạn đang tạo một lớp ẩn danh và ghi đè các phương thức. Tôi đang làm điều đó chỉ w / JSONObjectRequest thay vì StringRequest và getHeaders () của tôi không được gọi.
JDOaktown

Chúng ta có thể thêm "Cookie" trong phương thức getHeaders () không? Nó sẽ hoạt động cho các yêu cầu đăng bài?
Arnab Banerjee

Tôi sẽ gửi phần còn lại của dữ liệu POST ở đâu?
Fernando Torres

30

Nếu những gì bạn cần là đăng dữ liệu thay vì thêm thông tin vào 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;
}

Nếu những gì bạn muốn làm là chỉnh sửa tiêu đề trong yêu cầu thì đây là những gì bạn muốn làm:

// 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
Tôi đã phản đối vì đây không phải là câu hỏi được đặt ra. Điều này là để đặt nội dung ĐĂNG, không phải để đặt tiêu đề HTTP tùy chỉnh như Tác nhân người dùng. Zh. Atanasov và CommonsWare đều đúng với getHeaderscâu trả lời của họ .
georgiecasey

4
Tôi đã phản đối câu trả lời này vì đây không phải là những gì người dùng đã hỏi.
Dharmendra Pratap Singh

1
Đây là để thêm thông số nội dung không phải tiêu đề, xin lỗi bạn cũng đã phản đối. Nó thực sự không phải là câu trả lời được chấp nhận
Juan Cortés

1
Vui lòng bạn có thể xem qua câu hỏi của tôi? Nó tương tự như này nhưng tôi không thể làm cho nó đúng stackoverflow.com/a/37948318
X09

18

Bạn có thể xem giải pháp này . Nó chỉ ra cách lấy / đặt cookie, nhưng cookie chỉ là một trong những tiêu đề trong một yêu cầu / phản hồi. Bạn phải ghi đè một trong các lớp Yêu cầu * của Volley và đặt các tiêu đề bắt buộc tronggetHeaders()


Đây là nguồn được liên kết:

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

}

Và lớp 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());
        }
    }

}

7

Ở Kotlin,

Bạn phải ghi đè phương thức getHeaders () như:

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
Đây là tài nguyên duy nhất tôi có thể tìm thấy để ghi đè các tiêu đề trong Kotlin. Cảm ơn bạn!
Mathew Sonke

@MathewSonke Tôi cảm thấy anh bạn. Btw hãy thử Trang bị thêm cho mạng trong Android.
devDeejay

6

Tìm kiếm giải pháp cho vấn đề này là tốt. xem nội dung nào đó ở đây: http://developer.android.com/training/volley/request.html

Bạn có nên sử dụng trực tiếp ImageRequest thay vì ImageLoader không? Có vẻ như ImageLoader vẫn sử dụng nó trong nội bộ. Nó có bỏ lỡ bất kỳ điều gì quan trọng ngoài hỗ trợ bộ nhớ cache của ImageLoader không?

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

Sẽ được đánh giá cao hơn nhiều và hữu ích hơn nếu bạn có thể chỉ ra lý do tại sao bạn cho rằng câu hỏi sai hoặc giải pháp được hỏi có vấn đề, thay vì chỉ đơn giản cho nó là '-1'.
lannyf

1
Bản đồ là trừu tượng. Nên là HashMap
superuserdo

4

thử cái này

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

Bạn có thể tạo một lớp Yêu cầu tùy chỉnh để mở rộng StringRequest và ghi đè phương thức getHeaders () bên trong nó như sau:

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

Ngoài ra, tôi muốn chia sẻ một số điều tôi tìm thấy liên quan đến Content-Type:

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

Tôi đã phải thêm:

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

Đừng hỏi tôi tại sao, tôi chỉ nghĩ rằng nó có thể giúp một số người khác không thể làm Content-Typeđúng.


0

Đây là thiết lập tiêu đề từ mẫu 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);

0

thử cái này

 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 () ném AuthFailureError {return headers; }};
Osama Ibrahim

khi có tiêu đề ??
Osama Ibrahim

Trên signutare, bạn có thể đặt nó khi gọi bằng tiêu đề Map <String, String>
Yigit Yuksel

0

Đó là mã của tôi, đừng quên = đối tượng: nếu không đặt không hoạt động

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.