Retrofit之https
好久没有写博客了,之前学习了目前比较火的网络请求框架Retrofit的使用,没有做过的的深入研究,在项目开发过程中,使用还比较顺利。一般的情况下使用retrofit是不用做很多的配置的,最近接触到了https这个网络的协议,使用retrofit做https的请求就不一样了。
在做请求之前,先要了解下http协议和https协议的基本概念和区别。
1、HTTP和HTTPS的基本概念
HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器请求和应答的标准(TCP),用于从服务器传输超文本到本地浏览器的传输协议。
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。HTTPS协议可以建议一种信息安全通道,来保证数据传输的安全,也可以确认一个网站的真实性。
2、HTTP与HTTPS有什么区别?
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
HTTPS和HTTP的区别主要如下:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
3、HTTPS工作原理
(1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
(2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
(3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
(4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
(5)Web服务器利用自己的私钥解密出会话密钥。
(6)Web服务器利用会话密钥加密与客户端之间的通信。
可以看出在浏览器上使用HTTPS协议可以确保信息安全,但是在移动端使用HTTPS协议却多有不便,但是也可以做相应的设置。
Retrofit 是基于okhttp的框架,Retrofit 没有直接设置请求参数的方法,但是却可以先设置okhttpclient ,然后retrofit设置client,这样就可以设置好retrofit做https的请求。
public static ApiService getDataFromHttps(String baseUrl){
TrustManager[] trustAll = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
};
OkHttpClient client = null;
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null,trustAll,new SecureRandom());
client = new OkHttpClient.Builder()
.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
}).sslSocketFactory(sc.getSocketFactory())
.protocols(Collections.singletonList(Protocol.HTTP_1_1))
.connectTimeout(10000, TimeUnit.MILLISECONDS)
.build();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(client)
.build();
okhttpclient 设置相关的一些验证信息即可。