Tôi đã xem phiên Google IO 2013 về Vô lê và tôi đang cân nhắc chuyển sang vô lê. Volley có hỗ trợ thêm tham số POST / GET để yêu cầu không? Nếu có, tôi có thể làm như thế nào?
Tôi đã xem phiên Google IO 2013 về Vô lê và tôi đang cân nhắc chuyển sang vô lê. Volley có hỗ trợ thêm tham số POST / GET để yêu cầu không? Nếu có, tôi có thể làm như thế nào?
Câu trả lời:
Trong lớp Yêu cầu của bạn (mở rộng Yêu cầu), ghi đè phương thức getParams (). Bạn sẽ làm tương tự đối với tiêu đề, chỉ cần ghi đè getHeaders ().
Nếu bạn nhìn vào lớp PostWithBody trong TestRequest.java trong các bài kiểm tra Volley, bạn sẽ tìm thấy một ví dụ. Nó đi một cái gì đó như thế này
public class LoginRequest extends Request<String> {
// ... other methods go here
private Map<String, String> mParams;
public LoginRequest(String param1, String param2, Listener<String> listener, ErrorListener errorListener) {
super(Method.POST, "http://test.url", errorListener);
mListener = listener;
mParams = new HashMap<String, String>();
mParams.put("paramOne", param1);
mParams.put("paramTwo", param2);
}
@Override
public Map<String, String> getParams() {
return mParams;
}
}
Evan Charlton đã đủ tốt bụng để thực hiện một dự án ví dụ nhanh để chỉ cho chúng ta cách sử dụng cú vô lê. https://github.com/evancharlton/folly/
getParams
chỉ được gọi (theo mặc định) trong một yêu cầu POST hoặc PUT, nhưng không được gọi trong một yêu cầu GET. Xem câu trả lời của Ogre_BGR
Đối với các tham số GET, có hai lựa chọn thay thế:
Đầu tiên : Như được đề xuất trong một nhận xét dưới đây, câu hỏi bạn chỉ có thể sử dụng Chuỗi và thay thế các trình giữ chỗ tham số bằng các giá trị của chúng như:
String uri = String.format("http://somesite.com/some_endpoint.php?param1=%1$s¶m2=%2$s",
num1,
num2);
StringRequest myReq = new StringRequest(Method.GET,
uri,
createMyReqSuccessListener(),
createMyReqErrorListener());
queue.add(myReq);
trong đó num1 và num2 là các biến Chuỗi chứa các giá trị của bạn.
Thứ hai : Nếu bạn đang sử dụng HttpClient bên ngoài mới hơn (ví dụ: 4.2.x), bạn có thể sử dụng URIBuilder để tạo Uri của mình. Ưu điểm là nếu chuỗi tiểu của bạn đã có các tham số trong đó thì sẽ dễ dàng chuyển nó đến URIBuilder
và sau đó sử dụng ub.setQuery(URLEncodedUtils.format(getGetParams(), "UTF-8"));
để thêm các tham số bổ sung của bạn. Bằng cách đó, bạn sẽ không cần phải kiểm tra xem có "?" đã được thêm vào tiểu hoặc bỏ sót một số và do đó loại bỏ nguồn gây ra lỗi tiềm ẩn.
Đối với các tham số POST có lẽ đôi khi sẽ dễ dàng hơn câu trả lời được chấp nhận để làm điều đó như:
StringRequest myReq = new StringRequest(Method.POST,
"http://somesite.com/some_endpoint.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);
ví dụ: chỉ ghi đè lên getParams()
phương thức.
Bạn có thể tìm thấy một ví dụ làm việc (cùng với nhiều ví dụ Volley cơ bản khác) trong dự án Andorid Volley Examples .
CustomRequest là một cách để giải quyết việc JSONObjectRequest của Volley không thể đăng các tham số như StringRequest
đây là lớp trợ giúp cho phép thêm các tham số:
import java.io.UnsupportedEncodingException;
import java.util.Map;
import org.json.JSONException;
import org.json.JSONObject;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.HttpHeaderParser;
public class CustomRequest extends Request<JSONObject> {
private Listener<JSONObject> listener;
private Map<String, String> params;
public CustomRequest(String url, Map<String, String> params,
Listener<JSONObject> reponseListener, ErrorListener errorListener) {
super(Method.GET, url, errorListener);
this.listener = reponseListener;
this.params = params;
}
public CustomRequest(int method, String url, Map<String, String> params,
Listener<JSONObject> reponseListener, ErrorListener errorListener) {
super(method, url, errorListener);
this.listener = reponseListener;
this.params = params;
}
protected Map<String, String> getParams()
throws com.android.volley.AuthFailureError {
return params;
};
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONObject(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
@Override
protected void deliverResponse(JSONObject response) {
// TODO Auto-generated method stub
listener.onResponse(response);
}
}
cảm ơn Greenchiu
getParams()
đè hàm JSONObjectReuqest không hoạt động.
Lớp trợ giúp này quản lý các tham số cho các yêu cầu GET và POST :
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.Map;
import org.json.JSONException;
import org.json.JSONObject;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.HttpHeaderParser;
public class CustomRequest extends Request<JSONObject> {
private int mMethod;
private String mUrl;
private Map<String, String> mParams;
private Listener<JSONObject> mListener;
public CustomRequest(int method, String url, Map<String, String> params,
Listener<JSONObject> reponseListener, ErrorListener errorListener) {
super(method, url, errorListener);
this.mMethod = method;
this.mUrl = url;
this.mParams = params;
this.mListener = reponseListener;
}
@Override
public String getUrl() {
if(mMethod == Request.Method.GET) {
if(mParams != null) {
StringBuilder stringBuilder = new StringBuilder(mUrl);
Iterator<Map.Entry<String, String>> iterator = mParams.entrySet().iterator();
int i = 1;
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
if (i == 1) {
stringBuilder.append("?" + entry.getKey() + "=" + entry.getValue());
} else {
stringBuilder.append("&" + entry.getKey() + "=" + entry.getValue());
}
iterator.remove(); // avoids a ConcurrentModificationException
i++;
}
mUrl = stringBuilder.toString();
}
}
return mUrl;
}
@Override
protected Map<String, String> getParams()
throws com.android.volley.AuthFailureError {
return mParams;
};
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONObject(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
@Override
protected void deliverResponse(JSONObject response) {
// TODO Auto-generated method stub
mListener.onResponse(response);
}
}
GetUrl
nhiều lần. Chúng tôi đã kết thúc với một cách tiếp cận foreach cổ điển như đã đăng trong một câu trả lời riêng. Hy vọng điều này sẽ giúp những người đến đây. :)
Đối phó với các tham số GET tôi đã lặp lại trên giải pháp của Andrea Motto '. Vấn đề là Volley đã gọi GetUrl
nhiều lần và giải pháp của anh ta, sử dụng một Iterator, đã phá hủy đối tượng Bản đồ gốc. Các cuộc gọi nội bộ Volley tiếp theo có một đối tượng params trống.
Tôi cũng đã thêm mã hóa các tham số.
Đây là cách sử dụng nội tuyến (không có lớp con).
public void GET(String url, Map<String, String> params, Response.Listener<String> response_listener, Response.ErrorListener error_listener, String API_KEY, String stringRequestTag) {
final Map<String, String> mParams = params;
final String mAPI_KEY = API_KEY;
final String mUrl = url;
StringRequest stringRequest = new StringRequest(
Request.Method.GET,
mUrl,
response_listener,
error_listener
) {
@Override
protected Map<String, String> getParams() {
return mParams;
}
@Override
public String getUrl() {
StringBuilder stringBuilder = new StringBuilder(mUrl);
int i = 1;
for (Map.Entry<String,String> entry: mParams.entrySet()) {
String key;
String value;
try {
key = URLEncoder.encode(entry.getKey(), "UTF-8");
value = URLEncoder.encode(entry.getValue(), "UTF-8");
if(i == 1) {
stringBuilder.append("?" + key + "=" + value);
} else {
stringBuilder.append("&" + key + "=" + value);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
i++;
}
String url = stringBuilder.toString();
return url;
}
@Override
public Map<String, String> getHeaders() {
Map<String, String> headers = new HashMap<>();
if (!(mAPI_KEY.equals(""))) {
headers.put("X-API-KEY", mAPI_KEY);
}
return headers;
}
};
if (stringRequestTag != null) {
stringRequest.setTag(stringRequestTag);
}
mRequestQueue.add(stringRequest);
}
Hàm này sử dụng các tiêu đề để chuyển một APIKEY và đặt một TAG cho yêu cầu hữu ích để hủy nó trước khi hoàn thành.
Hi vọng điêu nay co ich.
Điều này có thể giúp bạn ...
private void loggedInToMainPage(final String emailName, final String passwordName) {
String tag_string_req = "req_login";
StringRequest stringRequest = new StringRequest(Request.Method.POST, "http://localhost/index", new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, "Login Response: " + response.toString());
try {
JSONObject jsonObject = new JSONObject(response);
Boolean error = jsonObject.getBoolean("error");
if (!error) {
String uid = jsonObject.getString("uid");
JSONObject user = jsonObject.getJSONObject("user");
String email = user.getString("email");
String password = user.getString("password");
session.setLogin(true);
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
finish();
Toast.makeText(getApplicationContext(), "its ok", Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
System.out.println("volley Error .................");
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("tag", "login");
params.put("email", emailName);
params.put("password", passwordName);
return params;
}
};
MyApplication.getInstance().addToRequestQueue(stringRequest,tag_string_req);
}
Tôi thích làm việc với Volley . Để tiết kiệm thời gian phát triển, tôi đã cố gắng viết thư viện nhỏ tiện dụng Gloxey Netwok Manager để thiết lập Volley với dự án của mình. Nó bao gồm trình phân tích cú pháp JSON và các phương pháp khác giúp kiểm tra tính khả dụng của mạng.
Sử dụng ConnectionManager.class
các phương thức khác nhau cho yêu cầu Volley String và Volley JSON khả dụng. Bạn có thể thực hiện các yêu cầu GET, PUT, POST, DELETE có hoặc không có tiêu đề. Bạn có thể đọc toàn bộ tài liệu tại đây .
Chỉ cần đặt dòng này trong tệp gradle của bạn.
dependencies {
compile 'io.gloxey.gnm:network-manager:1.0.1'
}
Phương thức GET (không có tiêu đề)
ConnectionManager.volleyStringRequest(context, isDialog, progressDialogView, requestURL, volleyResponseInterface);
Configuration Description
Context Context
isDialog If true dialog will appear, otherwise not.
progressView For custom progress view supply your progress view id and make isDialog true. otherwise pass null.
requestURL Pass your API URL.
volleyResponseInterface Callback for response.
Thí dụ
ConnectionManager.volleyStringRequest(this, false, null, "url", new VolleyResponse() {
@Override
public void onResponse(String _response) {
/**
* Handle Response
*/
}
@Override
public void onErrorResponse(VolleyError error) {
/**
* handle Volley Error
*/
}
@Override
public void isNetwork(boolean connected) {
/**
* True if internet is connected otherwise false
*/
}
});
Phương thức POST / PUT / DELETE (không có tiêu đề)
ConnectionManager.volleyStringRequest(context, isDialog, progressDialogView, requestURL, requestMethod, params, volleyResponseInterface);
Thí dụ
Use Method : Request.Method.POST
Request.Method.PUT
Request.Method.DELETE
Your params :
HashMap<String, String> params = new HashMap<>();
params.put("param 1", "value");
params.put("param 2", "value");
ConnectionManager.volleyStringRequest(this, true, null, "url", Request.Method.POST, params, new VolleyResponse() {
@Override
public void onResponse(String _response) {
/**
* Handle Response
*/
}
@Override
public void onErrorResponse(VolleyError error) {
/**
* handle Volley Error
*/
}
@Override
public void isNetwork(boolean connected) {
/**
* True if internet is connected otherwise false
*/
}
});
Hãy sử dụng trình phân tích cú pháp gloxey json để phân tích cú pháp api của bạn.
YourModel yourModel = GloxeyJsonParser.getInstance().parse(stringResponse, YourModel.class);
Thí dụ
ConnectionManager.volleyStringRequest(this, false, null, "url", new VolleyResponse() {
@Override
public void onResponse(String _response) {
/**
* Handle Response
*/
try {
YourModel yourModel = GloxeyJsonParser.getInstance().parse(_response, YourModel.class);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onErrorResponse(VolleyError error) {
/**
* handle Volley Error
*/
if (error instanceof TimeoutError || error instanceof NoConnectionError) {
showSnackBar(parentLayout, getString(R.string.internet_not_found), getString(R.string.retry), new View.OnClickListener() {
@Override
public void onClick(View view) {
//handle retry button
}
});
} else if (error instanceof AuthFailureError) {
} else if (error instanceof ServerError) {
} else if (error instanceof NetworkError) {
} else if (error instanceof ParseError) {
}
}
@Override
public void isNetwork(boolean connected) {
/**
* True if internet is connected otherwise false
*/
if (!connected) {
showSnackBar(parentLayout, getString(R.string.internet_not_found), getString(R.string.retry), new View.OnClickListener() {
@Override
public void onClick(View view) {
//Handle retry button
}
});
}
});
public void showSnackBar(View view, String message) {
Snackbar.make(view, message, Snackbar.LENGTH_LONG).show();
}
public void showSnackBar(View view, String message, String actionText, View.OnClickListener onClickListener) {
Snackbar.make(view, message, Snackbar.LENGTH_LONG).setAction(actionText, onClickListener).show();
}
Để cung cấp POST
tham số, hãy gửi tham số của bạn như JSONObject
trong hàm JsonObjectRequest
tạo. Tham số thứ 3 chấp nhận một JSONObject
được sử dụng trong phần thân Yêu cầu.
JSONObject paramJson = new JSONObject();
paramJson.put("key1", "value1");
paramJson.put("key2", "value2");
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,url,paramJson,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue.add(jsonObjectRequest);
http://example.com?param1=val1¶m2=val2
:)