volley 那些关于JSONObjectRequest所遇到的坑
一、首先我们来看StringRequest GET
基本使用GET方法的都不怎么需要带参数访问服务器,因此代码也是简单的:
//这段代码我是放在MainActivity中如果放在别的包或函数里,这里的this要随着改变
RequestQueue requestQueue = Volley.newRequestQueue(this);
String url = "这里填你服务器的地址";
StringRequest stringRequest = new StringRequest(Method.GET,url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("TAG", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
mQueue.add(stringRequest);
二、如果是StringRequest POST
如果使用POST那我猜大部分人可能要传参数进服务器了,这个也很容易:
RequestQueue requestQueue = Volley.newRequestQueue(this);
String url = "这里填你服务器的地址";
StringRequest stringRequest = new StringRequest(Method.POST,url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("TAG", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap<String, String>();
//这里写你要出入的参数,有几个,写几个
map.put("params1", "value1");
map.put("params2", "value2");
return map;
}
};
mQueue.add(stringRequest);
三、重头戏来了!!
介绍完StringRequest自然要介绍JsonObjectRequest,通常JsonObjectRequest使用GET大家都不会有问题,关键是POST,使用POST传参数,下面我们来看一下关键代码:
首先我们来看一下GET:
RequestQueue requestQueue = Volley.newRequestQueue(this);
String url = "这里填你服务器的地址";
JsonObjectRequest jsonObjectRequest = new JsonObjectReques(Method.GET,url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("TAG", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
mQueue.add(stringRequest);
如果你要使用POST传参数,一定一定不能使用重写getParams()的方法去传参,如果很不幸你使用了这种方法,那你一定感受到了他给你带来危害:服务器没有收到你传的参数。
要怎么解决这个问题呢?JsonObjectRequest的传参必须通过构造来传!!正确代码:
RequestQueue requestQueue = Volley.newRequestQueue(this);
String url = "你自己的服务器";
Map<String,String> map = DummyData.getDummyData();
String params = appendParameter(url,map);
MyJsonObjectRequest jsonObjectRequest = new MyJsonObjectRequest(
url,params,
new Response.Listener <JSONObject>(){
public void onResponse(JSONObject response){
//这里写接收服务器返回值
}
},new Response.ErrorListener() {
public void onErrorResponse(
com.android.volley.VolleyError response){
Log.e("对不起出现错误", response.toString());
}
});
requestQueue.add(jsonObjectRequest);
}
private String appendParameter(String url,Map<String,String> params){
Uri uri = Uri.parse(url);
Uri.Builder builder = uri.buildUpon();
for(Map.Entry<String,String> entry:params.entrySet()){
builder.appendQueryParameter(entry.getKey(),entry.getValue());
}
return builder.build().getQuery();
}
DummyData.java
public class DummyData {
public static Map<String,String> getDummyData(){
Map<String,String> map=new HashMap<String,String>();
map.put("showapi_appid", "6667");
map.put("showapi_sign", "c9d96511d7b343fa82d10ca88fa75313");
map.put("showapi_timestamp", getCurrentDate());
map.put("showapi_sign_method", "md5");
System.currentTimeMillis();
return map;
}
}
MyJsonObjectRequest.java
public class MyJsonObjectRequest extends JsonRequest<JSONObject> {
private static final String PROTOCOL_CHARSET = null;
String stringRequest;
public MyJsonObjectRequest(String url, String stringRequest,
Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
super(Method.POST, url,stringRequest , listener, errorListener);
this.stringRequest = stringRequest;
}
@Override
public String getBodyContentType() {
return "application/x-www-form-urlencoded; charset=" + getParamsEncoding();
}
@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));
}
}
}
这种方法相当于重写了JsonObjectRequest。
总结:
使用JsonObjectRequest传参请求服务器,需要对JsonObjectRequest这个构造函数进行重写。
注:
如果我写的还是不能让你明白你可以观看
来寻找自己答案。