Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。
严格地说,Retrofit2并不是一个网络请求交易框架,它只是对网络请求框架的封装。底层把实现交给了okhttp3,由okhttp3做真正的网络请求。
Retrofit2优势在于,它使用了大量的设计模式将功能模块解耦,这样做的好处在于可以让流程更加清晰,可塑性更强。
支持各种格式转换以及RxJava。
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
interface Dream {
//get请求
@GET("/dream/query")
Call get(@Query("q") String q,@Query("key") String key);
//post请求
@POST("/dream/query")
Call post(@Query("q") String q,@Query("key") String key);
}
//使用的是聚合数据
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(“http://v.juhe.cn/dream/query/”)
.build();
Dream dream = retrofit.create(Dream.class);
Call call = dream.get(“吃饭”, “e136460f8f0bf18f431bdb7848267fbc”);
Response response = call.execute();
if (response != null && response.body() != null) {
System.out.println("Retrofit GET请求》》》" + response.body().string());
}
这样就完成了一次同步请求,还可以通过调用enqueue方法发起异步请求
<1> Retrofit还可以自定义OkHttpClient来设置连接超时时长、读取数据超时时长、设置拦截器等等。
OkHttpClient.Builder httpClient = new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
//添加拦截器到OkHttp,这是最关键的
.addInterceptor(logging);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(“http://v.juhe.cn/dream/query/”)
.client(httpClient.build())
.build();
<2> 也可以是用addConverterFactory解析数据,比如使用Gson解析数据
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
interface Dream {
//get请求
@GET("/dream/query")
Call get(@Query("q") String q,@Query("key") String key);
//post请求
@POST("/dream/query")
Call post(@Query("q") String q,@Query("key") String key);
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(“http://v.juhe.cn/dream/query/”)
.client(httpClient.build())
//添加支持Gson
.addConverterFactory(GsonConverterFactory.create())
.build();
Call call = dream.get(Q, KEY);
Response response = call.execute();
if (response != null && response.body() != null) {
System.out.println("Retrofit GET请求》》》" + response.body().toString());
}
Retrofit中内置了以下几种数据转换器:
Gson: com.squareup.retrofit2:converter-gson
Jackson: com.squareup.retrofit2:converter-jackson
Moshi: com.squareup.retrofit2:converter-moshi
Protobuf: com.squareup.retrofit2:converter-protobuf
Wire: com.squareup.retrofit2:converter-wire
Simple XML: com.squareup.retrofit2:converter-simplexml
Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars
除此以外也可以自己自定义Converter。
<3> Retrofit也可以和RxJava配合使用
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
interface Dream {
//get请求
@GET("/dream/query")
Observable get(@Query("q") String q,@Query("key") String key);
//post请求
@POST("/dream/query")
Observable post(@Query("q") String q,@Query("key") String key);
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
//添加支持RxJava
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
Dream dream = retrofit.create(Dream.class);
Observable observable = dream.get(Q, KEY);
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {}
@Override
public void onNext(TestBean value) {
System.out.println("Retrofit GET请求》》》" + value.toString());
}
@Override
public void onError(Throwable e) {}
@Override
public void onComplete() {}
});