Android Volley框架的几种post提交请求方式

【Android Volley框架的几种post提交请求方式】幽映每白日,清辉照衣裳。这篇文章主要讲述Android Volley框架的几种post提交请求方式相关的知识,希望能为你提供帮助。
首先简单描写叙述一下Google的android开发团队在2013年推出的一个网络通信框架Volley.它的设计目标是进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比方下载文件等,Volley的表现就不尽如人意。

在app开发中,我们最常见的就是从appclient向服务端发一个http请求.对于两种主要的web请求方式get和post来说,get请求方式相对照较简单,在此略过不表.本文重点描写叙述一下通过volley进行几种post提交的方式.

1.client以普通的post方式进行提交,服务端返回字符串

RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext()); StringRequest stringRequest = new StringRequest(Request.Method.POST,httpurl, new Response.Listener< String> () { @Override public void onResponse(String response) { Log.d(TAG, "response -> " + response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e(TAG, error.getMessage(), error); } }) { @Override protected Map< String, String> getParams() { //在这里设置须要post的參数 Map< String, String> map = new HashMap< String, String> (); map.put("name1", "value1"); map.put("name2", "value2"); return params; } }; requestQueue.add(stringRequest);

2.client以json串的post请求方式进行提交,服务端返回json串

RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext()); Map< String, String> map = new HashMap< String, String> (); map.put("name1", "value1"); map.put("name2", "value2"); JSONObject jsonObject = new JSONObject(params); JsonRequest< JSONObject> jsonRequest = new JsonObjectRequest(Method.POST,httpurl, jsonObject, new Response.Listener< JSONObject> () { @Override public void onResponse(JSONObject response) { Log.d(TAG, "response -> " + response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e(TAG, error.getMessage(), error); } }) { //注意此处override的getParams()方法,在此处设置post须要提交的參数根本不起作用 //必须象上面那样,构成JSONObject当做实參传入JsonObjectRequest对象里 //所以这种方法在此处是不须要的 //@Override //protected Map< String, String> getParams() { //Map< String, String> map = new HashMap< String, String> (); //map.put("name1", "value1"); //map.put("name2", "value2"); //return params; //}@Override public Map< String, String> getHeaders() { HashMap< String, String> headers = new HashMap< String, String> (); headers.put("Accept", "application/json"); headers.put("Content-Type", "application/json; charset=UTF-8"); return headers; } }; requestQueue.add(jsonRequest);

看了上面这段代码,会认为volley这个框架实在是还不够完好,使用JsonObjectRequest对象提交一个post请求,假设有參数须要提交,就必须以JSONObject的json串方式提交.
假设服务端并不支持这样的方式呢?比方常见的spring mvc服务端,就非常难支持json的请求方式.
那么我们想实现这个目标,就须要使用以下给出的办法.

3.client以普通的post方式进行提交,服务端返回json串
首先在Activity类里,继承Request实现一个NormalPostRequest类
private class NormalPostRequest extends Request< JSONObject> { private Map< String, String> mMap; private Listener< JSONObject> mListener; public NormalPostRequest(String url, Listener< JSONObject> listener,ErrorListener errorListener, Map< String, String> map) { super(Request.Method.POST, url, errorListener); mListener = listener; mMap = map; }//mMap是已经依照前面的方式,设置了參数的实例 @Override protected Map< String, String> getParams() throws AuthFailureError { return mMap; }//此处由于response返回值须要json数据,和JsonObjectRequest类一样就可以 @Override protected Response< JSONObject> parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data,HttpHeaderParser.parseCharset(response.headers)); return Response.success(new JSONObject(jsonString),HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JSONException je) { return Response.error(new ParseError(je)); } }@Override protected void deliverResponse(JSONObject response) { mListener.onResponse(response); } }

接下来的调用方式和前面几乎相同,生成一个Request实例,增加队列中就可以.
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext()); Request< JSONObject> request = new NormalPostRequest(httpurl, new Response.Listener< JSONObject> () { @Override public void onResponse(JSONObject response) { Log.d(TAG, "response -> " + response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e(TAG, error.getMessage(), error); } }, params); requestQueue.add(request);

以上代码在android 4.3环境下測试通过.
















    推荐阅读