Retrofit 入門

Retrofit 簡介

Retrofit 是 Square 公司基于 Restful 風(fēng)格推出的網(wǎng)絡(luò)框架封裝。
Retrofit 與 OKHttp 的關(guān)系:Retrofit 是基于 OKHttp 的網(wǎng)絡(luò)請求框架的二次封裝,其本質(zhì)仍是 OkHttp。

常見網(wǎng)絡(luò)庫的對比:

  • AndroidAsynHttp:基于 HttpClient,作者已停止維護,Android 5.0 不再使用 HttpClient,因此不推薦使用。
  • Volley:基于 HttpUrlConnection,Google 官方推出,只適合輕量級網(wǎng)絡(luò)交互,不適合大文件上傳下載場景。
  • Retrofit:API 設(shè)計簡單易用,注解化配置高度解耦,支持多種解析器,支持 RxJava。

使用步驟

1. 依賴包導(dǎo)入

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. 網(wǎng)絡(luò)權(quán)限

網(wǎng)絡(luò)權(quán)限:

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

3. 創(chuàng)建接口設(shè)置請求類型與參數(shù)

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

常用參數(shù)注解:

  • @GET、@POST:確定請求方式
  • @Path:請求 URL 的字符替代
  • @Query:要傳遞的參數(shù)
  • @QueryMap:包含多個 @Query 注解參數(shù)
  • @Body:添加實體類對象
  • @FormUrlEncoded:URL 編碼

4. 創(chuàng)建 Retrofit 對象設(shè)置數(shù)據(jù)解析器

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

常用數(shù)據(jù)解析器:

  • 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. 生成接口調(diào)用接口方法

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

6. 返送請求處理返回數(shù)據(jù)

發(fā)送請求(同步/異步):

  • 同步:調(diào)用 Call 對象的 execute(),返回結(jié)果的響應(yīng)體。
  • 異步:調(diào)用 Call 對象的 enqueue(),參數(shù)是一個回調(diào)。

案例

介紹如何使用Retrofit實現(xiàn)用戶登錄。

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

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

// 3. 調(diào)用登錄方法
val call = service.login("zhangsan", "123456")

// 4. 發(fā)送請求
// 同步方式發(fā)送請求
val response = call.execute() // 注意,不能直接在主線程中執(zhí)行網(wǎng)絡(luò)請求,否則會報 NetworkOnMainThreadException 異常(Android 4.0 后強制拋出的異常)。可新建線程去執(zhí)行網(wǎng)絡(luò)請求

// 異步方式發(fā)送請求
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.
    }
})

總結(jié)

  • Retrofit 是基于 OkHttp 網(wǎng)絡(luò)庫的高級封裝
  • 采用注解,網(wǎng)絡(luò)請求參數(shù)配置更靈活,擴展性更好
  • Restful 風(fēng)格的 API 優(yōu)先選用 Retrofit
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Retrofit 是什么?簡單來說是用來做網(wǎng)絡(luò)請求的,適用于 android 但又不僅是 android ,jav...
    jkwen閱讀 607評論 0 1
  • Retrofit用法詳解 參考:Retrofit 官方APIRetrofit用法詳解(入門看這篇就夠了) 一、簡介...
    MryU93閱讀 712評論 1 7
  • 前言 最近正在學(xué)習(xí)Retrofit,轉(zhuǎn)載自這是一份很詳細的 Retrofit 2.0 使用教程 中的實例講解部分,...
    雇個城管打天下閱讀 1,156評論 1 2
  • 2017.8.11可能是我今年最開心的一天,也算得上我這輩子為數(shù)不多的超級爆棚開心的一天。感恩遇到flynn和笑笑...
    aqua36閱讀 504評論 0 2
  • 今天是什么日子 起床:7時 就寢:22時 天氣:晴 心情:好 紀(jì)念日:無 叫我起床的不是鬧鐘是夢想 年度目標(biāo)及關(guān)鍵...
    98ae0474329c閱讀 330評論 5 13