วิธีตั้งค่าส่วนหัวที่กำหนดเองใน Volley Request


104

จะตั้งค่าส่วนหัวที่กำหนดเองสำหรับคำขอวอลเลย์ได้อย่างไร? ในขณะนี้มีวิธีตั้งค่าเนื้อหาสำหรับคำขอ POST ฉันขอ GET ง่ายๆ แต่ฉันต้องส่งส่วนหัวที่กำหนดเองไปด้วย ฉันไม่เห็นว่าคลาส JsonRequest รองรับอย่างไร เป็นไปได้หรือไม่


โปรดเปลี่ยนคำตอบที่ยอมรับคำตอบที่ยอมรับในขณะนี้ไม่ถูกต้อง
Esteban

คำตอบ:


119

ดูเหมือนว่าคุณแทนที่public Map<String, String> getHeaders(), ที่กำหนดไว้ในRequestเพื่อกลับที่คุณต้องการส่วนหัว HTTP


4
@ JuanJoséMeleroGómezลิงก์เสีย 404 ไม่พบ
Milon

นี่เป็นอีกตัวอย่างหนึ่ง (สั้นในตอนท้ายของหน้า): developer.android.com/training/volley/request-custom.html GsonRequestวิธีการลบล้างคลาสgetHeaders()เพื่อส่งคืนแผนที่ด้วยพารามิเตอร์ส่วนหัวที่คุณส่งผ่านในตัวสร้าง
Juan José Melero Gómez

158

คำตอบที่ยอมรับกับ getParams () ใช้สำหรับการตั้งค่าข้อมูลเนื้อหา POST แต่คำถามในชื่อถามว่าจะตั้งค่าส่วนหัว 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 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);

}

คำตอบนี้จะใช้ได้กับ JSONObjectRequest ด้วยหรือไม่ JSONObjectRequest postRequest = JSONObjectRequest ใหม่ ...... เพราะฉันทำสิ่งนี้และ getHeaders () ของฉันไม่ถูกเรียก ... ??? ฉันเข้าใจว่าคุณกำลังสร้างคลาสแบบไม่ระบุตัวตนและลบล้างเมธอด ฉันทำเพียงแค่ w / JSONObjectRequest แทน StringRequest และ getHeaders () ของฉันไม่ถูกเรียก
JDOaktown

เราสามารถเพิ่ม "คุกกี้" ในเมธอด getHeaders () ด้วยได้หรือไม่? จะใช้ได้กับคำขอโพสต์ด้วยหรือไม่?
Arnab Banerjee

ฉันจะส่งข้อมูล POST ที่เหลือไปที่ใด
Fernando Torres

30

หากสิ่งที่คุณต้องการคือการโพสต์ข้อมูลแทนที่จะเพิ่มข้อมูลใน 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;
  }
}

44
ฉันลงคะแนนเนื่องจากนี่ไม่ใช่สิ่งที่คำถามถามเลย ใช้สำหรับการตั้งค่าเนื้อหา POST ไม่ใช่สำหรับการตั้งค่าส่วนหัว HTTP ที่กำหนดเองเช่น User-Agent Zh. Atanasov และ CommonsWare ถูกต้องกับgetHeadersคำตอบของพวกเขา
georgiecasey

4
ฉันลงคะแนนคำตอบนี้เพราะนี่ไม่ใช่สิ่งที่ผู้ใช้ถาม
Dharmendra Pratap Singh

1
นี่คือการเพิ่มพารามิเตอร์เนื้อหาที่ไม่ใช่ส่วนหัวขออภัยลดลงด้วย ไม่ควรเป็นคำตอบที่ยอมรับจริงๆ
Juan Cortés

1
คุณช่วยดูคำถามของฉันได้ไหม มันคล้าย ๆ แบบนี้ แต่ฉันทำไม่ถูกstackoverflow.com/a/37948318
X09

18

คุณสามารถดูนี้การแก้ปัญหา แสดงวิธีรับ / ตั้งค่าคุกกี้ แต่คุกกี้เป็นเพียงส่วนหัวส่วนหนึ่งในคำขอ / การตอบกลับ คุณต้องลบล้างหนึ่งในคลาสคำขอของ 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());
        }
    }

}

7

ใน Kotlin

คุณต้องแทนที่getHeaders ()วิธีการเช่น:

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
นี่เป็นทรัพยากรเดียวที่ฉันสามารถหาได้สำหรับการลบล้างส่วนหัวใน Kotlin ขอบคุณ!
Mathew Sonke

@MathewSonke ฉันรู้สึกว่าพี่ชาย Btw ลอง Retrofit สำหรับเครือข่ายใน Android
devDeejay

6

กำลังหาวิธีแก้ปัญหานี้เช่นกัน ดูบางอย่างที่นี่: 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);

จะได้รับการชื่นชมและเป็นประโยชน์มากขึ้นหากคุณสามารถชี้ให้เห็นว่าเหตุใดคุณจึงคิดว่าคำถามนั้นผิดหรือวิธีการแก้ปัญหาที่ถามมีปัญหาแทนที่จะให้เป็น '-1'
lannyf

1
แผนที่เป็นนามธรรม ควรเป็น HashMap
superuserdo

4

ลองดู

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

คุณสามารถสร้างคลาส Request แบบกำหนดเองที่ขยาย 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;
    }
}

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

นอกจากนี้ฉันต้องการแบ่งปันสิ่งที่ฉันพบเกี่ยวกับ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จัดฉากได้ถูกต้อง


0

นี่คือการตั้งค่าส่วนหัวจากตัวอย่าง 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

ลองดู

 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 {return headers; }};
Osama Ibrahim

ส่วนหัว ??
Osama Ibrahim

ใน signutare คุณสามารถตั้งค่าได้เมื่อคุณเรียกด้วยส่วนหัว <String, String> แผนที่
Yigit Yuksel

0

นั่นคือรหัสของฉันอย่าลืม = object: ถ้าไม่ใส่ไม่ได้ผล

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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.