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版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

Python实现简单封装网络请求的示例详解

《Python实现简单封装网络请求的示例详解》这篇文章主要为大家详细介绍了Python实现简单封装网络请求的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装依赖核心功能说明1. 类与方法概览2.NetHelper类初始化参数3.ApiResponse类属性与方法使用实

Kotlin 协程之Channel的概念和基本使用详解

《Kotlin协程之Channel的概念和基本使用详解》文章介绍协程在复杂场景中使用Channel进行数据传递与控制,涵盖创建参数、缓冲策略、操作方式及异常处理,适用于持续数据流、多协程协作等,需注... 目录前言launch / async 适合的场景Channel 的概念和基本使用概念Channel 的

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

SpringBoot请求参数传递与接收示例详解

《SpringBoot请求参数传递与接收示例详解》本文给大家介绍SpringBoot请求参数传递与接收示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录I. 基础参数传递i.查询参数(Query Parameters)ii.路径参数(Path Va

Ubuntu如何升级Python版本

《Ubuntu如何升级Python版本》Ubuntu22.04Docker中,安装Python3.11后,使用update-alternatives设置为默认版本,最后用python3-V验证... 目China编程录问题描述前提环境解决方法总结问题描述Ubuntu22.04系统自带python3.10,想升级

使用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. 内置属性三、