Volley中json请求POST

来源:互联网 发布:ubuntu安装qt5 编辑:程序博客网 时间:2024/05/01 11:13

原文:http://blog.csdn.net/onlysnail/article/details/47905375

请求的是一个json串,但是这里自定义的Request传入的参数不是一个json串。所以还需要在自定义的类中重写一个方法:

[java] view plain copy
 print?
  1. @Override  
  2. public String getBodyContentType() {  
  3.     return "application/x-www-form-urlencoded; charset=" + getParamsEncoding();  
  4. }  

这段代码从Request.java中Copy。


自定义的Request

[java] view plain copy
 print?
  1. public class MyJsonObjectRequest extends JsonRequest<JSONObject> {  
  2.   
  3.     String stringRequest;  
  4.   
  5.     /** 
  6.      * 这里的method必须是Method.POST,也就是必须带参数。 
  7.      * 如果不想带参数,可以用JsonObjectRequest,给它构造参数传null。GET方式请求。 
  8.      * @param stringRequest 格式应该是 "key1=value1&key2=value2" 
  9.      */  
  10.   
  11.     public MyJsonObjectRequest(String url, String stringRequest,  
  12.                              Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {  
  13.         super(Method.POST, url,stringRequest , listener, errorListener);  
  14.         this.stringRequest = stringRequest;  
  15.     }  
  16.   
  17.     @Override  
  18.     public String getBodyContentType() {  
  19.         return "application/x-www-form-urlencoded; charset=" + getParamsEncoding();  
  20.     }  
  21.   
  22.     @Override  
  23.     protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {  
  24.         try {  
  25.             String jsonString = new String(response.data,  
  26.                     HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));  
  27.             return Response.success(new JSONObject(jsonString),  
  28.                     HttpHeaderParser.parseCacheHeaders(response));  
  29.         } catch (UnsupportedEncodingException e) {  
  30.             return Response.error(new ParseError(e));  
  31.         } catch (JSONException je) {  
  32.             return Response.error(new ParseError(je));  
  33.         }  
  34.     }  

请求方法:

[java] view plain copy
 print?
  1. private void jsonObjectRequestPostSuccess1(){  
  2.         String url = "http://route.showapi.com/213-3";  
  3.         Map<String,String> map = DummyData.getDummyData();  
  4.         String params = appendParameter(url,map);  
  5.   
  6.         MyJsonObjectRequest jsonObjectRequest = new MyJsonObjectRequest(url,params, new Response.Listener<JSONObject>() {  
  7.             @Override  
  8.             public void onResponse(JSONObject response) {  
  9.                 responseText.setText(response.toString());  
  10.             }  
  11.         }, new Response.ErrorListener() {  
  12.             @Override  
  13.             public void onErrorResponse(VolleyError error) {  
  14.                 responseText.setText(error.getMessage());  
  15.             }  
  16.         });  
  17.         mQueue.add(jsonObjectRequest);  
  18.     }  
  19.   
  20.   
  21.   
  22.     private String appendParameter(String url,Map<String,String> params){  
  23.         Uri uri = Uri.parse(url);  
  24.         Uri.Builder builder = uri.buildUpon();  
  25.         for(Map.Entry<String,String> entry:params.entrySet()){  
  26.             builder.appendQueryParameter(entry.getKey(),entry.getValue());  
  27.         }  
  28.         return builder.build().getQuery();  
  29.     }  


当然,也并非一定要自定义一个JsonObjectRequest不可,如果了解Request的继承关系和参数的传递流程,直接使用JsonObjectRequest也是可以的。

[java] view plain copy
 print?
  1. /** 
  2.  * 不想自定义,非得用JsonObjectRequestPost不可,只要你不嫌麻烦。 
  3.  */  
  4. private void jsonObjectRequestPostSuccess2(){  
  5.     String url = "http://route.showapi.com/213-3";  
  6.     Map<String,String> params = DummyData.getDummyData();  
  7.     final String mRequestBody = appendParameter(url,params);  
  8.   
  9.     JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,url,nullnew Response.Listener<JSONObject>() {  
  10.         @Override  
  11.         public void onResponse(JSONObject response) {  
  12.             responseText.setText(response.toString());  
  13.         }  
  14.     }, new Response.ErrorListener() {  
  15.         @Override  
  16.         public void onErrorResponse(VolleyError error) {  
  17.             responseText.setText(error.getMessage());  
  18.         }  
  19.     }){  
  20.         @Override  
  21.         public String getBodyContentType() {  
  22.             return "application/x-www-form-urlencoded; charset=" + getParamsEncoding();  
  23.         }  
  24.   
  25.         @Override  
  26.         public byte[] getBody() {  
  27.             try {  
  28.                 return mRequestBody == null ? null : mRequestBody.getBytes(PROTOCOL_CHARSET);  
  29.             } catch (UnsupportedEncodingException uee) {  
  30.                 VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",  
  31.                         mRequestBody, PROTOCOL_CHARSET);  
  32.                 return null;  
  33.             }  
  34.         }  
  35.     };  
  36.     mQueue.add(jsonObjectRequest);  
  37. }  
  38.   
  39. private String appendParameter(String url,Map<String,String> params){  
  40.     Uri uri = Uri.parse(url);  
  41.     Uri.Builder builder = uri.buildUpon();  
  42.     for(Map.Entry<String,String> entry:params.entrySet()){  
  43.         builder.appendQueryParameter(entry.getKey(),entry.getValue());  
  44.     }  
  45.     return builder.build().getQuery();  
  46. }  

总结:

使用JsonObjectRequest 请求服务器,它的参数是以 json 串 的格式传输给服务器的,考虑服务器是否支持这种格式,可以在JsonRequest的PROTOCOL_CONTENT_TYPE中看到它传递参数的类型。如果服务器支持的是 http:...?key1=value1&key2=value2这种格式,也就是对应Request.java中的PROTOCOL_CONTENT_TYPE变量类型。就需要做一些改动,有两种方式来实现。第一种方式是定义一个类继承JsonObjectRequest,第二种直接使用JsonObjectRequest。原理是相同的,重点是重写匿名内部类的getBodyContentType这个方法。不能重写getParams这个方法类传参。


使用StringRequest 如果是带参数,或者Http Header,或者其他,可以重写它匿名内部类方法,如getParams(),getHeader()等等。

0 0
原创粉丝点击