文档章节

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

gaolu
 gaolu
发布于 2014/08/08 15:00
字数 829
阅读 171
收藏 15

首先简单描述一下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环境下测试通过.


© 著作权归作者所有

gaolu
粉丝 29
博文 58
码字总数 52768
作品 0
朝阳
架构师
私信 提问
加载中

评论(1)

6
635066023
感谢分享
Android Http通讯模块封装

大多数的Android应用程序都会使用HTTP协议来发送和接收网络数据,而Android中主要提供了两种方式来进行HTTP操 作,HttpURLConnection和HttpClient。这两种方式都支持HTTPS协议、以流的形式进...

iSnowFlake
2015/08/19
65
0
修改源码,使volley框架下支持发送和读取cookie

本文为原创,转载请注明出处,否则将依法追究版权 修改源码,让不支持cookie发送的volley框架支持cookie 我们平时开发android应用都需要用到网络技术,通常采用http协议来发起请求并接受网络...

刘小米
2014/12/29
10.3K
11
Android Volley完全解析(一),初识Volley的基本用法

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482095 1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用...

mingxun
2014/04/18
207
0
android中网络操作使用总结(http)

Android是作为智能手机的操作系统,我们开发的应用,大多数也都需要连接网络,通过网络发送数据、获取数据,因此作为一个应用开发者必须熟悉怎么进行网络访问与连接。通常android中进行网络连...

码农明明
2014/05/22
3K
6
ym—— Android网络框架Volley(体验篇)

Volley是Google I/O 2013推出的网络通信库,在volley推出之前我们一般会选择比较成熟的第三方网络通信库,如: android-async-http retrofit okhttp 他们各有优劣,之前个人则比较喜欢用and...

小近
2014/11/06
3.9K
4

没有更多内容

加载失败,请刷新页面

加载更多

直击JDD | 陈生强:京东数科的底层是数字化操作系统

11月19日,由京东集团主办的JDD-2019京东全球科技探索者大会在京开幕,京东数字科技集团CEO陈生强作了题为“以科技为美,为价值而生”的主旨发言,再论“数字科技”,向与会嘉宾分享了京东数...

京东云技术新知
22分钟前
4
0
MVC、MVP、MVVM的定义的理解

1.MVC 即Model(模型层)、View(视图层)、Control(控制层),Model与VC分离(VC在一起),Model获取数据与业务处理(方便复用),View视图控制、Control处理逻辑。交互(数据传递)用回调...

Coding缘
37分钟前
3
0
ts结合vue 常用的目录结构

typescript在.vue中的写法 使用typescript会让你的代码结构看起来更明朗 原vue写法 import {mapGetters, mapActions} from 'vuex'import tree from './components/all/tree/tree.vue'ex......

不负好时光
38分钟前
4
0
TI达芬奇系列TMS320DM8148浮点DSP C674x + ARM Cortex-A8JTAG仿真器接口、风扇接口

由广州创龙设计的SOM-TL8148和SOM-TL8127核心板是Pin To Pin兼容,两款核心板公用同一块底板。DM8148与DM8127相比,DM8148有SATA接口,DM8127没有SATA接口;而DM8127有CSI2接口,DM8148没有。...

Tronlong创龙
40分钟前
4
0
springmvc注解开发

ps : 这东西比较简单,用来为我们使用springboot打基础 一 : 工程搭建 (一) 导包 <!-- servlet --><dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</......

扑克心
41分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部