在android开发中,不可避免的都使用到了网络的请求,而volley是一个高效的网络请求框架,在之前的项目和现在的项目都是用的是volley进行网络的请求,因此很有必要在这里整理下volley的使用方法,关于volley的源码在这里不再分析了,用到的地方简单的提一下,这篇博文将基于volley进行网络请求时候的各种请求,包括get请求,post请求,和String格式请求,json格式请求,xml格式请求,请求头,请求体,请求参数等进行封装和使用。
由于volley请求是基于队列的,所以不管在什么请求下都需要创建请求队列,是请求添加到队列里面。在volley初始化一般是在activity加载或者fragment创建的时候进行初始化操作:
RequestQueue requestQueue = Volley.newRequestQueue(this);
一、String格式的请求
String格式的请求比较简单,在这里之说一下简单的应用
1、get请求
private void requestTest() {
//参数一可以省略默认是get请求
StringRequest stringRequest = new StringRequest(Request.Method.GET, "https://www.baidu.com/", new Listener<String>() {
@Override
public void onResponse(String response) {
//response为请求的结果
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue.add(stringRequest)
}
2、post请求
private void requestTest() {
StringRequest stringRequest = new StringRequest(Request.Method.POST, "http://192.168.5.110:8080/list", new Listener<String>() {
@Override
public void onResponse(String response) {
//response为请求的结果
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}){
//重写getParams添加参数
@Override
protected Map<String, String> getParams() throws AuthFailureError {
HashMap<String,String> map = new HashMap<String, String>();
map.put("name", "zhangsan");
map.put("age","28");
return map;
}
};
requestQueue.add(stringRequest);
}
二、json格式的请求
1、json的生成及其解析
使用规则:遇到花括号使用JSONObject,遇到方括号使用JSONArray。
例如:
JSONObject的生成:
方法一:使用hashmap集合
HashMap<String, String> params = new HashMap<String, String>(); params.put("phone", "17310386760"); params.put("messageCode", "1512"); JSONObject jsonObject = new JSONObject(params );
方法二:直接使用put
JSONObject jsonObject = new JSONObject(); try { jsonObject.put("phone", "15177777777"); params.put("messageCode", "1512"); } catch (JSONException e) { e.printStackTrace(); }
方法三:使用gsongson的生成:
复杂的使用javabean,简单的使用:new Gson().toJson(String str);
2、请求格式为json的volley的封装
2-1、请求格式是jsonObject形式的封装
2-2、请求格式是普通json形式的封装public class JsonObjectRequset extends JsonRequest<String> { public JsonObjectRequset(String url, String requestBody, Response.Listener<String> listener, Response.ErrorListener errorListener) { super(url, requestBody, listener, errorListener); } public JsonObjectRequset(int method, String url, String requestBody, Response.Listener<String> listener, Response.ErrorListener errorListener) { super(method, url, requestBody, listener, errorListener); } //封装返回的对象 @Override protected Response<String> parseNetworkResponse(NetworkResponse response) { // return null; String parsed; try { parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); } catch (UnsupportedEncodingException e) { parsed = new String(response.data); } return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response)); } //请求头的设置 @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = new HashMap<String, String>(); headers.put("Charset", "UTF-8"); headers.put("Content-Type", "application/json"); return headers; } }
3、使用public class JsonRequset extends JsonRequest<String> { public JsonRequset(String url, String requestBody, Response.Listener<String> listener, Response.ErrorListener errorListener{ super(url, requestBody, listener, errorListener); } public JsonRequset(int method, String url, String requestBody, Response.Listener<String> listener, Response.ErrorListener errorListener) { super(method, url, requestBody, listener, errorListener); } //封装返回的对象 @Override protected Response<String> parseNetworkResponse(NetworkResponse response) { // return null; String parsed; try { parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); } catch (UnsupportedEncodingException e) { parsed = new String(response.data); } return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response)); } //请求头的设置 @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = new HashMap<String, String>(); headers.put("Charset", "UTF-8"); headers.put("Content-Type", "application/json"); return headers; } //请求体的设置 @Override public String getBodyContentType() { // return String.format("application/x-www-form-urlencoded; charset=%s", "utf-8"); return super.getBodyContentType(); }
public void requestTest() { String url = "http://192.168.5.110:8080/list"; Map<String, String> params = new HashMap<String, String>(); params.put("identity", "111111111111111"); params.put("messageCode", "1512"); params.put("randClient", "5351"); JSONObject jsonObject = new JSONObject(params); JsonRequst jsonRequest = new JsonRequst(Request.Method.POST, url, jsonObject.toString, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.d("TAG", response + "成功"); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d("TAG", new String(error.networkResponse.data) + "错误"); } }); requestQueue.add(jsonRequest); }
三、xml格式的请求
1、xml的生成及其解析
关于xml的请求和解析详情参考另一篇博文:点击打开链接
http://blog.csdn.net/yoonerloop/article/details/53166478
2、xml的网络请求get请求
/**
* Description: xml的get请求
* Date : 2016/10/24 16:21
*/
public class sad extends Request<XmlPullParser> {
private final Response.Listener<XmlPullParser> mListener;
public sad(int method, String url, Response.Listener<XmlPullParser> listener,
Response.ErrorListener errorListener) {
super(method, url, errorListener);
mListener = listener;
}
public sad(String url, Response.Listener<XmlPullParser> listener, Response.ErrorListener errorListener) {
this(Method.GET, url, listener, errorListener);
}
@Override
protected Response<XmlPullParser> parseNetworkResponse(NetworkResponse response) {
try {
String xmlString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlString));
return Response.success(xmlPullParser, HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (XmlPullParserException e) {
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(XmlPullParser response) {
try {
mListener.onResponse(response);
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
}
}
3、xml的网络请求post请求(一)
/**
* Description:请求字符串格式,xml,返回XmlPullParser格式xml,requestBody,为请求的xml
* Date : 2016/10/26 10:39
*/
public class aaaa extends Request<XmlPullParser> {
/** Charset for request. */
private static final String PROTOCOL_CHARSET = "utf-8";
/** Content type for request. */
private static final String PROTOCOL_CONTENT_TYPE =
String.format("text/xml; charset=%s", PROTOCOL_CHARSET);
private final String mRequestBody;
private final Response.Listener<XmlPullParser> mListener;
public aaaa(int method, String url,String requestBody, Response.Listener<XmlPullParser> listener,
Response.ErrorListener errorListener) {
super(method, url, errorListener);
mListener = listener;
mRequestBody=requestBody;
}
public aaaa(String url,String requestBody, Response.Listener<XmlPullParser> listener,
Response.ErrorListener errorListener) {
this(Method.POST, url,requestBody, listener, errorListener);
}
@Override
protected Response<XmlPullParser> parseNetworkResponse(
NetworkResponse response) {
try {
String xmlString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlString));
return Response.success(xmlPullParser,
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (XmlPullParserException e) {
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(XmlPullParser response) {
try {
mListener.onResponse(response);
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
}
/**
* @deprecated Use {@link #getBodyContentType()}.
*/
@Override
public String getPostBodyContentType() {
return getBodyContentType();
}
/**
* @deprecated Use {@link #getBody()}.
*/
@Override
public byte[] getPostBody() {
return getBody();
}
@Override
public String getBodyContentType() {
return PROTOCOL_CONTENT_TYPE;
}
@Override
public byte[] getBody() {
try {
return mRequestBody == null ? null : mRequestBody.getBytes(PROTOCOL_CHARSET);
} catch (UnsupportedEncodingException uee) {
VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",
mRequestBody, PROTOCOL_CHARSET);
return null;
}
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = new HashMap<String, String>();
headers.put("Charset", "UTF-8");
headers.put("Content-Type", "text/xml");
headers.put("Accept-Encoding", "*/*");
headers.put("Connection", "close");
return headers;
}
}
4、xml的网络请求post请求(二)
/**
* Description:请求字符串形式xml,返回字符串形式的xml字符串
* Date : 2016/10/26 17:08
*/
public class StringXMLRequst extends Request<String> {
private static final String PROTOCOL_CHARSET="utf-8";
private static final String PROTOCOL_CONTENT_TYPE=String.format("text/xml;charset=%s", PROTOCOL_CHARSET);
private final String mRequestBody;
private final Listener<String> mListener;
public StringXMLRequst(int method, String url, String requestBody, Listener<String> listener, ErrorListener errorlistener) {
super(method, url,errorlistener);
this.mListener=listener;
this.mRequestBody=requestBody;
}
public StringXMLRequst(String url, String requestBody, Listener<String> listener, ErrorListener errorlistener) {
this(Method.POST, url,requestBody, listener,errorlistener);
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
try {
String xmlString=new String(response.data,HttpHeaderParser.parseCharset(response.headers));
return Response.success(xmlString, HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
@Override
protected void deliverResponse(String response) {
try {
mListener.onResponse(response);
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
}
/*@Override
public RetryPolicy getRetryPolicy() {
RetryPolicy retryPolicy = new DefaultRetryPolicy(15*1000,
0,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
return retryPolicy;
}*/
@Override
public String getPostBodyContentType() {
return getBodyContentType();
}
@Override
public byte[] getPostBody() throws AuthFailureError {
return getBody();
}
@Override
public String getBodyContentType() {
return PROTOCOL_CONTENT_TYPE;
}
@Override
public byte[] getBody() throws AuthFailureError {
// TODO Auto-generated method stub
try {
return mRequestBody==null?super.getBody():mRequestBody.getBytes(PROTOCOL_CHARSET);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers=new HashMap<>();
headers.put("Charset", "UTF-8");
headers.put("Content-Type", "text/xml");
headers.put("Accept-Encoding", "*/*");
return headers;
}
}
以上三与四的区别是:请求的的均为String格式的xml,三返回的XmlPullParser格式数据解析解析,四返回的是String格式的字符串记得加上权限:<uses-permission android:name="android.permission.INTERNET"/>