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

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

时间: 2024-10-19 06:18:00

Android Volley框架的几种post提交请求方式的相关文章

Android——Volley框架学习总结

Volley框架特点: 适用于频繁请求而每次请求数据量不会很大: 在请求的基础上做了磁盘缓存: 防止多次相同请求浪费资源: 提供String.Json.图片异步下载: 网络请求的优先级处理: 图片请求无需担心生命周期问题. Volley框架使用: 首先,通过Volley的静态方法new一个请求队列 1 RequestQueue mQueue = Volley.newRequestQueue(context); 假如我们创建一个StringRequest实例(Volley提供,StringRequ

Android Volley框架使用流程(源码方面)

以前在android上网络通信都是使用的Xutils 因为用它可以顺道处理了图片和网络这两个方面,后来发觉Xutils里面使用的是HttpClient  而Google在6.0的版本上已经把HttpClient废除了,所以开始寻找新的网络框架,okhttp也用过,但是它是在作用在UI线程,使用起来还需要用handler 所以就先用着Volley框架了.  这里我先分析下Volley框架的简单网络请求的源码. 使用Volley请求网络数据的简单过程: RequestQueue queue = Vo

Android Volley 框架的使用(一)

为什么要使用Volley框架 开发android应用很多时候都要涉及网络操作,Android SDK中提供了HttpClient 和 HttpUrlConnection两种方式用来处理网络操作,但当应用比较复杂的时候需要我们编写大量的代码处理很多东西:图像缓存,请求的调度等等: 而Volley框架就是为解决这些而生的,它与2013年Google I/O大会上被提出:使得Android应用网络操作更方便更快捷:抽象了底层Http Client等实现的细节,让开发者更专注与产生RESTful Req

Android Volley框架完全解析

2013年Google I/O大会上推出了一个新的网络通信框架--Volley.Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片.除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如

android Volley 框架详解

开发android应用很多时候都要涉及网络操作,Android SDK中提供了HttpClient 和 HttpUrlConnection两种方式用来处理网络操作,但当应用比较复杂的时候需要我们编写大量的代码处理很多东西:图像缓存,请求的调度等等: 而Volley框架就是为解决这些而生的,它与2013年Google I/O大会上被提出:使得Android应用网络操作更方便更快捷:抽象了底层Http Client等实现的细节,让开发者更专注与产生RESTful Request.另外,Volley在

Android Volley框架的使用

在Android开发中,经常要通过HTTP请求访问网络.为了使通过HTTP请求访问网络的过程更加简单,2013提出了新的HTTP通信框架--Volley.Volley使用起来非常简单,适用于网络访问频繁.通信数据量小的情况. 下载volley.jar文件并导入工程,加上访问网络的权限,就可以使用Volley框架访问网络了. <uses-permission android:name="android.permission.INTERNET"/> 访问的过程也十分简单:(1)

Android Volley框架的使用(二)

使用请求队列RequestQueue Volley中的Request都需要添加到RequestQueue中才能执行,所以首先需要创建一个RequestQueue RequestQueue = Volley.newRequestQueue(mContext); 通常情况在一个应用中需要统一管理一个请求队列,所以采用单例模式(注意:这不是必须的),创建一个类并在这个类中初始化RequestQueue等核心对象,以及实现一些我们所需的方法: 代码如下: package com.javen.volley

Android Volley 框架JSON中文乱码问题的解决

近期在项目中使用Volley作为网络通信框架,却发现在传输中文时会出现乱码.先交代一下项目的软硬件的基础设施 线上: Django+restful_framework+monogdb APP: Android + volley 在使用android端测试之前,我使用了chrome中的Postman这款插件进行了测试,发现,中文读取是正常的.说明服务器返回的是UTF-8字符编码的数据. 但是为什么在Android端会出现乱码的现象呢. 我在想是不是本地端的字符编码出了问题? 我就是用String类

Android Volley框架的使用(三)

Image Request 为了更方便的使用Volley中的图片请求,我们同样先在VolleyController类中封装一个ImageLoader package com.javen.volley; import android.content.Context; import android.text.TextUtils; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.