retrofit2网络请求的kotlin版本封装

2024-06-05 12:08

本文主要是介绍retrofit2网络请求的kotlin版本封装,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从最早网络请求使用httpclient开始,到后面只用okhttp, 到使用retrofit2 ,(听闻retrofit2有kotlin版本,但是我去官网看似乎仍然是java 的)

虽然网络框架还是基于java的。但是多数项目都开始使用kotlin编写。所以对自己之前的封装的网络框架也使用kotlin重构一下吧。

其实还有一些变化,在测试版本的as中 ,权限请求的方法也过时了,结构变得更灵活,所以以后会把那个再重新封装一下。

常规的app用的最多的感觉就是访问网络和权限请求了。好了就这些,这次的封装还耐心的写了注解,并且补全了复合数据的提交。哈哈希望看了这篇的能有点收获吧

有些业务逻辑相关的部分简写了,可以根据实际去扩展。下面是主要代码,其实有部分还没有完善,等再有时间会整理一下。发布到github的仓库。

class CommonHttp {companion object {lateinit var mBaseUrl: Stringlateinit var retrofit: Retrofitlateinit var client:OkHttpClientlateinit var callBack:(back:HttpMessage)->Unit;}/*** 不使用拦截器的构造方法*/constructor(baseUrl:String,function:(back:HttpMessage)->Unit){callBack=functionmBaseUrl=baseUrlif(retrofit==null) {var httpBuilder: OkHttpClient.Builder = OkHttpClient.Builder()var dispatcher = Dispatcher()dispatcher.maxRequests = 128dispatcher.maxRequestsPerHost = 32httpBuilder.dispatcher(dispatcher)httpBuilder.connectionPool(ConnectionPool(32, 20, TimeUnit.MILLISECONDS))client =httpBuilder.readTimeout(3, TimeUnit.MINUTES).connectTimeout(3, TimeUnit.MINUTES).writeTimeout(3,TimeUnit.MINUTES).build()retrofit = Retrofit.Builder().baseUrl(baseUrl).client(client).build();}}/*** 带拦截器的构造方法。多个域名的情况可以考虑使用*/constructor(baseUrl:String,interceptor: Interceptor,function:(back:HttpMessage)->Unit){callBack=functionmBaseUrl=baseUrlif(retrofit==null) {var httpBuilder: OkHttpClient.Builder = OkHttpClient.Builder()var dispatcher = Dispatcher()dispatcher.maxRequests = 128dispatcher.maxRequestsPerHost = 32httpBuilder.dispatcher(dispatcher)httpBuilder.connectionPool(ConnectionPool(32, 20, TimeUnit.MILLISECONDS))client =httpBuilder.readTimeout(3, TimeUnit.MINUTES).connectTimeout(3, TimeUnit.MINUTES).writeTimeout(3,TimeUnit.MINUTES).addInterceptor( if (interceptor==null) BaseUrlInterceptor() else interceptor).build()retrofit = Retrofit.Builder().baseUrl(baseUrl).client(client).build();}}fun doRequest(vararg objects:Any){var call:Call<ResponseBody>? = nullvar cookies:HashMap<String,String> = HashMap()when(objects.size){1->{var url=objects[0] as Stringcall= retrofit.create(CommonHttpService::class.java).get(url)}2->{var url=objects[0] as Stringvar params=objects[1] as HashMap<String,String>/*** json 形式*/var jsonBody:RequestBody= RequestBody.create(MediaType.parse("application/json;charset=utf-8"),JSON.toJSONString(params))/*** form 表单格式*/var formBodyBuilder=FormBody.Builder()for(param in params){formBodyBuilder.add(param.key,param.value)}var formBody=formBodyBuilder.build()call= retrofit.create(CommonHttpService::class.java).post(url,params,jsonBody)//json 或表单形式提交}3->{var url=objects[0] as Stringvar params=objects[1] as HashMap<String,String>var files=objects[2] as HashMap<String, File>/*** 复合表单格式,适合同时提交参数与文件*/var  builer=MultipartBody.Builder()for(param in params){builer.addFormDataPart(param.key,param.value)}for(file in files){var requestBody=RequestBody.create(MediaType.parse("application/octet-stream"),file.value)builer.addFormDataPart(file.key,file.value.name,requestBody)}var multipartBody=builer.build()call= retrofit.create(CommonHttpService::class.java).postFile(url,multipartBody.parts())
//                call= retrofit.create(CommonHttpService::class.java).post(url,cookies,multipartBody)//不同的请求格式,两种都可以,看服务器接收格式}}call?.enqueue(object: retrofit2.Callback<ResponseBody> {override fun onResponse(call: Call<ResponseBody>,response: retrofit2.Response<ResponseBody>,) {Log.e("http","请求成功")if(response!=null) {var message = Message()message.obj = responsemessage.what=0handler.sendMessage(message)}else{handler.sendEmptyMessage(-1)}}override fun onFailure(call: Call<ResponseBody>, t: Throwable) {Log.e("http","请求异常")handler.sendEmptyMessage(-1)}})}/*** httpmsg type 0成功 1失败 -1异常。指代服务器返回结果,-1访问失败 使用*  code 指代服务器业务逻辑返回码*  result 返回的数据*/var handler= object:Handler(Looper.getMainLooper()){override fun handleMessage(msg: Message) {super.handleMessage(msg)var httpmsg=HttpMessage()var response=msg.obj as retrofit2.Response<ResponseBody>var result=response.body().toString()var resultFormat=getResultFormat(result)when(msg.what){-1->{httpmsg.type=-1callBack(httpmsg)}0->{when(response.code()){200-> {httpmsg.code = resultFormat.code/*** 业务逻辑层面判断成功与失败*/if(resultFormat.code==1000) {httpmsg.type=0httpmsg.msg = resultFormat.msghttpmsg.result = result}else{httpmsg.type=1httpmsg.msg = resultFormat.msghttpmsg.result = result}}500,400,404->{httpmsg.type=-1httpmsg.code=response.code()}}callBack(httpmsg)}}}}fun getResultFormat(json:String):ResultFormat{return JSON.parse(json) as ResultFormat}/*** 默认拦截器。在baseurl改变时进行重定向*/class BaseUrlInterceptor:Interceptor{open override fun intercept(chain: Interceptor.Chain): Response {var request:Request=chain.request()var oldHttpUrl:HttpUrl=request.url()var builder:Request.Builder=request.newBuilder()var newHttpUrl:HttpUrl= HttpUrl.parse(mBaseUrl)!!var httpUrl=oldHttpUrl.newBuilder().scheme(newHttpUrl.scheme()).host(newHttpUrl.host()).port(newHttpUrl.port()).build()return  chain.proceed(builder.url(httpUrl).build())}}
}data class ResultFormat(var msg:String,var code:Int)
data class HttpMessage(var type:Int=-1,var code:Int=-1,var msg:String="",var result:String="")
interface CommonHttpService {@HTTP(method="POST",path="{url}",hasBody=true)@Headers("ContentType:application/json;charset=UTF-8")fun post(@Path(value="url",encoded = true) url:String?,@HeaderMap() cookies:HashMap<String,String>,@Body body:RequestBody): Call<ResponseBody>@HTTP(method = "GET", hasBody = false)operator fun get(@Url url: String?): Call<ResponseBody>@HTTP(method = "GET", hasBody = false)operator fun get(@Url url: String?,@HeaderMap tokens: HashMap<String?, String?>?): Call<ResponseBody>@Multipart@HTTP(method = "POST", path = "{url}", hasBody = true)fun postFile(@Path(value = "url", encoded = true) url: String?,@Part parts: List<MultipartBody.Part?>?): Call<ResponseBody>@Multipart@HTTP(method = "POST", path = "{url}", hasBody = true)fun postFile(@Path(value = "url", encoded = true) url: String?,@Header("Cookie") token: String?,@Part parts: List<MultipartBody.Part?>?): Call<ResponseBody>
}

 

这篇关于retrofit2网络请求的kotlin版本封装的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1033011

相关文章

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

Kotlin 枚举类使用举例

《Kotlin枚举类使用举例》枚举类(EnumClasses)是Kotlin中用于定义固定集合值的特殊类,它表示一组命名的常量,每个枚举常量都是该类的单例实例,接下来通过本文给大家介绍Kotl... 目录一、编程枚举类核心概念二、基础语法与特性1. 基本定义2. 带参数的枚举3. 实现接口4. 内置属性三、

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

Linux升级或者切换python版本实现方式

《Linux升级或者切换python版本实现方式》本文介绍在Ubuntu/Debian系统升级Python至3.11或更高版本的方法,通过查看版本列表并选择新版本进行全局修改,需注意自动与手动模式的选... 目录升级系统python版本 (适用于全局修改)对于Ubuntu/Debian系统安装后,验证Pyt

MySQL 升级到8.4版本的完整流程及操作方法

《MySQL升级到8.4版本的完整流程及操作方法》本文详细说明了MySQL升级至8.4的完整流程,涵盖升级前准备(备份、兼容性检查)、支持路径(原地、逻辑导出、复制)、关键变更(空间索引、保留关键字... 目录一、升级前准备 (3.1 Before You Begin)二、升级路径 (3.2 Upgrade

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright