前言:之前开发使用到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请求之前设置,如下同样可以达到效果。
HttpTrustManager.allowAllSSL();
mStringRequest = new StringRequest(Request.Method.POST,url,getDefaultSuccessListener(),
mErrorListener){
@Override
protected Map getParams() throws AuthFailureError {
return params;
}
};
mRequestQueue.add(mStringRequest);
以上就是全部内容,大家可以自个去试试,有什么问题可以留言。或者在微信公众号“技术帮团队”上找我们。