`
sharong
  • 浏览: 485498 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
D1667ae2-8cfc-3b68-ac7c-5e282789fa4a
论开源
浏览量:8470
7eb53364-fe48-371c-9623-887640be0185
Spring-data-j...
浏览量:12774
社区版块
存档分类
最新评论

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

 
阅读更多
首先简单描述一下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<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串
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类
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环境下测试通过.
分享到:
评论
3 楼 sharong 2014-12-03  
pastjie 写道
如果把你这个封装成一个公共组件,那么在调用它 的时候,怎么得到接收到的服务器端的数据呢

volley本身是一个基于异步提交的解耦框架,所以服务端的response是异步响应的。我的做法是使用策略模式,在抽象类里写一个response的抽象方法,需要子类实现,可以参考一下。
2 楼 pastjie 2014-12-03  
如果把你这个封装成一个公共组件,那么在调用它 的时候,怎么得到接收到的服务器端的数据呢
1 楼 pastjie 2014-11-24  
    

相关推荐

Global site tag (gtag.js) - Google Analytics