IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 网络请求框架Retrofit基本使用(Kotlin) -> 正文阅读

[移动开发]网络请求框架Retrofit基本使用(Kotlin)

前几天了介绍了

Kotlin的基本使用和基类封装、MVVM和DataBinding

LiveData二次封装、Kotlin中使用简单

Android项目以依赖的形式使用

小狗蛋:以上基本就能实现一个完整的项目了
慕容海柱:感觉少点啥
小狗蛋:还少啥,够用了
慕容海柱:那你网络请求用啥?OKHTTP吗?感觉不搭啊
小狗蛋:行叭,那咱用Retrofit
慕容海柱:咋用?
小狗蛋:走着

首先导入依赖,如何自己写一个依赖看上面
有请求也把解析搞里头!

    implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
    implementation 'com.squareup.retrofit2:retrofit:2.5.0'

其次就可以用了,在方法里面写相关数据就行了

慕容海柱:别闹!

Retrofit是基于OKHTTP封装的请求框架,可以理解为只是给OKHTTP穿了一层衣服,里面还是OKHTTP进行活动,衣服只是为了更好看,通过动态注册以及注解的方式去进行请求体的构造

这里以玩Android的开放API作为例子,本Demo本人运行正常,不正常就拿出来骗赞太不道德了。

GET请求

在这里插入图片描述

fun getData(){
        val mGson = GsonBuilder()
            .setLenient() // 设置GSON的非严格模式setLenient()
            .create()
        Retrofit.Builder()
            .baseUrl("https://www.wanandroid.com/")
            .addConverterFactory(GsonConverterFactory.create(mGson))
            .build()
            .create(getData::class.java)
            .getJsonData()
            .enqueue(object : Callback<JsonsRootBean?> {
                override fun onResponse(call: Call<JsonsRootBean?>, response: Response<JsonsRootBean?>) {
                    //请求成功走这里
                    val body: JsonsRootBean? = response.body()
                }
                override fun onFailure(call: Call<JsonsRootBean?>, t: Throwable) {
                    //请求失败走这里
                    Log.e(TAG, "onFailure: $t")
                }
            })
    }
    interface getData {
        @GET("article/list/1/json")
        fun getJsonData(
            //这里面放参数
        ): Call<JsonsRootBean>
    }

POST请求

在这里插入图片描述

fun postData(){
        var mGson = GsonBuilder()
            .setLenient() // 设置GSON的非严格模式setLenient()
            .create()
        Retrofit.Builder()
            .baseUrl("https://www.wanandroid.com/")
            .addConverterFactory(GsonConverterFactory.create(mGson))
            .build()
            .create(postData::class.java)
            .getJsonData(
                "我是Token",
                "我是其他的数据")
            .enqueue(object : Callback<JsonsRootBean?> {
                override fun onResponse(call: Call<JsonsRootBean?>, response: Response<JsonsRootBean?>) {
                    val body = response.body()
                }
                override fun onFailure(call: Call<JsonsRootBean?>, t: Throwable) {
                    Log.e(TAG, "onFailure: $t")
                }
            })
    }

    interface postData{
        @FormUrlEncoded
        @POST("article/cutStore")
        fun getJsonData(
            @Header("apikey") apikey: String,
            @Field("articleid") articleid: String?,
        ): Call<JsonsRootBean>
    }

实体类:因为是用Kotlin,不需要 get set 方法,最后别忘了实例化一下

class JsonsRootBean(
    private var data: Data? = null,
    private var errorcode: Int = 0,
    private var errormsg: String? = null
) : Serializable

class Datas(
    var apklink: String? = null,
    var audit: Int = 0,
    var author: String? = null,

    var canedit: Boolean = false,

    var chapterid: Int = 0,

    var chaptername: String? = null,
    var collect: Boolean = false,

    var courseid: Int = 0,
    var desc: String? = null,

    var descmd: String? = null,

    var envelopepic: String? = null,
    var fresh: Boolean = false,
    var host: String? = null,
    var id: Int = 0,
    var link: String? = null,

    var nicedate: String? = null,

    var nicesharedate: String? = null,
    var origin: String? = null,
    var prefix: String? = null,

    var projectlink: String? = null,

    var publishtime: Int = 0,

    var realsuperchapterid: Int = 0,

    var selfvisible: Int = 0,

    var sharedate: Int = 0,

    var shareuser: String? = null,

    var superchapterid: Int = 0,

    var superchaptername: String? = null,
    //var tags: ArrayList<String>? = arrayListOf(),
    var title: String? = null,
    var type: Int = 0,

    var userid: Int = 0,
    var visible: Int = 0,
    var zan: Int = 0,
) : Serializable

class Data(
    var curpage: Int = 0,
    var datas: List<Datas>? = null,
    var offset: Int = 0,
    var over: Boolean = false,

    var pagecount: Int = 0,
    var size: Int = 0,
    var total: Int = 0,
) : Serializable


打眼一看,这这代码和OKHTTP也没差多少啊,别急,你仔细看

在这里插入图片描述
正常情况下,这些部分都是可以单独拿出来集中管理的,解耦!

走一下流程吧,与OKHTTP比较一下,看一下请求数据部分,get、post都是以注释的形式单独拿出来的,ttp呢,每次都需要 .add(" “,” "),想单独拿出来,阔以,你在写一个小小实体类呗或者map?(其实可以通过FormBody) ttp每次请求成功都需要自己去Gson,fit 不用, .body 直接拿来用

慕容海柱:其他的呢?

小狗蛋:。。。。,这个吧,除了一些官方的什么支持这个,支持那个,用起来也没啥,不过用起来代码量和写法上确实简洁许多。好评!

狗蛋小提示:
请求的时候可能会出现解析错误:JsonSyntaxException
不要慌
1.根据日志错误
在这里插入图片描述
我的明显已经提出哪个参数解析错误了,根据提示改一下就行,改不了的去看一下这个参数有没有用到,一般是用于网络上的,没用的注释掉,嘿嘿嘿

2.日志未有用信息
就算没有有用信息,也会指出哪种类型错误,去根据类型推测出错误,和后端小伙伴确认下,改成一致,或者没有直接证据,搞一个抓包看一下,拿着截图找人,奥里给

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:36:39  更:2022-03-30 18:41:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 19:29:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码