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() .