Retrofit RXjava 网络框架半栈工程师Android开发经验谈

Retrofit2快速入门

2017-12-25  本文已影响39人  Diosamolee

Retrofit2快速入门

大家好,又是心情澎湃的一天,今天我将给大家介绍Retrofit2这个库.

Retrofit2是什么?

Retrofit是由Square公司出品的针对于Android和Java的类型安全的Http客户端,吸取了RESTful的风格,实质上就是对okhttp 进行了封装,利用动态代理实现了网络接口底层请求,然后将返回的数据就行转换成我们指定的Bean对象,极大的提高了效率,和网络体验.

RESTful相关文档

使用依赖

首先在build.gradle中添加如下代码,添加Retrofit2库

compile 'com.squareup.retrofit2:retrofit:2.3.0'

创建实列

    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("baseurl/") //这里填入端口的url   
        .build();

必须以 /(斜线) 结束,不然会抛出一个IllegalArgumentException,所以如果你看到别的教程没有以 / 结束,那么可能是直接从Retrofit1 copy过来的。

定义接口

以获取一本书的页数为例子

public interface API {
    @GET("book/{page}")
    Call<ResponseBody> getPage(@Path("page") int id);
}

在通过上面构建的实列对象retorfit 进行下一步操作
API api = retrofit.create(API.class);

构建出代理对象.

开始请求

上一部已经拿到了代理对象,接下来我们就需要使用代理对象来进行网络请求获取数据,如下代码:

    Call<ResponseBody> page = api.getPage(10);

        page.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                //请求成功返回的数据                

            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                //请求失败

            }
        });

当然上面只是异步的请求,回调到这两个方法如果使用同步请求:

    try {
            Response<ResponseBody> response = page.execute();
            //可以根据返回的response在做处理
        } catch (IOException e) {
            e.printStackTrace();
        }

注意同步请求不要在主线程去使用,一半是在子线程里面发起请求,后面的代码需要同步返回的数据方才使用
当你将一些异步请求压入队列后,甚至你在执行同步请求的时候,你可以随时调用 cancel 方法来取消请求

Retrofit注解详解

刚刚已经完成了retrofit最基本的快速使用方法,那么接下来就详细介绍一下retrofit的注解,retrofit里面有很多注解,是一个很轻量级的库,
一共37个类就有22个是注解类,所以大家这一块一定要仔细认真的看一下.

@PATCH、@OPTIONS、@HTTP、@HEAD、@PUT、@GET、@PUT、@DELETE
方法注解和RESTFUL API有关
@PUT,PUT方法用来创建一个URI已知的资源,或对已知资源进行完全替换,比如users/1,因此PUT方法一般会用来更新一个已知资源,
除非在创建前,你完全知道自己要创建的对象的URI。
@PATCH ,PATCH方法是新引入的,是对PUT方法的补充,用来对已知资源进行局部更新
@HEAD ,与参数注解@Header不同,只请求页面的首部。
@OPTIONS 允许客户端查看服务器的性能
@HTTP ,使用用户自定义的verb进行网络请求

@FormUrlEncoded 请求体是 From 表单
@Multipart 请求体是支持文件上传的 From 表单
@Streaming 响应体的数据用流的形式返回

@Headers:使用 @Headers 注解设置固定的请求头,所有请求头不会相互覆盖,即使名字相同。

@Header: 使用 @Header 注解动态更新请求头,匹配的参数必须提供给 @Header ,若参数值为 null ,这个头会被省略,否则,会使用参数值的 toString 方法的返回值。

@Body: 使用 @Body 注解,指定一个对象作为 request body 。

@Field: 表单提交,如登录

@FieldMap 、@Part 、@PartMap 、@Path: 请求 URL 可以替换模块来动态改变,替换模块是 {}包含的字母数字字符串,替换的参数必须使用 @Path 注解的相同字符串。

@Query: 查询参数

@QueryMap: 复杂的查询参数

@Url: 作用于方法参数,用于添加请求的接口地址

Bean对象转换

要自定义Converter<F, T>,需要先看一下GsonConverterFactory的实现,
GsonConverterFactory实现了内部类Converter.Factory。

其中GsonConverterFactory中的主要两个方法,主要用于解析request和response的,
在Factory中还有一个方法stringConverter,用于String的转换。

引入Gson支持:

compile 'com.squareup.retrofit2:converter-gson:2.0.2'

通过GsonConverterFactory为Retrofit添加Gson支持:

Gson gson = new GsonBuilder()
      //配置你的Gson
      .setDateFormat("yyyy-MM-dd hh:mm:ss")
      .create();

Retrofit retrofit = new Retrofit.Builder()
      .baseUrl("http://localhost:4567/")
      //可以接收自定义的Gson,当然也可以不传
      .addConverterFactory(GsonConverterFactory.create(gson))
      .build();   

然后通过 Call<ResponseBody> 这里替换ResponseBody 为自己的Bean对象Call<JavaBean> 然后请求回来的数据就会自动转换.

结合okhttp,并使用Interceptor

对应依赖:

    compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'

    testImplementation 'com.squareup.okhttp3:mockwebserver:3.9.1'

Retrofit 2.0 底层依赖于okHttp,所以需要使用okHttp的Interceptors 来对所有请求进行拦截。
我们可以通过自定义Interceptor来实现很多操作,打印日志,缓存,重试等等。

要实现自己的拦截器需要有以下步骤

//创建OkHttpClient

OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new HttpLoggingInterceptor())
.build();
retrofit = new Retrofit.Builder()
.baseUrl(Urls.baseUrl)
.client(client)//添加自定义OkHttpClient
.build();

如何结合RxJava

引入RxJava支持:

//这里支持的是RxJava2
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile "io.reactivex.rxjava2:rxjava:2.1.7"

如何添加:

retrofit = new Retrofit.Builder()
        .baseUrl(Urls.baseUrl)
        // 针对rxjava2.x  
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .build();

在请求的接口中直接指定Observable 的Rxjava对象:

public interface Api{
  @POST("/page")
  Observable<Event1> getBook();
}

然后在通过以下代码完成一套行云流水的结合操作:

 Retrofit retrofit= new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();

        API movieService = retrofit.create(API.class);

        movieService.getTest()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Event1>() {
                    @Override
                    public void onCompleted() {
                    }

                    @Override
                    public void onError(Throwable e) {
                    }

                    @Override
                    public void onNext(MovieEntity movieEntity) {
                    }
                });

这样完成了Retrofit和Rxjava的结合,这只是最基本的操作,更多操作还需要大家多多练习,提升自己,方能想怎么玩就怎么玩!
这是官方文档,想要深入研究的小伙伴可以好好学一波,加油!
Retrofit官方文档

如有更好的建议提议,可以发到我的邮箱diosamolee2014@gmail.com

上一篇下一篇

猜你喜欢

热点阅读