vollery框架使用及支持https

本文介绍Volley框架在Android应用开发中的局限性,包括不支持Delete请求及HTTPS的问题解决方法。通过自定义信任管理器允许所有SSL连接,并提供三种实现HTTPS支持的方案。

**前言:**之前开发使用到vollery框架,对于这个框架,个人评价是开源但不完善,除了常用的get,post请求外,如果需要用到delete请求,需要手动去修改vollery框架内部的源码,另外不支持https,有这块的需求,也需要手动去修改内部源码,最无语的一块是对文件上传支持不好。
**建议:**如果是单纯的http网络数据请求,可以使用该框架。如果涉及到图片上传、支持多种格式的请求格式,最好使用比较老成的框架,如:android-async-http 或者其他功能支持比较全面框架。

如下是记录内容:
导入Vollery框架,在23版本中去掉了AndroidHttpClient的API,解决方案:
在当前的lib类库中的build文件中,添加如下两处地方即可:
android {
useLibrary ‘org.apache.http.legacy’

dependencies {
compile ‘org.apache.httpcomponents:httpcore:4.4.2’
这里写图片描述

找不到符号:import android.net.http.AndroidHttpClient;
但在android6.0之后,HttpClient被完全抛弃。如果要继续使用需要Apache HttpClient,需要在eclipse下libs里添加org.apache.http.legacy.jar,android studio里在相应的module下的build.gradle中加入:
android {
useLibrary ‘org.apache.http.legacy’
}

注意:vollery框架默认不支持Delete方法提交参数请求,需要在源码中,把添加请求的方法体

关于支持Https的方案:
1)**方案一:**既然volley框架里面有https请求方式,只不过没有调用,那么一种修改的方法是重写Volley.java newRequestQueueInDisk方法 调用第三个构造。又因为这三个构造最后调用的都是参数最多的那个所以也可以在第三个构造中直接默认生成SSLSocketFactory示例。但是我没有用这种方法。

2)**方案二:**在toolbox中添加HTTPSTrustManager类(代码网上找的- -、),并对HurlStack的createConnetcion方法进行了小小的修改。(本人采用的方法)

package com.android.volley.toolbox;  
  
import java.security.KeyManagementException;  
import java.security.NoSuchAlgorithmException;  
import java.security.SecureRandom;  
import java.security.cert.X509Certificate;  
  
import javax.net.ssl.HostnameVerifier;  
import javax.net.ssl.HttpsURLConnection;  
import javax.net.ssl.SSLContext;  
import javax.net.ssl.SSLSession;  
import javax.net.ssl.TrustManager;  
import javax.net.ssl.X509TrustManager;  
  
public class HTTPSTrustManager implements X509TrustManager {  
  
    private static TrustManager[] trustManagers;  
    private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {};  
  
    @Override  
    public void checkClientTrusted(  
            java.security.cert.X509Certificate[] x509Certificates, String s)  
            throws java.security.cert.CertificateException {  
        // To change body of implemented methods use File | Settings | File  
        // Templates.  
    }  
  
    @Override  
    public void checkServerTrusted(  
            java.security.cert.X509Certificate[] x509Certificates, String s)  
            throws java.security.cert.CertificateException {  
        // To change body of implemented methods use File | Settings | File  
        // Templates.  
    }  
  
    public boolean isClientTrusted(X509Certificate[] chain) {  
        return true;  
    }  
  
    public boolean isServerTrusted(X509Certificate[] chain) {  
        return true;  
    }  
  
    @Override  
    public X509Certificate[] getAcceptedIssuers() {  
        return _AcceptedIssuers;  
    }  
  
    public static void allowAllSSL() {  
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {  
  
            @Override  
            public boolean verify(String arg0, SSLSession arg1) {  
                // TODO Auto-generated method stub  
                return true;  
            }  
  
        });  
  
        SSLContext context = null;  
        if (trustManagers == null) {  
            trustManagers = new TrustManager[] { new HTTPSTrustManager() };  
        }  
  
        try {  
            context = SSLContext.getInstance("TLS");  
            context.init(null, trustManagers, new SecureRandom());  
        } catch (NoSuchAlgorithmException e) {  
            e.printStackTrace();  
        } catch (KeyManagementException e) {  
            e.printStackTrace();  
        }  
  
        HttpsURLConnection.setDefaultSSLSocketFactory(context  
                .getSocketFactory());  
    }  
  
}  

createConnction方法的修改:
[java] view plaincopy
protected HttpURLConnection createConnection(URL url) throws IOException {
//如果请求是https请求那么就信任所有SSL
[java] view plaincopy
if (url.toString().contains(“https”)) {
HTTPSTrustManager.allowAllSSL();
}
return (HttpURLConnection) url.openConnection();
}
其实就是添加了一个 HTTPSTrustManager类,并在createConnection中调用一下HTTPSTrustManager.allowAllSSL()。

3)**方案三:**不修改volley框架代码,在创建Request请求之前设置,如下同样可以达到效果。

<span style="font-family:SimSun;">HttpTrustManager.allowAllSSL();
mStringRequest = new StringRequest(Request.Method.POST,url,getDefaultSuccessListener(),
  mErrorListener){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                return params;
            }
  };
mRequestQueue.add(mStringRequest);</span>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值