Android开源框架之Retrofit (一)

一、简介

Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。

严格地说,Retrofit2并不是一个网络请求交易框架,它只是对网络请求框架的封装。底层把实现交给了okhttp3,由okhttp3做真正的网络请求。

Retrofit2优势在于,它使用了大量的设计模式将功能模块解耦,这样做的好处在于可以让流程更加清晰,可塑性更强。

支持各种格式转换以及RxJava。

二、使用

1、首先在build.gradle中引用
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
2、定义一个Java接口
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);

}
3、创建retrofit的实例并进行网络请求
//使用的是聚合数据
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() {}
    });

你可能感兴趣的:(Android)