使用Kotlin+协程+Flow+Retrofit+OkHttp搭建一套网络请求工具

本文主要是介绍使用Kotlin+协程+Flow+Retrofit+OkHttp搭建一套网络请求工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、前言
    • 二、搭建Java工程
      • 1.打开Android Studio 建一个Android 工程
      • 2.修改该工程的build.gradle文件为Java 工程,并配置如下:
      • 3. 搭建一个 RetrofitUtils 请求工具类,这都是常规操作了,如下
      • 4.建一个 NetWorkAPi 作为 Retrofit 请求接口:
      • 5.建一个 WXRepository 为了和Android 里面保持一致,可以直接拿过去用
      • 6.新建一个 WXMainTool.kt 类作为 主程序调用main 函数入口:
    • 三、运行调用接口

一、前言

  1. 怎么快速找调试接口?怎么快速找一个网络请求工具?
    很多人马上想到Retrofit + Okhttp 早起还有 HttpURLConnection 和 Volley但是 这大家常用的都是集成在Android程序里面,需 要安装运行在android设备里面,大多数需要触发按钮点击 才能调用访问接口,我们大多数情况下是需要 先看到数据结构正常,符合要求了,才进行开始写网络接口部分,特别是在自己研究某些网络接口,而这时候又没有类似可以调试的文档的时候

  2. 网络请求工具PC版上有好多工具。类似 Swagger 文档 , ApiFox ,或者其他在线网页请求工具?为什么又不用
    其实这个问题是,有类似网络调试接口文档是最好的,有时候没有的情况下或者说这些工具,大大小小都不是能完全满足某些需求,特别是 post的各种方式,或者put等不常用的请求方式

  3. 那 Retrofit + Okhttp 解耦的这么好用,可以搭建起来在PC上直接运行吗?可以的,不用那么麻烦的要查看一个接口数据,需要写好运行安装到手机里面,再点击按钮,这个过程大概需要 一分钟左右,如果写好代码直接调用,随时可以调用,不是节省很多时间。

  4. 这样做有什么好处?
    (1) 方便调试,方便快速查看接口数据,节省很多时间
    (2) 可以快速用PC写好的网络部分拷贝到Android工程项目里面用
    (3) 在没有调试接口文档,调用第三方Api或者研究其他接口时快速调用下接口后看内容
    (4) 网络抓包,找其他资源情况下,可以快速抓取到

二、搭建Java工程

1.打开Android Studio 建一个Android 工程

2.修改该工程的build.gradle文件为Java 工程,并配置如下:

plugins {id 'java-library'id 'kotlin'
}java {sourceCompatibility = JavaVersion.VERSION_1_8targetCompatibility = JavaVersion.VERSION_1_8
}dependencies {implementation "org.jetbrains.kotlin:kotlin-stdlib:1.7.0"implementation 'com.squareup.retrofit2:retrofit:2.9.0'implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'implementation 'com.squareup.okhttp3:logging-interceptor:4.9.3'implementation 'com.squareup.okhttp3:okhttp:4.9.3'implementation 'com.squareup.okio:okio:2.10.0'implementation 'com.squareup.retrofit2:converter-gson:2.9.0'implementation 'com.google.protobuf:protobuf-java:3.5.1'implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2'
}

3. 搭建一个 RetrofitUtils 请求工具类,这都是常规操作了,如下

class RetrofitUtils private constructor(private val baseUrl: String) {companion object {var instance: RetrofitUtils? = nullfun getInstance(baseUrl: String) = instance ?: synchronized(this) {instance ?: RetrofitUtils(baseUrl).also { instance = it }}}private inline val retrofit: Retrofitget() {val logging = HttpLoggingInterceptor()val timeout = 30000Lval okHttpClient = OkHttpClient.Builder().addInterceptor(HeaderInterceptor()).addInterceptor(logging)
//                .addInterceptor(RetrofitClient.BaseUrlInterceptor()).callTimeout(timeout, TimeUnit.MILLISECONDS)//设置连接超时.connectTimeout(timeout, TimeUnit.MILLISECONDS)//设置从主机读信息超时.readTimeout(timeout, TimeUnit.MILLISECONDS)//设置写信息超时.writeTimeout(timeout, TimeUnit.MILLISECONDS).retryOnConnectionFailure(true)//设置出现错误进行重新连接。.build();return Retrofit.Builder().client(okHttpClient).addConverterFactory(ScalarsConverterFactory.create()).addConverterFactory(GsonConverterFactory.create()).baseUrl(baseUrl).build()}fun <T> create(service: Class<T>?): T {if (service == null) {throw RuntimeException("Api service is null!")}return retrofit.create(service)!!}
}

4.建一个 NetWorkAPi 作为 Retrofit 请求接口:

interface NetWorkAPi {//示例post 请求@FormUrlEncoded@POST("https://www.wanandroid.com/user/register")suspend fun register(@Field("username") username: String,@Field("password") password: String,@Field("repassword") repassword: String): String// 示例get 请求@GET("article/list/0/json")suspend fun getHomeList(): String// 示例get 请求2@GET("article/list/{path}/json")suspend fun getHomeList22(@Path("path") page: Int): HomeData/************************* 以下只 示例写法,接口调不通,因为找不到那么多 公开接口  全是 Retrofit的用法 来测试 *****************************************************///    @FormUrlEncoded@Headers("Content-Type: application/x-www-form-urlencoded")  //todo 固定 header@POST("https://xxxxxxx")fun post1(@Body body: RequestBody): String//    @FormUrlEncoded@Headers("Content-Type: application/x-www-form-urlencoded")@POST("https://xxxxxxx22222")fun post12(@Body body: RequestBody, @HeaderMap map: Map<String, String>): String //todo  HeaderMap 多个请求头部自己填写
}

5.建一个 WXRepository 为了和Android 里面保持一致,可以直接拿过去用

class WXRepository private constructor() {companion object {val instance by lazy { WXRepository() }}private val baseUrl = "https://www.wanandroid.com/"private val api = RetrofitUtils.getInstance(baseUrl).create(NetWorkAPi::class.java)fun getHomeList() {runBlocking {// 主协程下面执行 flow 异步请求flow {emit(api.getHomeList())}.flowOn(Dispatchers.IO).catch {println(it.parseErrorString()) // 打印异常信息}.collect {println("网络返回结果:$it") // 打印异常信息}delay(10000) // 让程序主进程 在打印前不结束}}fun getHomeList22() {runBlocking {// 主协程下面执行 flow 异步请求flow {emit(api.getHomeList22(1))}.flowOn(Dispatchers.IO).catch {println(it)println(it.parseErrorString()) // 打印异常信息}.collect {it.data?.datas?.forEachIndexed { i, it ->println("第$i 条 : ${it.title}") // 打印异常信息}}delay(10000) // 让java工程 程序主进程 在打印前不结束}}fun register(username: String, password: String, repassword: String) {runBlocking {flow {emit(api.register(username, password, repassword))}.flowOn(Dispatchers.IO).catch {println(it)println(it.parseErrorString()) // 打印异常信息}.collect {println(it)}}}/************************* 以下只 示例写法,接口调不通,因为找不到那么多 公开接口  全是 Retrofit的用法 来测试 *****************************************************/fun post1() {runBlocking {flow {val map = mutableMapOf<String, Any>()map["AAAAAA"] = "AAAAAA"map["BBBBBB"] = 1map["CCCCCC"] = truemap["DDDDDD"] = 30.00femit(api.post1(RequestBodyWrapper(Gson().toJson(map))))}.flowOn(Dispatchers.IO).catch {println(it)println(it.parseErrorString()) // 打印异常信息}.collect {println(it)}}}fun post12() {runBlocking {flow {val map = mutableMapOf<String, Any>()map["AAAAAA"] = "AAAAAA"map["BBBBBB"] = 1map["CCCCCC"] = truemap["DDDDDD"] = 30.00fval headerMap = mapOf("Cookie" to "uab_collina=171755326751237298573402; tfstk=fFqEGyx3iMIEHdYy8fir_5GQozgKVDffUuGSE82odXcnd0awZ5V9FXiIAPlzs5lhp6CLa3Van4c7V09LWSwDAk_KV3-K20ffGisXpJn-qHga3LOpSxMhVYcnqYuGorffGis_pJn-qsa52bcgOYhMKYc3Zh0i6Y8oqX0ksFDmsbmoq7xGjxM2xU0oKdc9M402bY3h9NU_OKjk2plbKf-2BPkMqjsxT3Y7bvRjZJYDq3qZL2ESMIWRh2auHqEQQg-tA-zijYrRnUlruzqIjkfGmV3uz7DTW_8rgz2QkAqcFEh_bXNuYVXX04igcqm35NCIPDkoxqUOeeGur-rqAW19qXa4I5ubfCtjmrFa4qmc4XO-ISE82yRkr2xSQj6NI96RN__qDt2vyU3B6AlfK9YkrIKXVer5pUL-RaDZG9XA.; uag=7aed8d4dcb46b3eaa0e85f86b21df22e; ylogin=4024975; folder_id_c=10376791; phpdisk_info=WGhSYARkBz8BOgRjDmEEV1QwAAsAaAVlAzcDYw8xCjlTZFdjUjcDPFJiUAkMYFU9VD0NP109BWIPbgQxATMKPVg5UjUEMgdtAWAENQ5jBG5UZgA6AGoFawM4A2oPPwptU2FXYlJiAzxSZ1BhDF9VPlQzDThdNAVqDz0EZwExCj9Yb1Ji; PHPSESSID=pbba5e4111h3fk7om64mdgf4sbd0c6lm; __tins__21412745=%7B%22sid%22%3A%201717724688543%2C%20%22vd%22%3A%2012%2C%20%22expires%22%3A%201717727331949%7D; __51cke__=; __51laig__=12","Host" to "up.SSSSSwxxxoozooo.com","Origin" to "http://AAAAAAAAup.wxssosdsozosdoo.com","Referer" to "http://AAAAAAAup.wodsdsdsdsdosddszooo.com/mydisk.php?item=files&action=index&u=4024975")emit(api.post12(RequestBodyWrapper(Gson().toJson(map)), headerMap))}.flowOn(Dispatchers.IO).catch {println(it)println(it.parseErrorString()) // 打印异常信息}.collect {println(it)}}}
}

6.新建一个 WXMainTool.kt 类作为 主程序调用main 函数入口:

fun main() {
//    WXRepository.instance.getHomeList()WXRepository.instance.getHomeList22()
//    WXRepository.instance.register("WXXXXXXXXXX","1212121","1212121")}

三、运行调用接口

这里运行 WXRepository.instance.getHomeList22() ,而调用 WXRepository中的

fun getHomeList22() {runBlocking {// 主协程下面执行 flow 异步请求flow {emit(api.getHomeList22(1))}.flowOn(Dispatchers.IO).catch {println(it)println(it.parseErrorString()) // 打印异常信息}.collect {it.data?.datas?.forEachIndexed { i, it ->println("第$i 条 : ${it.title}") // 打印异常信息}}delay(10000) // 让java工程 程序主进程 在打印前不结束}
}

这篇关于使用Kotlin+协程+Flow+Retrofit+OkHttp搭建一套网络请求工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1114906

相关文章

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设

Spring 缓存在项目中的使用详解

《Spring缓存在项目中的使用详解》Spring缓存机制,Cache接口为缓存的组件规范定义,包扩缓存的各种操作(添加缓存、删除缓存、修改缓存等),本文给大家介绍Spring缓存在项目中的使用... 目录1.Spring 缓存机制介绍2.Spring 缓存用到的概念Ⅰ.两个接口Ⅱ.三个注解(方法层次)Ⅲ.

PyTorch中cdist和sum函数使用示例详解

《PyTorch中cdist和sum函数使用示例详解》torch.cdist是PyTorch中用于计算**两个张量之间的成对距离(pairwisedistance)**的函数,常用于点云处理、图神经网... 目录基本语法输出示例1. 简单的 2D 欧几里得距离2. 批量形式(3D Tensor)3. 使用不

C#使用MQTTnet实现服务端与客户端的通讯的示例

《C#使用MQTTnet实现服务端与客户端的通讯的示例》本文主要介绍了C#使用MQTTnet实现服务端与客户端的通讯的示例,包括协议特性、连接管理、QoS机制和安全策略,具有一定的参考价值,感兴趣的可... 目录一、MQTT 协议简介二、MQTT 协议核心特性三、MQTTNET 库的核心功能四、服务端(BR

使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案

《使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案》在SpringBoot应用中,我们经常使用​​@Cacheable​​注解来缓存数据,以提高应用的性能... 目录@Cacheable注解Redis时,Redis宕机或其他原因连不上,继续调用原方法的解决方案1

java中XML的使用全过程

《java中XML的使用全过程》:本文主要介绍java中XML的使用全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录什么是XML特点XML作用XML的编写语法基本语法特殊字符编写约束XML的书写格式DTD文档schema文档解析XML的方法​​DOM解析XM

使用Java实现Navicat密码的加密与解密的代码解析

《使用Java实现Navicat密码的加密与解密的代码解析》:本文主要介绍使用Java实现Navicat密码的加密与解密,通过本文,我们了解了如何利用Java语言实现对Navicat保存的数据库密... 目录一、背景介绍二、环境准备三、代码解析四、核心代码展示五、总结在日常开发过程中,我们有时需要处理各种软

利用Python实现Excel文件智能合并工具

《利用Python实现Excel文件智能合并工具》有时候,我们需要将多个Excel文件按照特定顺序合并成一个文件,这样可以更方便地进行后续的数据处理和分析,下面我们看看如何使用Python实现Exce... 目录运行结果为什么需要这个工具技术实现工具的核心功能代码解析使用示例工具优化与扩展有时候,我们需要将

使用Nginx配置文件服务器方式

《使用Nginx配置文件服务器方式》:本文主要介绍使用Nginx配置文件服务器方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 为什么选择 Nginx 作为文件服务器?2. 环境准备3. 配置 Nginx 文件服务器4. 将文件放入服务器目录5. 启动 N

使用nohup和--remove-source-files在后台运行rsync并记录日志方式

《使用nohup和--remove-source-files在后台运行rsync并记录日志方式》:本文主要介绍使用nohup和--remove-source-files在后台运行rsync并记录日... 目录一、什么是 --remove-source-files?二、示例命令三、命令详解1. nohup2.