volley

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这个构造函数进行重写。

注:
如果我写的还是不能让你明白你可以观看

推荐链接

来寻找自己答案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值