จะตั้งค่าส่วนหัวที่กำหนดเองสำหรับคำขอวอลเลย์ได้อย่างไร? ในขณะนี้มีวิธีตั้งค่าเนื้อหาสำหรับคำขอ POST ฉันขอ GET ง่ายๆ แต่ฉันต้องส่งส่วนหัวที่กำหนดเองไปด้วย ฉันไม่เห็นว่าคลาส JsonRequest รองรับอย่างไร เป็นไปได้หรือไม่
จะตั้งค่าส่วนหัวที่กำหนดเองสำหรับคำขอวอลเลย์ได้อย่างไร? ในขณะนี้มีวิธีตั้งค่าเนื้อหาสำหรับคำขอ POST ฉันขอ GET ง่ายๆ แต่ฉันต้องส่งส่วนหัวที่กำหนดเองไปด้วย ฉันไม่เห็นว่าคลาส JsonRequest รองรับอย่างไร เป็นไปได้หรือไม่
คำตอบ:
ดูเหมือนว่าคุณแทนที่public Map<String, String> getHeaders()
, ที่กำหนดไว้ในRequest
เพื่อกลับที่คุณต้องการส่วนหัว HTTP
GsonRequest
วิธีการลบล้างคลาสgetHeaders()
เพื่อส่งคืนแผนที่ด้วยพารามิเตอร์ส่วนหัวที่คุณส่งผ่านในตัวสร้าง
คำตอบที่ยอมรับกับ 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);
}
หากสิ่งที่คุณต้องการคือการโพสต์ข้อมูลแทนที่จะเพิ่มข้อมูลใน 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;
}
}
getHeaders
คำตอบของพวกเขา
คุณสามารถดูนี้การแก้ปัญหา แสดงวิธีรับ / ตั้งค่าคุกกี้ แต่คุกกี้เป็นเพียงส่วนหัวส่วนหนึ่งในคำขอ / การตอบกลับ คุณต้องลบล้างหนึ่งในคลาสคำขอของ 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());
}
}
}
ใน 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
}
}
กำลังหาวิธีแก้ปัญหานี้เช่นกัน ดูบางอย่างที่นี่: 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;
}
};
คุณสามารถสร้างคลาส 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;
}
}
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);
}
นั่นคือรหัสของฉันอย่าลืม = 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)