您的位置:首页 > 理论基础 > 计算机网络

Android Retrofit+okHttp简单配置

2016-09-05 14:59 351 查看
public class NetClientGenerator {

public static final String API_BASE_URL = Constants.SERVER_URL + "/";

private static OkHttpClient httpClient = null;

private static final int TIMEOUT_SECONDS = 5;//5秒超时

private static Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create());//rxjava

private static String CER = "-----BEGIN CERTIFICATE-----\n" +
"SYYC3DCCAcSgAwIBAgIQFedi3q74dbVE3zzOvv0ZjTANBgkqhkiG9w0BAQUFADAXMRUwEwYDVQQD\n" +
"AwxpWjk0Zml3dHhxdVowHhcNMTYwMzA5MDc1MDI0WhcNMTcwMzA5MDAwMDAwWjAXMRUwEwYDVQQD\n" +
"AwxpWjk0Zml3dHhxdVowggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0YWWEQcjrmvZo\n" +
"6zhBJAOwt4As4zNxtphq9lGimjRxQ1rIieX4z6UDc8NfFPZo7qUZKN742Rw6Hk0WCOGY05+Jn9zP\n" +
"7e/s65736znWHCV/mWGTo22dTmD1mj4aG+LkTdIBTahbHGUfzA+MAvmTqQpladHFOvWN5d2p8/M3\n" +
"hFozB2hUyAqL+FyIW+vSeGTfmPdzxTRt/6TIZ0Sr4AFsB2V4flfkn4AlwFVMX1+n0J3b50F7y2wx\n" +
"huGgz+WzspOHl0sc2OGm8JNFFIotzXteNg8Nks/041zoXLrlhOQtAcMSc8nzDuMSWzvTUUjPsood\n" +
"MSqwznwf9DZh2Vehr77myos1AgMBAAGjJDAiMAsGA1UdDwQEAwIEMDATBgNVHSUEDDAKBggrBgEF\n" +
"BQcDATANBgkqhkiG9w0BAQUFAAOCAQEABKAAtPA+Tss2T5nj+XJA/V4myvaOkVfNKvYCHdYEASQu\n" +
"Y0cMv8JuoXihGJAqTspWI2AxaviUeQ3NoI47UvhVcTsI1OTXmLDjkqO0q6YCoKnyOoftzFtTmApG\n" +
"2IrxA5Tqnv2u6TcVshoxnOjmJueAE16YoT6UMfrSUAseXFh+zt2UHXtTBQbkxaA/2nkRLfii6UZV\n" +
"iEnFUBevAX8ESY0GwbRHItqIyw5PoOrvdftMEacxuYe1bEiDh5z9E5lcgAxFG6yq9LL/cR/WTg2n\n" +
"AEMtTwKAwFVf5Mws0BaEIiqV4V27Q7kwmeR3pfAq2ry0Mdm1wGRkh3yOw53SkAKUfZkQ7w==\n" +
"-----END CERTIFICATE-----";

public static <S> S createService(Class<S> serviceClass) {

/* 添加一个拦截器 */

if (httpClient == null) {
createHttpClient();
try {
//createHttpClient1();
} catch (Exception e) {
e.getStackTrace();
}
}

Retrofit retrofit = builder.client(httpClient).build();
return retrofit.create(serviceClass);
}

private static void createHttpClient() {
httpClient = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {

Request newRequest;
/* Header加入cookie */
String cookieStr = MyApplication.getInstance().getCookieStr();
if (!TextUtils.isEmpty(cookieStr)) {
newRequest = chain.request().newBuilder().addHeader("Cookie", cookieStr).build();
} else {
newRequest = chain.request();
}

Response response = chain.proceed(newRequest);

/*
* 取出cookie保存
* 短信验证码和登录接口都有cookie返回
* */
if (response.request().url().toString().equalsIgnoreCase(API_BASE_URL + "api/Account/Login")
|| response.request().url().toString().startsWith((API_BASE_URL + "api/Account/SendVerifyCode/"))) {

List<String> cookieStringList = response.headers("Set-Cookie");
for (String str : cookieStringList) {
String[] tempStrs = str.split(";");
MyApplication.getInstance().setCookieStr(tempStrs[0]);
//                                Response response1 = chain.proceed(newRequest);
//                                LogUtil.d("NetApiInterface", "请求:" + response1.request().url() + "\n返回:" + response1.body().string());
return response;

}
}
//                        Response response1 = chain.proceed(newRequest);
//                        LogUtil.d("NetApiInterface", "请求:" + response1.request().url() + "\n返回:" + response1.body().string());
return response;

}
})
.readTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS)
.connectTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS)
.writeTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS)
//                .addNetworkInterceptor(new StethoInterceptor())
.build();

}

/*
* 用这个方法可以实现https请求
*/
private static void createHttpClient1() throws Exception {

CertificateFactory cf = CertificateFactory.getInstance("X.905");
InputStream cert = MyApplication.getInstance().getResources().getAssets().open(Constants.CRET);
Certificate ca;
ca = cf.generateCertificate(cert);

// creating a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);

// creating a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);

// creating an SSLSocketFactory that uses our TrustManager
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);

httpClient = new OkHttpClient.Builder()
.sslSocketFactory(sslContext.getSocketFactory())
.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
})
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {

Request newRequest;
/* Header加入cookie */
String cookieStr = MyApplication.getInstance().getCookieStr();
if (!TextUtils.isEmpty(cookieStr)) {
newRequest = chain.request().newBuilder().addHeader("Cookie", cookieStr).build();
} else {
newRequest = chain.request();
}

Response response = chain.proceed(newRequest);

/*
* 取出cookie保存
* 短信验证码和登录接口都有cookie返回
* */
if (response.request().url().toString().equalsIgnoreCase(API_BASE_URL + "api/Account/Login")
|| response.request().url().toString().startsWith((API_BASE_URL + "api/Account/SendVerifyCode/"))) {

List<String> cookieStringList = response.headers("Set-Cookie");
for (String str : cookieStringList) {
if(str.startsWith(".ASPXSYTH=")){
String[] tempStrs = str.split(";");
MyApplication.getInstance().setCookieStr(tempStrs[0]);
return response;
}

}
}
//                        Response response1 = chain.proceed(newRequest);
//                        LogUtil.d("NetApiInterface", "请求:" + response1.request().url() + "\n返回:" + response1.body().string());
return response;

}
})
.readTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS)
.connectTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS)
.writeTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS)
.build();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: