Retrofit 入门

Retrofit 简介

Retrofit 是 Square 公司基于 Restful 风格推出的网络框架封装。
Retrofit 与 OKHttp 的关系:Retrofit 是基于 OKHttp 的网络请求框架的二次封装,其本质仍是 OkHttp。

常见网络库的对比:

  • AndroidAsynHttp:基于 HttpClient,作者已停止维护,Android 5.0 不再使用 HttpClient,因此不推荐使用。
  • Volley:基于 HttpUrlConnection,Google 官方推出,只适合轻量级网络交互,不适合大文件上传下载场景。
  • Retrofit:API 设计简单易用,注解化配置高度解耦,支持多种解析器,支持 RxJava。

使用步骤

1. 依赖包导入

dependencies {
    ...
    implementation 'com.squareup.retrofit2:retrofit:2.6.2'
    implementation 'com.squareup.okhttp3:okhttp:4.2.2'
    implementation 'com.squareup.retrofit2:converter-gson:2.6.2'
}

2. 网络权限

网络权限:

<uses-permission android:name="android.permission.INTERNET" />

3. 创建接口设置请求类型与参数

public interface UserMgrService {
  @GET("login)
  public Call<UserInfoModel> login(@Query("username") String username, @Query("pwd") String pwd);
}

常用参数注解:

  • @GET、@POST:确定请求方式
  • @Path:请求 URL 的字符替代
  • @Query:要传递的参数
  • @QueryMap:包含多个 @Query 注解参数
  • @Body:添加实体类对象
  • @FormUrlEncoded:URL 编码

4. 创建 Retrofit 对象设置数据解析器

Retrofit retrofit = new Retrofit.Builder().baseUrl(Constants.BASE_URL).addConverterFactory(GsonConverterFactory.create()).build();

常用数据解析器:

  • Gson:implementation 'com.squareup.retrofit2:converter-gson:(insert latest version)'
  • Jackson:implementation 'com.squareup.retrofit2:converter-jackson:(insert latest version)'
  • Simple XML:implementation 'com.squareup.retrofit2:converter-simplexml:(insert latest version)'
  • Protobuf:implementation 'com.squareup.retrofit2:converter-protobuf:(insert latest version)'
  • Moshi:implementation 'com.squareup.retrofit2:converter-moshi:(insert latest version)'
  • Wire:implementation 'com.squareup.retrofit2:converter-wire:(insert latest version)'
  • Scalars:implementation 'com.squareup.retrofit2:converter-scalars:(insert latest version)'

5. 生成接口调用接口方法

// 生成接口对象
UserMgrService service = retrofit.create(UserMgrService.class);
// 调用接口方法返回 Call 对象
Call<UserInfoModel> call = service.login("zhangsan", "123456");

6. 返送请求处理返回数据

发送请求(同步/异步):

  • 同步:调用 Call 对象的 execute(),返回结果的响应体。
  • 异步:调用 Call 对象的 enqueue(),参数是一个回调。

案例

介绍如何使用Retrofit实现用户登录。

interface UserMgrService {
    @GET("user")
    fun login(@Query("username") username: String, @Query("pwd") pwd: String): Call<UserInfoModel>
}
// 1. 创建 Retrofit 对象
val retrofit = Retrofit.Builder().baseUrl("").addConverterFactory(GsonConverterFactory.create()).build()

// 2. 获取 UserMgrService 对象
val service = retrofit.create(UserMgrService::class.java)

// 3. 调用登录方法
val call = service.login("zhangsan", "123456")

// 4. 发送请求
// 同步方式发送请求
val response = call.execute() // 注意,不能直接在主线程中执行网络请求,否则会报 NetworkOnMainThreadException 异常(Android 4.0 后强制抛出的异常)。可新建线程去执行网络请求

// 异步方式发送请求
call.enqueue(object : Callback<UserInfoModel> {
    override fun onFailure(call: Call<UserInfoModel>, t: Throwable) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun onResponse(call: Call<UserInfoModel>, response: Response<UserInfoModel>) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }
})

总结

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

推荐阅读更多精彩内容

  • Retrofit 是什么?简单来说是用来做网络请求的,适用于 android 但又不仅是 android ,jav...
    jkwen阅读 493评论 0 1
  • Retrofit用法详解 参考:Retrofit 官方APIRetrofit用法详解(入门看这篇就够了) 一、简介...
    MryU93阅读 659评论 1 7
  • 前言 最近正在学习Retrofit,转载自这是一份很详细的 Retrofit 2.0 使用教程 中的实例讲解部分,...
    雇个城管打天下阅读 1,014评论 1 2
  • 2017.8.11可能是我今年最开心的一天,也算得上我这辈子为数不多的超级爆棚开心的一天。感恩遇到flynn和笑笑...
    aqua36阅读 438评论 0 2
  • 努力不是为了感动谁 也不是证明给谁看 而是 一路奔跑 离开原点 坚持 不是说说而已 而是 1天 一周 一个月… 我...
    艺容_美术教育投资人阅读 140评论 0 2