美文网首页
kotlin下使用Retrofit进行网络请求以及Cookies

kotlin下使用Retrofit进行网络请求以及Cookies

作者: ZYiDa | 来源:发表于2019-10-24 14:58 被阅读0次

之前刚接触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
)

我是一个初学者,上面算是我的笔记记录吧,如果有代码冗余或不正确的地方,还请各位大佬多多指教。


相关文章

网友评论

      本文标题:kotlin下使用Retrofit进行网络请求以及Cookies

      本文链接:https://www.haomeiwen.com/subject/shzrvctx.html