之前刚接触Android
时用OkHttp3
来进行网络请求的,这次换成了基于OkHttp
封装的Retrofit
,两者持久化Cookies
的方法可以说几乎是一样。当然这只是持久化Cookies
的方法之一。
-
1先导入下面的几个依赖库
//Reftrofit
implementation 'com.squareup.retrofit2:retrofit:2.6.2'
implementation 'com.squareup.retrofit2:converter-gson:2.6.2'
//cookies持久化
implementation 'com.github.franmontiel:PersistentCookieJar:v1.0.1'
-
2 以 wanandroid 平台的TODO API接口为例
-
获取OkHttpClient 并进行cookie持久化
/**
* 获取OkHttpClient 并进行cookie持久化
* @param context Context
* */
private fun OkHttpClientBuilder(context: Context): OkHttpClient {
//自动cookies持久化
val cookieJar = PersistentCookieJar(
SetCookieCache(),
SharedPrefsCookiePersistor(context.applicationContext)
)
return OkHttpClient.Builder().apply {
cookieJar(cookieJar)
}.build()
}
-
获取Retrofit对象
/**
* 获取Retrofit对象
* @param context Context
* */
fun RetrofitCreater(context: Context): Retrofit {
return Retrofit.Builder().apply {
baseUrl(BASE_URL)
addConverterFactory(GsonConverterFactory.create())
client(OkHttpClientBuilder(context))
this
}.run {
build()
}
}
其中的重点就是
PersistentCookieJar(
SetCookieCache(),
SharedPrefsCookiePersistor(context.applicationContext)
)
和下面的这句
client(OkHttpClientBuilder(context))
-
创建请求接口
interface Request {
/**
* 登录
* @param username 登录名
* @param password 密码
* */
@FormUrlEncoded
@POST("/user/login")
fun login(@Field("username") username:String,
@Field("password") password:String):Call<MainResponse<LoginData>>
/**
* 注册
*
* @param username 用户名
* @param password 输入的密码
* @param repassword 重新输入的密码
* */
@FormUrlEncoded
@POST("/user/register")
fun register(@Field("username") username: String,
@Field("password") password: String,
@Field("repassword") repassword:String):Call<MainResponse<RegisterData>>
/**
*退出登录
*/
@GET("/user/logout/json")
fun logout():Call<MainResponse<Any?>>
/**
* 新增一个TODO
*
* @param title 新增标题(必须)
* @param content 新增详情(必须)
* @param date 2018-08-01 预定完成时间(不传默认当天,建议传)
* @param type 大于0的整数 1、工作 2、生活 3、娱乐;查询的时候,传入type 进行筛选
* @param priority 重要等级 大于0的整数 ;查询的时候,传入priority 进行筛选
* */
@FormUrlEncoded
@POST("/lg/todo/add/json")
fun addTodo(@Field("title") title:String,
@Field("content") content:String,
@Field("date") date:String,
@Field("type") type:Int,
@Field("priority") priority:Int):Call<MainResponse<TodoItemData>>
/**
* 更新一个TODO
*
* @param id 每个todo都会有个id标识
* @param title 更新标题
* @param content 新增详情
* @param date 更新后的时间
* @param status 更新状态
* @param type 更新的类别
* @param priority 更新的优先级
*/
@FormUrlEncoded
@POST("/lg/todo/update/83/json")
fun updateTodo(@Field("id") id:Int,
@Field("title") title:String,
@Field("content") content:String,
@Field("date") date:String,
@Field("status") status:Int,
@Field("type") type:Int,@Field("priority") priority:Int)
/**
* 删除一个TODO
*
* @param id 所删除todo对应的id
* */
@FormUrlEncoded
@POST("/lg/todo/delete/83/json")
fun deleteTodo(@Field("id") id:Int):Call<MainResponse<Any?>>
/**
* 更新TODO的完成状态
*
* @param id todo对应的id
* @param status 所需要更新为的状态
* */
@FormUrlEncoded
@POST("/lg/todo/done/80/json?id={id}")
fun updateCompletionStatus(@Path("id") id:Int,
@Field("status") status:Int):Call<MainResponse<Any?>>
/**
* 获取TODO列表
* @param page 页码数
* @param status TODO的状态1-完成;0 未完成; -1默认全部展示
* @param type 创建时传入的类型, -1 默认全部展示
* @param priority 创建时传入的优先级;-1 默认全部展示
* @param orderby 1:完成日期顺序;2.完成日期逆序;3.创建日期顺序;4.创建日期逆序(默认)
* */
@GET("/lg/todo/v2/list/{page}/json?status={status}&type={type}&priority={priority}&orderby={orderby}")
fun getTodoListData(@Path("page") page:Int,
@Path("status") status:Int,
@Path("type") type:Int,
@Path("priority") priority:Int,
@Path("orderby") orderby:Int):Call<MainResponse<TodoListInfo<TodoItemData>>>
}
-
具体的使用
val login = RetrofitCreater(this).create(Request::class.java)
login.login("HongmengOS","1234567890").enqueue(object : Callback<MainResponse<LoginData>>{
override fun onResponse(
call: Call<MainResponse<LoginData>>,
response: Response<MainResponse<LoginData>>
) {
Log.d("LOGIN-RESPONSE","${response.body()?.data?.username}")
}
override fun onFailure(call: Call<MainResponse<LoginData>>, t: Throwable) {
Log.d("LOGIN-RESPONSE","${t.localizedMessage}")
}
})
-
用到的部分数据类
data class MainResponse<T>(
val data:T?,
val errorCode:Int,
val errorMsg:String
)
data class LoginData(
val admin:Boolean,
val id:Int,
val nickname:String,
val publicName:String,
val username:String,
val icon:String
)
网友评论