前言

声明的时候比Retrofit更加简单,而且因为是从Retrofit上改的,所以Retrofit能用的东西这个库也能用

修改的地方

1.如果参数不加任何注解,则默认是@Field,并且value为参数名(使用了kt反射,所以使用该特性必须用kt文件)

Retrofit原来的声明和现在的声明对比:

ps:发现目前kt反射还是效率很低,所以建议将获取Call的方法放到子线程中,或者在初始化的时候预加载

比如:

        //先创建出retrofit对象,然后create出动态代理,create后再在子线程处理预加载val retrofit=xxxval post = retrofit.create(IPostRequest::class.java)submitToCacheThreadPool {//在子线程,可能需要几秒,所以在启动十秒内可能会用到的方法就手动声明@field吧!//预初始化所有的方法,使用时更快,注意需要在子线程调用,否则会造成anr,且由于将所有方法载入,所以会增加内存消耗,属于饿汉式(空间换时间)retrofit.preInit(IPostRequest::class.java)}

2.POST注解自带FormUrlEncoded注解,可以在第二个参数isUseFormUrlEncoded设置为false(且如果没有参数就自动变为false),默认为自动判断

ps:再也不用在写的时候看有没有参数加@FormUrlEncoded注解了,或者删除参数的时候忘了删该注解引起的崩溃!!!

Retrofit原来的声明和现在的声明对比:

3.如果方法没有加注解,就默认加上POST和FormUrlEncoded注解(参数为空不加此注解),并且method名字=url($代替/)(如果是kt就这样写:  `user$login`  )

Retrofit原来的声明和现在的声明对比:

ps:因为kt的方法名不支持$符号,所以需要两边需要加  `   ,而java是支持的(但java无法享受kt反射的便捷)

pps:该方式是相当于增加了一个可选项,不是必选!!!(免杠声明)

ppps:根据kt特性,可以使用下面的方式来在接口中声明一个无参的get方法(不过可能有些鸡肋)

val info: Call<String>   //它的url就是getInfo
val `test$123`: Call<String>    //它的url就是getTest/123    方法名是getTest$123

pppps:增加修改分隔符的功能,可以将$切换成任意字符串来代替/  将$修改成_只需要这一行代码即可: Retrofit.Builder().xxx.setMethodDelimiter("_")

4.程序运行中途可以修改Retrofit的baseUrl

这个没什么好说的

5.可以修改没有注解时的默认注解

val retrofit: Retrofit = Retrofit.Builder().baseUrl(HttpConfig.ROOT_URL.toString()).defaultAnnotation(GET::class.java)//这一行

可以将默认的POST注解切换为GET注解,参数的注解也从Field注解切换为Query注解

ps:该方法仅支持GET和POST

6.将方法内所有参数合并为一个参数

比如:本来参数是{"a":1,"b":2},可以合并成{"str":"{"a":1,"b":2}"}    因为有的后端会将所有参数合并成一个并将其加密,所以考虑到有这个需求就增加了一个功能,开启只需要在初始化Retrofit的时候加入以下一行

        val retrofit: Retrofit = Retrofit.Builder().xxx.setSingleParameter("str")//这一行就开启了合并参数,传null表示关闭(默认).build()

开启后其他都不需要修改即可合并参数

如果想单独开启某个方法或关闭某个方法就可以使用方法注解:

@MergeParameter("str")//在没有全局配置的情况下开启,或在全局配置和该方法配置的key不相同时可以单独修改

@NotMergeParameter //如果开启了全局配置,则关闭该方法的合并参数

ps:该方法仅支持GET的Query和POST的Field

7.支持自定义Retrofit.Call对象来拦截默认的OkHttp的Call请求网络或做其他事情

Retrofit.Builder().baseUrl(Urls.HTTP_URL).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).callFactory(PostRequest.client)//下面这一行.setServiceMethodFactory(SocketServiceMethodFactory(SocketManage.manager, socketAdapter, false)).build().create(IPostRequest::class.java)

ps:比如用于Socket请求,源码可以参考:https://github.com/ltttttttttttt/Retrofit_SocketCallAdapter  ,使用可以参考:https://blog.csdn.net/qq_33505109/article/details/114189564

8.可以拦截短url并生成hook后的url(包括@POST之类和用@URL)

            Retrofit.Builder().baseUrl("xxx")xxx.setHandlerUrlListener { oldUrl, method ->//这行//将原有的oldUrl(短url)转换成你hook的url//比如将所有短url前面加上 version/  可以这样return@setHandlerUrlListener "version/" + oldUrl}

9.更简单的声明返回值 

一般我们在接口里声明返回值都会在原有基础上包一层,比如Call<BaseBean<XXX>>,这样写起来比较麻烦,而且容易忘了写封装的那一层

而使用下面的方式可以简化书写,其实用的是kt的特性,但估计有的同学不知道

首先在接口文件的最外层下上下面的type声明(最外层表示跟这个接口同级别)

然后就可以在接口里直接简写了,名字可以你自己起,可以看到打开这个方法的详情,它会提示你他的返回类型和具体返回类型

10.可以使用默认参数,声明的时候就可以将常量(或确认的值)直接声明好,调用的时候就不用传了

这个其实也是kt的特性,没什么好说的

使用方式

在根项目的build.gradle文件中加入:


allprojects {repositories {
...maven { url 'https://jitpack.io' }}
}

app的build.gradle中加上

dependencies{...implementation 'com.github.ltttttttttttt:retrofit:1.3.5'implementation 'org.jetbrains.kotlin:kotlin-reflect:1.4.10'//todo 如果需要用到gson的拦截器之类的,但是其中包含的有原版的retrofit的引用,会导致冲突,所以可以使用下面的方法来去掉本引用的某个远程依赖implementation 'com.squareup.retrofit2:converter-gson:2.7.0' exclude module: 'retrofit'
}

需要开启java8

android{...compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}
}

然后按照Retrofit的正常方式使用就可以了

混淆代码

#注:com.lt开头的需要换成你自己的包名-keepclassmembers public interface com.lt.http.HttpFunctions {*;}#网络请求封装不能被混淆
-keep class kotlin.reflect.jvm.internal.impl.load.java.**{*; }#防止kt反射被混淆
-keep class kotlin.Metadata{*; }#防止kt元注解被混淆
-keep class com.lt.model.** { *;}#实体类不能被混淆,直接设置了一个文件夹# Retrofit-retrofit2
-dontnote retrofit2.Platform$IOS$MainThreadExecutor
-dontwarn retrofit2.Platform$Java8
-keepattributes Signature
-keepattributes Exceptions
-keep class retrofit2.Default*{*; }#相应序列化的,我用的kt序列化
-keepattributes *Annotation*, InnerClasses
-dontnote kotlinx.serialization.SerializationKt
-keep,includedescriptorclasses class com.lt.model.**$$serializer { *; } # <-- change package name to your app's
-keepclassmembers class com.lt.model.** { # <-- change package name to your app's*** Companion;
}
-keepclasseswithmembers class com.lt.model.** { # <-- change package name to your app'skotlinx.serialization.KSerializer serializer(...);
}#OkHttp
-dontwarn okhttp3.**
-keep class okhttp3.**{*;}
-keep interface okhttp3.**{*;}
-keepattributes Signature
-keepattributes *Annotation*
-dontwarn com.squareup.okhttp.**
-keep class com.squareup.okhttp.**{*;}
-keep interface com.squareup.okhttp.**{*;}#OkIo
-dontwarn java.nio.file.*
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
-dontwarn okio.**
-keep class okio.**{*;}
-keep interface okio.**{*;}

最后

如果想自定义封装网络请求,又想使用动态代理方式,可以参考这一篇https://blog.csdn.net/qq_33505109/article/details/104920101

项目是fork的Retrofit,本项目是开源的,github地址:https://github.com/ltttttttttttt/retrofit

如果有问题或者建议请评论留言

(经测试,300多个方法的接口(从线上项目copy出来测试的,三千多行),用这种方式,除了前两次,后面获取Call的性能竟然比原来的还快一点,嘿嘿)

end

更易于使用的Retrofit(不用写注解)相关推荐

  1. 如何让代码更易于维护_如何轻松地使您的网站更易于访问

    如何让代码更易于维护 by Jaroslav Vaňkát 通过JaroslavVaňkát 如何轻松地使您的网站更易于访问 (How you can easily make your website ...

  2. 不用写代码就能学用Pandas,适合新老程序员的神器Bamboolib

    作者 | Rahul Agarwal 译者 | 陆离 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100) 曾经,你有没有因为学习与使用 Pandas 进行数据检索等操作而感到厌烦 ...

  3. 【效率】微软开源最强Python自动化神器!不用写一行代码!

    相信玩过爬虫的朋友都知道selenium,一个自动化测试的神器工具.写个Python自动化脚本解放双手基本上是常规的操作了,爬虫爬不了的,就用自动化测试凑一凑. 虽然selenium有完备的文档,但也 ...

  4. [MyBatis]DAO层只写接口,不用写实现类

    团队开发一个项目,由老大架了一个框架,遇到了DAO层不用写接口了,我也是用了2次才记住这个事的,因为自己一直都是习惯于写DAO层的实现类,所以,习惯性的还是写了个实现类.于是遇到错误了. 找不到那个方 ...

  5. ES6技巧和窍门,使您的代码更简洁,更短且更易于阅读!

    by Sam Williams 通过山姆·威廉姆斯 ES6技巧和窍门,使您的代码更简洁,更短且更易于阅读! (ES6 tips and tricks to make your code cleaner ...

  6. php不用框架怎么写,php框架不用写sql语句就能调用数据库里表的字段是怎么实现的...

    据说很多框架不用写sql语句,仅凭封装就能调用数据表的字段,这个是怎么实现的,不可思议啊,因为传统的教程都说,不通过sql语句无法操作数据库啊,这到底是怎么 回事 拒绝那种发百度里的文章的帖子.要有自 ...

  7. 不用写代码,就能训练测试深度学习模型!Uber开源AI工具箱Ludwig

    乾明 发自 凹非寺  量子位 报道 | 公众号 QbitAI 让代码的归代码,让AI的归AI. 在不写代码就能进行AI开发的道路上,Uber今日又往前踏了一步. 刚刚,Uber宣布开源Ludwig,一 ...

  8. 华为回应出售手机业务传闻:假消息;微软将ChatGPT整合到更多工具中:不用写代码就能开发应用;苹果更新Mac产品线|极客头条

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  9. ​华为回应出售手机业务传闻:假消息;微软将ChatGPT整合到更多工具中:不用写代码就能开发应用;苹果更新Mac产品线|极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

最新文章

  1. C++关键字积累——持续更新
  2. 【转】Python操作MongoDB数据库
  3. Django的自带认证系统——auth模块
  4. C++中提高程序运行效率的方法集合
  5. SSM 整合 2:Java EE 开发环境的搭建(JDK 配置、Tomcat 安装、IDE 安装、IDE 集成 Tomcat、Spring 及其组件的下载)
  6. 自己动手 CentOS-6.5 安装Oracle11g R2
  7. 《妖猫传》大唐盛世背后那些事
  8. UI设计图标素材|如何应用合适图标
  9. linux性能评估-内存基础理解篇
  10. matebook14支持触摸屏吗_matebook 14有触屏吗
  11. 逆向微信-分析学习微信是如何快速构建静态TableView界面的
  12. 嵌套查询和连接查询的效率_LeetCode 查找:groupby+having/嵌套查询/连接
  13. javascript 计时器,消失计时器
  14. 自动驾驶操作系统现状与发展趋势
  15. sqlmap安装与使用
  16. 《Redis开发与运维》学习第四章
  17. 高速PCB设计考虑的六个方面
  18. OpenGL 头文件,库文件
  19. IEC 62304 - 2006 医疗器械软件 软件生存周期
  20. cpu是几核的怎么查看

热门文章

  1. NTU 课程笔记 CV6422 假设检验
  2. python 库整理: collections.namedtuple
  3. tableau 如何发布到public
  4. 为什么通常牛顿法比梯度下降法能更快的收敛
  5. java 程序片段_20个非常有用的Java程序片段
  6. 嵌入层 tf.keras.layers.Embedding() 介绍【TensorFlow2入门手册】
  7. 【android-tips】installfailedinsufficientstorage解决方案
  8. Java 理论与实践: 正确使用 Volatile 变量--转
  9. Microservices Reference Architecture - with Spring Boot, Spring Cloud and Netflix OSS--转
  10. mysql 表设计时的update_time自动更新