[转]Android-网络通信框架Volley使用详解

1 Volley发送get请求:

[java] view plaincopy

  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

  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

  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

  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

  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

  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

  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

  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

  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,这里关于超时时间增长的因子的说法不准确,应该是当第一次连接超时以后,第二次超时时间会变为原来的多少倍,连接超时和读取超时设置为同一个数。

时间: 2024-11-23 13:26:57

[转]Android-网络通信框架Volley使用详解的相关文章

【转】Android 网络通信框架Volley简介(Google IO 2013)

Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v=yhv8l9F44qo&feature=player_embedded 1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(Apache)等,今年的Go

Android 网络通信框架Volley简介(Google IO 2013)

Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v=yhv8l9F44qo&feature=player_embedded 1. 什么是Volley 在 这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于 AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(Apache)等,今年的

[转]Android 网络通信框架Volley简介(Google IO 2013)

Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v=yhv8l9F44qo&feature=player_embedded 1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(Apache)等,今年的Go

Android 网络通信框架Volley的解析

在2013年Google I/O大会上,Android开发团队公布了一个新的网络通信框架:Volley.它适合处理通信频繁的网络操作,但对于每一次通信的数据量则有较为苛刻的限制.本文将介绍该通信框架的用法(包括使用现成和自定义的Request),并从源码的角度探究其工作机制. 目前,Android系统中用于实现HTTP通信的方式主要有HttpURLConnection和HttpClient两个类[1],而封装了它们的框架主要有AsyncHttpClient和Universal-Image-Loa

Android 网络通信框架Volley简介

Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v=yhv8l9F44qo&feature=player_embedded 1. 什么是Volley Google I/O 2013上,Volley发布了volley.在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于 AsyncTaskLoader HttpURLConnection A

Android 网络通信框架Volley基本介绍

Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v=yhv8l9F44qo&feature=player_embedded 1. 什么是Volley Google I/O 2013上.Volley公布了volley.在这之前,我们在程序中须要和网络通信的时候,大体使用的东西莫过于 AsyncTaskLoader HttpURLConnection A

Android-网络通信框架Volley使用详解

1 Volley发送get请求: public void getJson() { String url = "http://"+host+":8080/web/json.jsp?username=xjs&password=123456"; mQueue.add(new JsonObjectRequest(Method.GET, url, null, new Listener<jsonobject>() { @Override public voi

Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送

Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送,写这个系列真的很要命,你要去把他们的API文档大致的翻阅一遍,而且各种功能都实现一遍,解决各种bug各种坑,不得不说,极光推送真坑,大家使用还是要慎重,我们看一下极光推送的官网 https://www.jpush.cn/common/ 推送比较使用,很多软件有需要,所以在这个点拿出来多讲讲,我们本节

SSH框架的整合详解

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> SSH框架的整合详解 - super_YC的博客 - 博客频道 - CSDN.NET super_YC的博客 记录我生活的一点一滴!我很开心拥有这样一个自己心事的笔记本 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯]流畅的P