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

时间:2023-03-08 17:24:38

1 Volley发送get请求:

  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请求:

  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获取网络图片:

  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请求,需要修改源码:

  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,需要修改源码:

  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():

  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:

  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设置请求超时时间:

  1. @Override
  2. public RetryPolicy getRetryPolicy() {
  3. RetryPolicyretryPolicy = new DefaultRetryPolicy(5000,DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
  4. returnretryPolicy;
  5. }

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

  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.****.net/download/goldenfish1919/7029907

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

参考:

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

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

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

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

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

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

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

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

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

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

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

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

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

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