Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Volley框架的幾種post提交請求方式

Android Volley框架的幾種post提交請求方式

編輯:關於Android編程

首先簡單描述一下Google的Android開發團隊在2013年推出的一個網絡通信框架Volley.它的設計目標是進行數據量不大,但通信頻繁的網絡操作,而對於大數據量的網絡操作,比如下載文件等,Volley的表現就不盡如人意。

在app開發中,我們最常見的就是從app客戶端向服務端發一個http請求.對於兩種基本的web請求方式get和post來說,get請求方式相對比較簡單,在此略過不表.本文重點描述一下通過volley進行幾種post提交的方式.

1.客戶端以普通的post方式進行提交,服務端返回字符串

RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());

StringRequest stringRequest = new StringRequest(Request.Method.POST,httpurl,
    new Response.Listener() {
        @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 getParams() {
        //在這裡設置需要post的參數
              Map map = new HashMap();  
            map.put("name1", "value1");  
            map.put("name2", "value2");  

          return params;
    }
};        

requestQueue.add(stringRequest);
2.客戶端以json串的post請求方式進行提交,服務端返回json串

RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());

Map map = new HashMap();  
map.put("name1", "value1");  
map.put("name2", "value2");  

JSONObject jsonObject = new JSONObject(params);
JsonRequest jsonRequest = new JsonObjectRequest(Method.POST,httpurl, jsonObject,
    new Response.Listener() {
        @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 getParams() {                
//          Map map = new HashMap();  
//            map.put("name1", "value1");  
//            map.put("name2", "value2");  
                
//        return params;
//    }
            
    @Override
    public Map getHeaders() {
        HashMap headers = new HashMap();
        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類
private class NormalPostRequest extends Request {
    private Map mMap;
    private Listener mListener;

    public NormalPostRequest(String url, Listener listener,ErrorListener errorListener, Map map) {
        super(Request.Method.POST, url, errorListener);
            
        mListener = listener;
        mMap = map;
    }
    
    //mMap是已經按照前面的方式,設置了參數的實例
    @Override
    protected Map getParams() throws AuthFailureError {
        return mMap;
    }
    
    //此處因為response返回值需要json數據,和JsonObjectRequest類一樣即可
    @Override
    protected Response 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 request = new NormalPostRequest(httpurl,
    new Response.Listener() {
        @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環境下測試通過.

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved