Volley使用与扩展(POST,Cookie)

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中的sid
stringRequest.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() .

猜你喜欢

转载自blog.csdn.net/u013872857/article/details/71524502