Volley使用与扩展(POST,Cookie)

来源:互联网 发布:hive元数据存储设计 编辑:程序博客网 时间:2024/05/15 03:38

Volley 的简单使用

使用 StringRequest 通过 GET 方式获取数据:

RequestQueue mQueue = Volley.newRequestQueue(context);String Url = "http://www.baidu.com";StringRequest request = new StringRequest(Url, new Response.Listener<String>() {    @Override    public void onResponse(String s) {        Log.e("TAG", s);    }}, new Response.ErrorListener() {    @Override    public void onErrorResponse(VolleyError volleyError) {        Log.e("TAG", "网络错误");    }});mQueue.add(request);

这很简单,主要分三步:
1.创建 RequestQueue 对象;
2.创建 StringRequest 对象;
3.将 StringRequest 添加到 RequestQueue 中。

Volley 使用 Post 方式交互数据

与GET方式基本相同,只需要设置 Request.Method.POST 即可:

RequestQueue mQueue = Volley.newRequestQueue(context);String Url = "http://www.baidu.com";StringRequest stringRequest = new StringRequest(Request.Method.POST,        Url,        new Response.Listener<String>() {            @Override            public void onResponse(String s) {                Log.e("TAG", s);            }        },        new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError volleyError) {                Log.e("TAG", "网络错误");        }});stringRequest.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 1, 1.0f));//配置参数,如重连次数,超时时间...mQueue.add(stringRequest);

Volley使用post方式时设置参数

使用 POST 方式时有时需要提交参数,可以通过重写 getParams 方法来实现。

RequestQueue mQueue = Volley.newRequestQueue(context);String Url = "http://www.baidu.com";StringRequest stringRequest = new StringRequest(Request.Method.POST,        Url,        new Response.Listener<String>() {            @Override            public void onResponse(String s) {                Log.e("TAG", s);            }        },        new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError volleyError) {                Log.e("TAG", "网络错误");        }}){    @Override    protected Map<String, String> getParams() throws AuthFailureError {        //在这里设置需要post的参数        HashMap<String, String> params = new HashMap<>();        params.put("request", "params");//根据需求自己设置        return params;    }};mQueue.add(stringRequest);

Volley中使用Cookie

请求时带上Cookie

Volley默认没有提供使用Cookie的方法,需要我们自己自定义支持Cookie的Request:

package com.zhangke.tool;import java.util.HashMap;import java.util.Map;import com.android.volley.AuthFailureError;import com.android.volley.Response.ErrorListener;import com.android.volley.Response.Listener;import com.android.volley.toolbox.StringRequest;/** * @author 张可 * @version 1.0 * @date 2017.03.10 */public class CookieRequest  extends StringRequest {    private Map<String, String> mHeaders=new HashMap<String, String>(1);    private static String DOMAIN = "www.baidu.com";    public CookieRequest(int method, String url, Listener<String> listener, ErrorListener errorListener) {        super(method, url, listener, errorListener);    }    public CookieRequest(String url, Listener<String> listener, ErrorListener errorListener) {        super(url, listener, errorListener);    }    /**     * 这个方法就是用来设置Cookie,在发起HTTP请求之前调用此方法设置Cookie,具体如何设置     * 请按照需求,这里只是一个案例。     */    public void setCookie(String sId){        mHeaders.put("Cookie", "sid=" + sId + "; domain=" + DOMAIN);    }    /**     * Volley会调用此方法获取HTTP的请求头,所以可以再此处设置Cookie.     */    @Override    public Map<String, String> getHeaders() throws AuthFailureError {        return mHeaders;    }}

定义CookieRequest的方式很简单,主要在里面添加一个setCookie() 方法,然后重写getHeaders()把设置的Cookie放到HTTP Header里面,之后就可以使用了,使用方式跟StringRequest差不多,如下:

RequestQueue mQueue = Volley.newRequestQueue(context);CookieRequest stringRequest = new CookieRequest(Request.Method.POST, "http://www.baidu.com",        new Response.Listener<String>() {            @Override            public void onResponse(String response) {                Log.e("TAG", response);            }        },        new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError error) {                if (error instanceof TimeoutError) {                    Log.e("TAG", "连接超时");                } else {                    if (null != error.networkResponse) {                        Log.e("TAG", "网络错误-code:" + error.networkResponse.statusCode);                    } else {                        Log.e("TAG", "网络错误");                    }                }            }        }) {    @Override    protected Map<String, String> getParams() {        //在这里设置需要post的参数        HashMap<String, String> params = new HashMap<>();        params.put("key", "value");        return params;    }};stringRequest.setCookie("sid");//此处就是需要设置的Cookie中的sidstringRequest.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 1, 1.0f));//设置参数mQueue.add(stringRequest);//方法请求队列中

上面既然使用了Volley发送带有Cookie的HTTP请求,那自然就有使用Volley获取HTTP Cookie的方法。

获取响应Cookie

获取HTTP的Header通过重写 parseNetworkResponse(NetworkResponse response) 方法实现,获取到Header之后取出其中的Cookie并保存起来,下次请求时带上,获取方式如下:

StringRequest request = new StringRequest(Request.Method.POST, Api.LOGIN_LOGIN,        new Response.Listener<String>() {            @Override            public void onResponse(String s) {                Log.e("TAG", response);            }        },        new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError volleyError) {                callback.onError(Column.INTERNET_ERROR);            }        }) {    @Override    protected Response<String> parseNetworkResponse(            NetworkResponse response) {        try {            Map<String, String> responseHeaders = response.headers;            String cookie = responseHeaders.get("Set-Cookie");//此处获取到Cookie,可以保存到缓存中下次使用            //todo save cookie            String dataString = new String(response.data, "UTF-8");            return Response.success(dataString, HttpHeaderParser.parseCacheHeaders(response));        } catch (UnsupportedEncodingException e) {            return Response.error(new ParseError(e));        }    }    @Override    protected Map<String, String> getParams() throws AuthFailureError {        return params;    }};request.setRetryPolicy(new DefaultRetryPolicy(timeOut, connectCount, 1.0f));mQueue.add(request);

通过重写上面的 parseNetworkResponse(NetworkResponse response) 方法就可以获取到HTTP的header,按需求取出Cookie并保存起来。
另外,HTTP中,服务端响应的HTTP数据中的 Cookie 保存在 Header 的 Set-Cookie 字段中,客户端请求的 Cookie 保存在 Header 的 Cookie 中,其中内容可以自己定义,一般至少需要设置,格式如上面的 CookieRequest 中的 setCookie() .

0 0