- 首先,创建OkhttpClient 和Retrofit的网络框架
- 其次,创建Retrofit的请求接口
- 最后,通过RxJava监听观察者并获取请求接口的结果。
- 实践:
/**
* @author zhou.jn on 2018/11/22 13:38.
*/
public class App extends Application {
private static final String TAG = "App";
private static OkHttpClient okHttpClient;
private static Retrofit retrofit;
private static App app;
@Override
public void onCreate() {
super.onCreate();
app = this;
OkhttpInstance();
RetrofitInstance();
}
//1. 创建OkhttpClient
private static OkHttpClient OkhttpInstance() {
if (okHttpClient == null) {
OkHttpClient.Builder builder = new OkHttpClient.Builder()
//设置链接超时时间
.connectTimeout(500, TimeUnit.MILLISECONDS)
//设置读取超时时间
.readTimeout(1000, TimeUnit.MILLISECONDS)
//设置写入超时时间
.writeTimeout(1000, TimeUnit.MILLISECONDS)
//设置缓存目录
.cache(new Cache(app.getExternalCacheDir(), 10 * 1024 * 1024))
.build();
});
return okHttpClient;
} else {
return okHttpClient;
}
}
public static Retrofit RetrofitInstance() {
if (retrofit == null) {
retrofit = new Retrofit.Builder()
//添加基础URL,需要以"/"结尾,例:"http://www.baidu.com/"
.baseUrl(Http.DEFAULT_BASE_URL)
//添加RxJava支持
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
/**添加解析方式(这里可能会因为解析的方式不同,导致产生404或者解析字符串不全的现象*/
.addConverterFactory(ScalarsConverterFactory.create())
.client(okHttpClient)
.build();
return retrofit;
} else {
return retrofit;
}
}
}
2.Retrofit注解中文版: https://www.jianshu.com/p/0fda3132cf98
了解@Post @Path@Body@
/**
* @author zhou.jn on 2018/11/22 14:49.
*/
public interface Ipost {
//接口请求,基本的请求要与后台定义的请求协议一致,例:是否需要添加请求头等。
String REQUEST_HEAD = "User-Agent";
String GET_IP_TAG = "client/ipinfo";
String REQUEST_PERSONAL = "client/queryOttAccount";
@POST(GET_IP_TAG)
Observable<String> getPublicIp(@Header(REQUEST_HEAD) String headValue);
//请求方式一:需使用拼接的字符串进行请求,可以定义拼接字符串
@POST(REQUEST_PERSONAL)
Observable<String> queryPersonInfo(@Body String content);
//请求方式二:直接写全请求接口,此时,将忽略在retrofit中设置的baseUrl 例: Http.DEFAULT_BASE_URL
@POST("http://IP:Port/请求拼接的参数")
Observable<String> queryRechargeInfo(@Body String content);
}
3.进行请求
final Ipost ipost = App.RetrofitInstance().create(Ipost.class);
MySubscriber subscriber = new MySubscriber(httpKey);
ipost.queryPersonInfo(httpEnContent)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
//以下注册采用其一:
//方式一: 自定义 注册
.subscribe(subscriber);
//方式二:
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.i(TAG, "onCompleted: ");
}
@Override
public void onError(Throwable e) {
Log.i(TAG, "onError: "+e.getMessage());
}
@Override
public void onNext(String s) {
Log.i(TAG, "onNext: "+s);
String decryptResult = AESUtils.decryptResult(s,httpKey);
Log.i(TAG,"解密后:"+decryptResult);
}
});
public class MySubscriber extends Subscriber<String> {
private static final String TAG = "MySubscriber";
private String httpKey;
private String decontent;
public String result;
public MySubscriber(String httpKey) {
this.httpKey = httpKey;
}
//相比较,自定义Subscriber 多一个 onStart(),在onNext()之前被调用,可以进行一些初始化操作
@Override
public void onStart() {
super.onStart();
Log.i(TAG,"start");
}
@Override
public void onCompleted() {
Log.i(TAG,"completed");
}
@Override
public void onError(Throwable e) {
Log.i(TAG,"onError: "+e.getMessage());
}
@Override
public void onNext(String enString) {
Log.i(TAG, "onNext: "+ enString);
String decryptResult = AESUtils.decryptResult(enString, httpKey);
//获取请求结果
Log.i(TAG,"decryptResult: "+ decryptResult);
}
}
4.结束