android volley框架


1 Volley發送get請求:java

[java] view plaincopy在CODE上查看代碼片派生到個人代碼片android

  1. public void getJson() {  web

  2.     String url = "http://"+host+":8080/web/json.jsp?username=xjs&password=123456";  json

  3.     mQueue.add(new JsonObjectRequest(Method.GET, url, null,  cookie

  4.         new Listener<JSONObject>() {  網絡

  5.             @Override  app

  6.             public void onResponse(JSONObject response) {  dom

  7.                 Log.e(TAG, "response : " + response.toString());  jsp

  8.             }  ide

  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("\n");//用\n做爲分隔符,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, "\n"";");  

  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中再取值。

相關文章
相關標籤/搜索