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

来源:互联网 发布:电信4g网络接入点设置 编辑:程序博客网 时间:2024/05/16 23:56


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
24
25
26
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
 
StringRequest stringRequest = newStringRequest(Request.Method.POST,httpurl,
    newResponse.Listener<string>() {
        @Override
        publicvoid onResponse(String response) {
            Log.d(TAG,"response -> " + response);
        }
    },newResponse.ErrorListener() {
        @Override
        publicvoid onErrorResponse(VolleyError error) {
            Log.e(TAG, error.getMessage(), error);
        }
    }) {
    @Override
    protectedMap<string, string=""> getParams() {
        //在这里设置需要post的参数
              Map<string, string=""> map = newHashMap<string, string="">(); 
            map.put("name1","value1"); 
            map.put("name2","value2"); 
 
          returnparams;
    }
};       
 
requestQueue.add(stringRequest);</string,></string,></string,></string>
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
41
42
43
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
 
Map<string, string=""> map = newHashMap<string, string="">(); 
map.put("name1","value1"); 
map.put("name2","value2"); 
 
JSONObject jsonObject = newJSONObject(params);
JsonRequest<jsonobject> jsonRequest = newJsonObjectRequest(Method.POST,httpurl, jsonObject,
    newResponse.Listener<jsonobject>() {
        @Override
        publicvoid onResponse(JSONObject response) {
            Log.d(TAG,"response -> " + response.toString());
 
        }
    },newResponse.ErrorListener() {
        @Override
        publicvoid 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
    publicMap<string, string=""> getHeaders() {
        HashMap<string, string=""> headers = newHashMap<string, string="">();
        headers.put("Accept","application/json");
        headers.put("Content-Type","application/json; charset=UTF-8");
                 
        returnheaders;
    }
};
requestQueue.add(jsonRequest);</string,></string,></string,></string,></string,></string,></jsonobject></jsonobject></string,></string,>
看了上面这段代码,会觉得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
35
36
privateclass NormalPostRequest extendsRequest<jsonobject> {
    privateMap<string, string=""> mMap;
    privateListener<jsonobject> mListener;
 
    publicNormalPostRequest(String url, Listener<jsonobject> listener,ErrorListener errorListener, Map<string, string=""> map) {
        super(Request.Method.POST, url, errorListener);
             
        mListener = listener;
        mMap = map;
    }
     
    //mMap是已经按照前面的方式,设置了参数的实例
    @Override
    protectedMap<string, string=""> getParams() throwsAuthFailureError {
        returnmMap;
    }
     
    //此处因为response返回值需要json数据,和JsonObjectRequest类一样即可
    @Override
    protectedResponse<jsonobject> parseNetworkResponse(NetworkResponse response) {
        try{
            String jsonString = newString(response.data,HttpHeaderParser.parseCharset(response.headers));
                 
            returnResponse.success(newJSONObject(jsonString),HttpHeaderParser.parseCacheHeaders(response));
        }catch(UnsupportedEncodingException e) {
            returnResponse.error(newParseError(e));
        }catch(JSONException je) {
            returnResponse.error(newParseError(je));
        }
    }
 
    @Override
    protectedvoid deliverResponse(JSONObject response) {
        mListener.onResponse(response);
    }
}</jsonobject></string,></string,></jsonobject></jsonobject></string,></jsonobject>
接下来的调用方式和前面差不多,生成一个Request实例,加入队列中即可.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
 
Request<jsonobject> request = newNormalPostRequest(httpurl,
    newResponse.Listener<jsonobject>() {
        @Override
        publicvoid onResponse(JSONObject response) {
            Log.d(TAG,"response -> " + response.toString());
        }
    },newResponse.ErrorListener() {
        @Override
        publicvoid onErrorResponse(VolleyError error) {
            Log.e(TAG, error.getMessage(), error);
        }
    }, params);
 
requestQueue.add(request);</jsonobject></jsonobject>
以上代码在android 4.3环境下测试通过.

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
24
25
26
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
 
StringRequest stringRequest = newStringRequest(Request.Method.POST,httpurl,
    newResponse.Listener<string>() {
        @Override
        publicvoid onResponse(String response) {
            Log.d(TAG,"response -> " + response);
        }
    },newResponse.ErrorListener() {
        @Override
        publicvoid onErrorResponse(VolleyError error) {
            Log.e(TAG, error.getMessage(), error);
        }
    }) {
    @Override
    protectedMap<string, string=""> getParams() {
        //在这里设置需要post的参数
              Map<string, string=""> map = newHashMap<string, string="">(); 
            map.put("name1","value1"); 
            map.put("name2","value2"); 
 
          returnparams;
    }
};       
 
requestQueue.add(stringRequest);</string,></string,></string,></string>
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
41
42
43
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
 
Map<string, string=""> map = newHashMap<string, string="">(); 
map.put("name1","value1"); 
map.put("name2","value2"); 
 
JSONObject jsonObject = newJSONObject(params);
JsonRequest<jsonobject> jsonRequest = newJsonObjectRequest(Method.POST,httpurl, jsonObject,
    newResponse.Listener<jsonobject>() {
        @Override
        publicvoid onResponse(JSONObject response) {
            Log.d(TAG,"response -> " + response.toString());
 
        }
    },newResponse.ErrorListener() {
        @Override
        publicvoid 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
    publicMap<string, string=""> getHeaders() {
        HashMap<string, string=""> headers = newHashMap<string, string="">();
        headers.put("Accept","application/json");
        headers.put("Content-Type","application/json; charset=UTF-8");
                 
        returnheaders;
    }
};
requestQueue.add(jsonRequest);</string,></string,></string,></string,></string,></string,></jsonobject></jsonobject></string,></string,>
看了上面这段代码,会觉得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
35
36
privateclass NormalPostRequest extendsRequest<jsonobject> {
    privateMap<string, string=""> mMap;
    privateListener<jsonobject> mListener;
 
    publicNormalPostRequest(String url, Listener<jsonobject> listener,ErrorListener errorListener, Map<string, string=""> map) {
        super(Request.Method.POST, url, errorListener);
             
        mListener = listener;
        mMap = map;
    }
     
    //mMap是已经按照前面的方式,设置了参数的实例
    @Override
    protectedMap<string, string=""> getParams() throwsAuthFailureError {
        returnmMap;
    }
     
    //此处因为response返回值需要json数据,和JsonObjectRequest类一样即可
    @Override
    protectedResponse<jsonobject> parseNetworkResponse(NetworkResponse response) {
        try{
            String jsonString = newString(response.data,HttpHeaderParser.parseCharset(response.headers));
                 
            returnResponse.success(newJSONObject(jsonString),HttpHeaderParser.parseCacheHeaders(response));
        }catch(UnsupportedEncodingException e) {
            returnResponse.error(newParseError(e));
        }catch(JSONException je) {
            returnResponse.error(newParseError(je));
        }
    }
 
    @Override
    protectedvoid deliverResponse(JSONObject response) {
        mListener.onResponse(response);
    }
}</jsonobject></string,></string,></jsonobject></jsonobject></string,></jsonobject>
接下来的调用方式和前面差不多,生成一个Request实例,加入队列中即可.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
 
Request<jsonobject> request = newNormalPostRequest(httpurl,
    newResponse.Listener<jsonobject>() {
        @Override
        publicvoid onResponse(JSONObject response) {
            Log.d(TAG,"response -> " + response.toString());
        }
    },newResponse.ErrorListener() {
        @Override
        publicvoid onErrorResponse(VolleyError error) {
            Log.e(TAG, error.getMessage(), error);
        }
    }, params);
 
requestQueue.add(request);</jsonobject></jsonobject>
以上代码在android 4.3环境下测试通过.
0 0
原创粉丝点击