话说今天元旦假期,有女盆友的都去约了,有球友的也去约了,我么,我还小,我不约。。
既然不约,那就撸一发。。
刚好下礼拜开始,苦逼日子就来了唉。。公司项目重构。。。。。。。。
对自己来说这样是个成长的机会,因为又可以用很多新的东西。技术也可以更新迭代了。。。
需求:
网络请求要添加headers,用自定义的证书https的URL网络请求。
其实很早开始接触rx retrofit 了,一直都没机会用,这次就来个封装吧。。
要不先来个图???
好了,老套路,边开玩笑边开始。
既然要养花儿,先得有个花盆吧。不能就放在地板上养吧,那样是粗人干的事,不是我这个北方的汉子干的事儿。。既然要有花盆,那就得先依赖喽。。
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.google.code.gson:gson:2.8.0'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.6'
好了,准备好你的嘴,开始square的全家桶了。。哈哈,然而好难吃。
OK,依赖好了以后,花盆买来了以后,该对花盆配置一下,也就是收拾一下。好歹拾掇的好好滴,看起来也舒坦么。
养花的话,不同的花儿需要不同的土壤,有的不要土壤,只要水,所以呢,先来个小房间来放这些花儿需要的不同的额水和不同的土壤。代码里来个APIService接口,这就是咱的小房子。
import java.util.Map;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
import rx.Observable;
/**
* Created by scc on 2016/12/31.
*/
public interface APIService {
@FormUrlEncoded
@POST("你的地址,我的我删除了!")
Observable<Scc> getDatas(@FieldMap Map<String,String> map);
@GET("你的地址,我的我删除了!")
Observable<String> getListDatas(@Query("name") String name);
@GET("你的地址,我的我删除了!")
Observable<String> getListDatas(@QueryMap Map<String,String> ma);
}
上面的这些呢,都是retrofit中的一些请求方法和参数,关于这些呢,网上一大堆一大堆,自己去看就好了。这些就相当于咱们养花儿的不同的水和土壤。
下面呢,咱来配置一下花盆吧,收拾的好看一点,有助于泡妹子哈,我是不是想多了,唉。。不提这事儿了,内牛满面。。配置吧。
import com.scc.jibuqi.util.HttpParams;
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.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/**
* Created by scc on 2016/12/31.
*/
public class RetrofitManager {
private Retrofit retrofit;
private APIService service;
private static RetrofitManager r;
private OkHttpClient client;
//私有化构造方法
private RetrofitManager() {
retrofit = new Retrofit.Builder()
.baseUrl("你的baseURL,我的我删除了!!")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(getOk())
.build();
service = retrofit.create(APIService.class);
}
public void getData(Subscriber<Scc> subscriber) {
Observable<Scc> observable = service.getDatas(HttpParams.getParams());
observable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
public static RetrofitManager getInstance() {
synchronized (RetrofitManager.class) {
if (r == null) {
return r = new RetrofitManager();
} else {
return r;
}
}
}
private OkHttpClient getOk() {
X509TrustManager xtm = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
X509Certificate[] x509Certificates = new X509Certificate[0];
return x509Certificates;
}
};
SSLContext sslContext = null;
try {
sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, new TrustManager[]{xtm}, new SecureRandom());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
if (client == null) {
client = new OkHttpClient.Builder()
// .addInterceptor(new Interceptor() {
// @Override
// public Response intercept(Chain chain) throws IOException {
// Request re = chain.request().newBuilder()
// .addHeader("apikey", "4a79a19701e4a722dfd91c6766dc4045")
// .build();
// return chain.proceed(re);
// }
// })
.addInterceptor(new LogInterceptor())
.sslSocketFactory(sslContext.getSocketFactory())
.hostnameVerifier(DO_NOT_VERIFY)
.build();
return client;
} else {
return client;
}
}
}
在RetrofitManager的构造方法中,初始化retrofit和APIService。细心的您会发现初始化Okhttp的时候里面有个getOK啥玩意儿啊,这个方法是OK的初始化。
在getOK方法中,设置信任所有的https的网络请求。注释掉的那段代码是添加headers的请求头参数。
好了,这些初始化的工作做好了以后,花盆OK了。接下里该往里面种花儿了,春天播下种子,夏天它发芽,秋天它落叶,冬天它。。死啦。。没关系,来年再种。
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import rx.Subscriber;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "scc";
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.tv);
RetrofitManager.getInstance().getData(new Subscriber<Scc>() {
@Override
public void onCompleted() {
Log.i(TAG, "onCompleted: 结束");
}
@Override
public void onError(Throwable e) {
Log.i(TAG, "onError: "+e.toString());
}
@Override
public void onNext(Scc s) {
if (s.getCode()==0){
textView.setText(s.getRes().getBanner_list().size()+"");
}
}
});
}
}
接下来在你的Activity中调用就好了。。