Retrofit2快速入门

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、@Multipart、@Streaming。

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

  • 参数类
    @Headers、@Header、@Body、@Field、@FieldMap、@Part、@PartMap@、Path、@Query、@QueryMap、@Url

@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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342