Android网络框架-Volley(四) 使用get和post方法发送json请求

这一篇文章起我们开始介绍如何使用Volley发起请求,其中的例子有一部分我借用了Ravi Tamada博客中的例子。Ravi Tamada写了好多很高质量的文章,如果有兴趣的朋友可以去他的博客学习一下:Android working with Volley Library。通过前面的分析我们知道Volley发送请求的前提是我们得建立一个RequestQueue。在Android网络框架-Volley(二) RequestQueue源码分析以及建立一个RequestQueue中我们介绍了如何创建一个单例的RequestQueue,如果不会的朋友可以看一下。

发出JSON请求

Volley提供给我们发送JSON请求的类--JsonRequest。我们不能直接使用它,它是一个抽象类,他有两个子类:JsonObjectRequest和JsonArrayRequest。我们使用这两个子类来发出json请求

使用JsonObjectRequest

// 给request赋一个TAG,以便于取消时候使用
String tag_json_obj = "json_obj_req";
 
String url = "http://api.androidhive.info/volley/person_object.json";
         
ProgressDialog pDialog = new ProgressDialog(this);
pDialog.setMessage("Loading...");
pDialog.show();     
        //新建一个JsonObjectRequest实例
        //第一个参数是指定get还是post方式
        //第二个参数是要请求的地址
        //第三个参数是要传的参数,这里传null,后面解释
        //第四个参数是一个Listener接口,重写里面两个方法
        JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.GET,
                url, null,
                new Response.Listener() {
                    //在这个方法里,成功获取到了数据
                    @Override
                    public void onResponse(JSONObject response) {
                        Log.d(TAG, response.toString());
                        pDialog.hide();
                    }
                }, new Response.ErrorListener() {
                    //在这个方法里,打印错误信息
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.d(TAG, "Error: " + error.getMessage());
                        // hide the progress dialog
                        pDialog.hide();
                    }
                });
 
// 将这个request加入到requestQueue中,就可以执行了
AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);

对于第三个参数为什么传null我们肯定有疑惑,那么我们就来看看JsonObjectRequest的源代码

//我们直接看第三个参数,(jsonRequest == null) ? null : jsonRequest.toString()用来
//判断我们第三个参数是否为空,如果为空,说明此次发送请求不包含参数,如果不为空,
//说明我们是需要传递参数的。
public JsonObjectRequest(int method, String url, JSONObject jsonRequest,
            Listener listener, ErrorListener errorListener) {
        super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener,
                    errorListener);
    }

//这个构造方法是不需要手动指定请求方法是get还是post的。
//jsonRequest == null ? Method.GET : Method.POST这个方法我们看到,如果第二个参数
//我们传null,则默认使用get方法,如果不为null,则默认使用post方法
 public JsonObjectRequest(String url, JSONObject jsonRequest, Listener listener,
            ErrorListener errorListener) {
        this(jsonRequest == null ? Method.GET : Method.POST, url, jsonRequest,
                listener, errorListener);
    }
从第二个构造方法我们可以看出,如果第二个参数我们传null,则使用get方法,如果不传null,则使用post方法。其实从字面意思我们也可以理解,get就是获得嘛,不需要提交什么参数,post就是提交吗,需要提交一些参数,所以如果我们有参数要传的话,我们就使用post方法,如果没有参数要传的话,就是用get方法。

所以上面的代码我们还可以这样写

// 给request赋一个TAG,以便于取消时候使用
String tag_json_obj = "json_obj_req";
 
String url = "http://api.androidhive.info/volley/person_object.json";
         
ProgressDialog pDialog = new ProgressDialog(this);
pDialog.setMessage("Loading...");
pDialog.show();     
        JsonObjectRequest jsonObjReq = new JsonObjectRequest(url, null,
                new Response.Listener() {
                    @Override
                    public void onResponse(JSONObject response) {
                        Log.d(TAG, response.toString());
                        pDialog.hide();
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.d(TAG, "Error: " + error.getMessage());
                        pDialog.hide();
                    }
                });
 
// 将这个request加入到requestQueue中,就可以执行了
AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);
接下来我们看看post请求怎么发

// 给request赋一个TAG,以便于取消时候使用
String tag_json_obj = "json_obj_req";
 
String url = "http://api.androidhive.info/volley/person_object.json";
         
ProgressDialog pDialog = new ProgressDialog(this);
pDialog.setMessage("Loading...");
pDialog.show();     
        Map map=new HashMap();
        //传一个参数,user=zhangqi
        map.put("user", "zhangqi");
        JSONObject params=new JSONObject(map);
        //第二个参数我们传了user=zhangqi。则请求方法就为post 
        JsonObjectRequest objRequest = new JsonObjectRequest(url, params,
                new Response.Listener() {
                    @Override
                    public void onResponse(JSONObject obj) {
                        Log.d(TAG, response.toString());
                        pDialog.hide();
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                         VolleyLog.d(TAG, "Error: " + error.getMessage());
                        // hide the progress dialog
                        pDialog.hide();
                    }
                });
// 将这个request加入到requestQueue中,就可以执行了
AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);
还可以这样写

String tag_json_obj = "json_obj_req";
 
String url = "http://api.androidhive.info/volley/person_object.json";
         
ProgressDialog pDialog = new ProgressDialog(this);
pDialog.setMessage("Loading...");
pDialog.show();     
        //我们通过第一个构造方法,手动指定好post方法,第三个参数传为null,通过
        //getParams()传递参数
        JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
                url, null,
                new Response.Listener() {
 
                    @Override
                    public void onResponse(JSONObject response) {
                        Log.d(TAG, response.toString());
                        pDialog.hide();
                    }
                }, new Response.ErrorListener() {
 
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.d(TAG, "Error: " + error.getMessage());
                        pDialog.hide();
                    }
                }) {
            //将参数存储到map中然后返回,系统会自动调用这个方法,将参数传递出去
            @Override
            protected Map getParams() {
                Map params = new HashMap();
                params.put("name", "Androidhive");
                params.put("email", "[email protected]");
                params.put("password", "password123");
 
                return params;
            }
 
        };
 
AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);

使用JsonArrayRequest

我们先来看看JsonArrayRequest的构造方法
//第一个参数是url地址,第二个参数是Listener接口
public JsonArrayRequest(String url, Listener listener, ErrorListener errorListener) {
        super(Method.GET, url, null, listener, errorListener);
    }
非常简单,只有一个构造函数,而且参数简单的我们根本不需要解释了。直接看一个例子就ok了。根本不需要注释了
String tag_json_arry = "json_array_req";
 
String url = "http://api.androidhive.info/volley/person_array.json";
         
ProgressDialog pDialog = new ProgressDialog(this);
pDialog.setMessage("Loading...");
pDialog.show();     
         
JsonArrayRequest req = new JsonArrayRequest(url,
                new Response.Listener() {
                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d(TAG, response.toString());        
                        pDialog.hide();             
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.d(TAG, "Error: " + error.getMessage());
                        pDialog.hide();
                    }
                });
 
AppController.getInstance().addToRequestQueue(req, tag_json_arry);






你可能感兴趣的:(Volley原理与实践)