zoukankan      html  css  js  c++  java
  • [转]Android-网络通信框架Volley使用详解

    1 Volley发送get请求:

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. public void getJson() {  
    2.     String url = "http://"+host+":8080/web/json.jsp?username=xjs&password=123456";  
    3.     mQueue.add(new JsonObjectRequest(Method.GET, url, null,  
    4.         new Listener<JSONObject>() {  
    5.             @Override  
    6.             public void onResponse(JSONObject response) {  
    7.                 Log.e(TAG, "response : " + response.toString());  
    8.             }  
    9.         }, new Response.ErrorListener() {  
    10.             @Override  
    11.             public void onErrorResponse(VolleyError error) {  
    12.                 String err = error.getMessage();  
    13.                 Log.e(TAG, "err : " + err);  
    14.             }  
    15.         }));  
    16. }  

    2 Volley发送post请求:

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. public void postJson() {  
    2.     String url = "http://"+host+":8080/web/json.jsp";  
    3.     StringRequest postRequest = new StringRequest(  
    4.             Request.Method.POST,   
    5.             url,  
    6.             new Response.Listener<String>() {  
    7.                 @Override  
    8.                 public void onResponse(String response) {  
    9.                     // response  
    10.                     Log.d("Response", response);  
    11.                 }  
    12.             }, new Response.ErrorListener() {  
    13.                 @Override  
    14.                 public void onErrorResponse(VolleyError error) {  
    15.                     // error  
    16.                     Log.d("Error.Response", error.getMessage());  
    17.                 }  
    18.             }) {  
    19.         @Override  
    20.         protected Map<String, String> getParams() {  
    21.             Map<String, String> params = new HashMap<String, String>();  
    22.             params.put("username", "xjs");  
    23.             params.put("password", "123456");  
    24.             return params;  
    25.         }  
    26.     };  
    27.     mQueue.add(postRequest);  
    28. }  

    3 Volley获取网络图片:

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. public void getImage() {  
    2.     String imageUrl = "http://"+host+":8080/web/image.jsp";  
    3.     NetworkImageView view = (NetworkImageView) findViewById(R.id.network_image_view);  
    4.     view.setDefaultImageResId(android.R.drawable.ic_menu_rotate);   
    5.     view.setErrorImageResId(android.R.drawable.ic_delete);   
    6.     view.setImageUrl(imageUrl, new ImageLoader(mQueue, new BitmapLruCache(1024 * 4)));  
    7. }  

    4 Volley发送Https请求,需要修改源码:

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. protected HttpURLConnection createConnection(URL url) throws IOException {  
    2.     if (url.toString().toLowerCase(Locale.CHINA).startsWith("https")) {  
    3.         HTTPSTrustManager.allowAllSSL();  
    4.     }  
    5.     return (HttpURLConnection) url.openConnection();  
    6. }  
    7. //HTTPSTrustManager.java:  
    8. public class HTTPSTrustManager implements X509TrustManager {  
    9.     private static TrustManager[] trustManagers;  
    10.     private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {};  
    11.     @Override  
    12.     public void checkClientTrusted(  
    13.             java.security.cert.X509Certificate[] x509Certificates, String s)  
    14.             throws java.security.cert.CertificateException {  
    15.         // To change body of implemented methods use File | Settings | File  
    16.         // Templates.  
    17.     }  
    18.     @Override  
    19.     public void checkServerTrusted(  
    20.             java.security.cert.X509Certificate[] x509Certificates, String s)  
    21.             throws java.security.cert.CertificateException {  
    22.         // To change body of implemented methods use File | Settings | File  
    23.         // Templates.  
    24.     }  
    25.     public boolean isClientTrusted(X509Certificate[] chain) {  
    26.         return true;  
    27.     }  
    28.     public boolean isServerTrusted(X509Certificate[] chain) {  
    29.         return true;  
    30.     }  
    31.     @Override  
    32.     public X509Certificate[] getAcceptedIssuers() {  
    33.         return _AcceptedIssuers;  
    34.     }  
    35.     public static void allowAllSSL() {  
    36.         HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {  
    37.             @Override  
    38.             public boolean verify(String arg0, SSLSession arg1) {  
    39.                 // TODO Auto-generated method stub  
    40.                 return true;  
    41.             }  
    42.         });  
    43.         SSLContext context = null;  
    44.         if (trustManagers == null) {  
    45.             trustManagers = new TrustManager[] { new HTTPSTrustManager() };  
    46.         }  
    47.         try {  
    48.             context = SSLContext.getInstance("TLS");  
    49.             context.init(null, trustManagers, new SecureRandom());  
    50.         } catch (NoSuchAlgorithmException e) {  
    51.             e.printStackTrace();  
    52.         } catch (KeyManagementException e) {  
    53.             e.printStackTrace();  
    54.         }  
    55.         HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());  
    56.     }  
    57. }  

    5 Volley获取服务端返回的cookie,需要修改源码:

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. @Override  
    2. public HttpResponse performRequest(Request<?> request,Map<String, String> additionalHeaders)   
    3.     throws IOException,AuthFailureError {  
    4.     for (Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) {  
    5.     if (header.getKey() != null) {  
    6.         String key = header.getKey();  
    7.         List<String> values = header.getValue();  
    8.         if(key.equalsIgnoreCase("set-cookie")){  
    9.             StringBuilder cookieString = new StringBuilder();  
    10.             for(String value : values){  
    11.                 cookieString.append(value).append(" ");//用 作为分隔符,cookie中不应该有回车符号  
    12.             }  
    13.             cookieString.deleteCharAt(cookieString.length() - 1);  
    14.             Header h = new BasicHeader(header.getKey(), cookieString.toString());  
    15.             response.addHeader(h);  
    16.         }else{  
    17.             Header h = new BasicHeader(header.getKey(), values.get(0));  
    18.             response.addHeader(h);  
    19.         }  
    20.     }  
    21. }  
    22. }  
    23. //然后再request中重写parseNetworkResponse():  
    24. @Override  
    25. protected Response<String> parseNetworkResponse(NetworkResponse response) {  
    26.     Response<String> superResponse = super.parseNetworkResponse(response);  
    27.     Map<String, String> responseHeaders = response.headers;  
    28.     String rawCookies = responseHeaders.get("Set-Cookie");  
    29.     //服务端返回是 set-cookie:JSESSIONID=D90B58454550B4D37C4B66A76BF27B93; Path=/otn BIGipServerotn=2564030730.64545.0000; path=/  
    30.     String part1 = substring(rawCookies, "", ";");  
    31.     String part2 = substring(rawCookies, " ", ";");  
    32.     //客户端需要的是 cookie:JSESSIONID=D90B58454550B4D37C4B66A76BF27B93; BIGipServerotn=2564030730.64545.0000;  
    33.     cookies = part1 + "; " + part2 + ";";  
    34.     return superResponse;  
    35. }  

    6 Volley发请求的时候上传cookie,在request中重写getHeaders():

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. @Override  
    2. public Map<String, String>getHeaders() throws AuthFailureError {  
    3.          if(cookies!= null && cookies.length() > 0){  
    4.                    HashMap<String,String>         headers = newHashMap<String, String>();  
    5.                    headers.put("Cookie",cookies);  
    6.                    returnheaders;  
    7.          }  
    8.          returnsuper.getHeaders();  
    9. }  

    7 Volley自定义request:

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. public class ByteArrayRequest extends Request<byte[]>{  
    2.     private final Listener<byte[]> mListener;  
    3.     public ByteArrayRequest(int method, String url, Listener<byte[]> listener, ErrorListener errlistener) {  
    4.         super(method, url, errlistener);  
    5.         mListener = listener;  
    6.     }  
    7.     @Override  
    8.     protected Response<byte[]> parseNetworkResponse(NetworkResponse response) {  
    9.         if(response == null){  
    10.             return null;  
    11.         }  
    12.         if(response.statusCode != HttpStatus.SC_OK){  
    13.             return null;  
    14.         }  
    15.         byte[] bytes = response.data;  
    16.         return Response.success(bytes, null);  
    17.     }  
    18.     @Override  
    19.     protected void deliverResponse(byte[] response) {  
    20.         if(mListener != null){  
    21.             mListener.onResponse(response);  
    22.         }  
    23.     }  
    24. }  

    8 Volley设置请求超时时间:

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. @Override  
    2. public RetryPolicy getRetryPolicy() {   
    3.          RetryPolicyretryPolicy = new DefaultRetryPolicy(5000,DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);   
    4.          returnretryPolicy;   
    5. }  

    如果是用这种方式上传post参数:

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. public void postJson() {  
    2.         String url = "http://"+host+":8080/web/json.jsp";  
    3.         HashMap<String, String> params = new HashMap<String, String>();  
    4.         params.put("username", "xjs");    
    5.         params.put("password", "123456");   
    6.         JsonObjectRequest postRequest = new JsonObjectRequest(  
    7.                 Request.Method.POST,   
    8.                 url,   
    9.                 new JSONObject(params),    
    10.                 new Response.Listener<JSONObject>() {    
    11.                    @Override    
    12.                    public void onResponse(JSONObject response) {    
    13.                        Log.e(TAG, "response : " + response.toString());    
    14.                    }    
    15.                 },   
    16.                 new Response.ErrorListener() {    
    17.                    @Override    
    18.                    public void onErrorResponse(VolleyError error) {    
    19.                        Log.e("Error: ", error.getMessage());    
    20.                    }    
    21.                });  
    22.         mQueue.add(postRequest);   
    23.     }  

    要注意,上传的参数并不是按照key-value拼接起来放在body中上传的,而是按照json的形式上传的,因此,服务端用request.getParameter("key")这种形式是无法取出来value的,只能是request.getInputStream(),然后把整个的body还原出原来的json串,然后从json中再取值。

    附一个登陆铁道部12306的例子,源码在:http://download.csdn.net/download/goldenfish1919/7029907

    Ps:我在测试的时候用了本地的一个tomcat,一块打包放在了asserts下面。

    参考:

    http://blog.csdn.net/xyz_lmn/article/details/12165391

    http://blog.csdn.net/xyz_lmn/article/details/12746581

    http://blog.csdn.net/xyz_lmn/article/details/12177005

    http://www.itsalif.info/content/android-volley-tutorial-http-get-post-put

    概述:http://blog.csdn.net/t12x3456/article/details/9221611

    入门: http://blog.csdn.net/ttdevs/article/details/17566795

    自定义request: http://blog.csdn.net/ttdevs/article/details/17586205

    源码分析:http://blog.csdn.net/ttdevs/article/details/17764351

    发送https请求:http://blog.csdn.net/llwdslal/article/details/18052723

    构造cache:http://stackoverflow.com/questions/16682595/android-volley-imageloader-bitmaplrucache-parameter

    解析服务端cookie:http://stackoverflow.com/questions/20702178/android-volley-access-http-response-header-fields,http://blog.csdn.net/hpb21/article/details/12163371

    上传cookie:http://stackoverflow.com/questions/17049473/how-to-set-custom-header-in-volley-request

    设置超时:http://stackoverflow.com/questions/17094718/android-volley-timeout

    http://blog.csdn.net/dacainiao007/article/details/12617747,这里关于超时时间增长的因子的说法不准确,应该是当第一次连接超时以后,第二次超时时间会变为原来的多少倍,连接超时和读取超时设置为同一个数。

  • 相关阅读:
    SpringBoot 项目瘦身
    对比两个文本的异同
    Spring 事务不起作用的场景
    Controller 层数据校验实现思路
    Notify 类的实现思路
    backup: 使用 vim 时一定会用到的设置 --for-myself
    exercise: 反射获取指定的属性值 --CSharp
    exercise: 序列化和反序列化Xml --CSharp
    前缀
    华罗庚的数学思想
  • 原文地址:https://www.cnblogs.com/exmyth/p/4679145.html
Copyright © 2011-2022 走看看