Retrofit 简单来说就是一个封装了Okhttp 的网络请求框架.(反正我是这么理解的,不对的请斧正)
优点:(摘抄:https://blog.csdn.net/carson_ho/article/details/73732076)
@ 功能强大 支持同步/异步 支持多种数据解析 支持Rxjava
@ 简介易用 通过注解配置参数,采用大量设计模式优化
@ 可扩展性好
理论啥的先不管,先能使用再说吧
(听说当年郭靖也是先记住了再慢慢消化的)
简单使用:
添加依赖
dependencies {
// Okhttp库
compile 'com.squareup.okhttp3:okhttp:版本号(3.1.2)'
// Retrofit库
compile 'com.squareup.retrofit2:retrofit:版本号(2.0.2)'
}
添加权限
<uses-permission android:name="android.permission.INTERNET"/>
接收服务器返回实体类
data class BaseResponse<T>(val code :Int, val msg:String, val data:T)
创建接口Api 类(人喜好 有的喜欢放一个类,本人喜欢更具模块去分对应的API)
interface ApiService {
@GET("v2/feed?")
fun getFirstHomeData(@Query("num") num:Int): Observable<HomeBean>
}
创建Retrofit 对象
// 获取retrofit的实例
retrofit = Retrofit.Builder()
/**自己配置 阿里巴巴编码插件会告诉你 不要在单行后边加注视 **/
.baseUrl(BASE_URL)
.client(client!!)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build()
使用大致:
(Activity 部分代码)
mPresenter.requestHomeData(num)
(Presenter 部分代码)
override fun requestRankList(apiUrl: String) {
checkViewAttached()
mRootView?.showLoading()
val disposable = rankModel.requestRankList(apiUrl)
.subscribe({ issue ->
mRootView?.apply {
dismissLoading()
setRankList(issue.itemList)
}
}, { throwable ->
mRootView?.apply {
//处理异常
showError(ExceptionHandle.handleException(throwable),ExceptionHandle.errorCode)
}
})
addSubscription(disposable)
}
(Model 部分代码)
fun requestRankList(apiUrl:String): Observable<HomeBean.Issue> {
return RetrofitManager.service.getIssueData(apiUrl)
.compose(SchedulerUtils.ioToMain())
}
详细见DEMO 使用 (项目中 为MVP 模式 Kotlin + Retrofit + RxJava)
详解:
网络请求方法:
@GET @POST @PUT @DELETE @PATH @HEAD @OPTIONS @HTTP
其中@GET @POST @HEAD @DELETE @PUT 对应HTTP的网络请求方式
另外 此处URL做一特殊说明:
Retrofit 把URL分为2部分
1. 在创建Retrofit 实体时候 通过baseUrl()方法设置
2. 在API中通过注解设置 即:@GET() 等设置的
完整URL = BASE_URL+ 相对路径
// 以上的效果是一致的。
// 区别在于使用场景和使用方式
// 1. 使用场景:@Header用于添加不固定的请求头,@Headers用于添加固定的请求头
// 2. 使用方式:@Header作用于方法的参数;@Headers作用于方法
@Header & @Headers
// @ Header
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)
// @Headers
@Headers("Authorization: authorization")
@GET("user")
Call<User> getUser()
@Body
作用: 以POST方式 传递自定义数据类型 给服务器
特别注意:如果提交的是一个Map,那么作用相当于 @Field
@Query和@QueryMap
作用:用于 @GET 方法的查询参数(Query = Url 中 ‘?’ 后面的 key-value)
@Url
作用:直接传入一个请求的 URL变量 用于URL设置
// 当有URL注解时,@GET传入的URL就可以省略
// 当GET、POST...HTTP等方法中没有设置Url时,则必须使用 {@link Url}提供
网友评论