首先簡單描述一下Google的Android開發團隊在2013年推出的一個網絡通信框架Volley.它的設計目標是進行數據量不大,但通信頻繁的網絡操作,而對於大數據量的網絡操作,比如下載文件等,Volley的表現就不盡如人意。
在app開發中,我們最常見的就是從app客戶端向服務端發一個http請求.對於兩種基本的web請求方式get和post來說,get請求方式相對比較簡單,在此略過不表.本文重點描述一下通過volley進行幾種post提交的方式.
1.客戶端以普通的post方式進行提交,服務端返回字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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.客戶端以json串的post請求方式進行提交,服務端返回json串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
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.客戶端以普通的post方式進行提交,服務端返回json串
首先在Activity類裏,繼承Request實現一個NormalPostRequest類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
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實例,加入隊列中即可.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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環境下測試通過.
原文地址:http://www.open-open.com/lib/view/open1407727047207.html