volley的封装使用

在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形式的封装

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;
    }

}
2-2、请求格式是普通json形式的封装

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();
    }

3、使用
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"/>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值