介绍
最近在工作中接触到了Net这个框架,抽空来做个简单的分享:
1、什么是Net
Android上可能是最强的网络框架, 基于OkHttp/协程的非侵入式框架(不影响原有功能). 学习成本低/使用简单, 一行代码发起网络请求, 甚至无需初始化(这是Net作者说的 )
我是在进行链式的请求的时候接触到了这个框架,这也是我觉得Net的优势所在,即通过简单的代码,快速实现一个携程请求。
2、怎么依赖
添加远程仓库根据创建项目的 Android Studio 版本有所不同
Android Studio Arctic Fox以下创建的项目 在项目根目录的 build.gradle 添加仓库
allprojects {
repositories {
// ...
maven { url 'https://jitpack.io' }
}
}
Android Studio Arctic Fox以上创建的项目 在项目根目录的 settings.gradle 添加仓库
dependencyResolutionManagement {
repositories {
// ...
maven { url 'https://jitpack.io' }
}
}
然后在 module 的 build.gradle 添加依赖框架
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0" // 协程(版本自定)
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0'
implementation 'com.squareup.okhttp3:okhttp:4.10.0' // 要求OkHttp4以上
implementation 'com.github.liangjingkanji:Net:3.5.8'
3、怎么使用
Net的用法非常简单,基础的请求如下:
scopeNetLife { // 创建作用域
// 这个大括号内就属于作用域内部
val data = Get<String>("https://github.com/liangjingkanji/Net/").await() // 发起GET请求并返回`String`类型数据
}
不知道大家怎么看,我第一次见到时是被Net的简洁震撼到了,当然,上面的用法过于基础,下面我们来写一个会经常用到的请求:
假设我们现在要请求一个店铺下商品的所有类型,他的请求参数和返回参数都是以Json形式传输的,我们假设他的请求参数是这样的,我们传入一个user_id来判断是哪个用户发起的请求,一个store_id来判断请求的是哪个门店:
data class GetGoodsTypeRequest(
var user_id:String? = null,
var store_id:String? = null
)
下面我们来编一个返回参数,我们假装使用这两个字段来判断所有商品:
data class GetGoodsTypeResponse(
val goods_type_list:List<GoodsType>? = null
)
data class GoodsType(
val type:String? = null,
val sub_type:String? = null
)
然后,我们发起这个请求:
scopeNetLife { // 创建作用域
// 我们发起Post请求
val data = Post<GetGoodsTypeResponse>("https://zzy.com/jiazhuang/getGoodsType/"){
gson(GetGoodsTypeRequest().apply{
user_id = "123456"
store_id = "654321"
})
}.await()
}
很简单对吧,下面我们升级下难度,我们在要获取第一个商品类型下的所有商品,首先我们就要先获取所有的商品类型,然后根据商品类型来获取商品,我们还是编一个请求和返回参数:
class GetAllGoodsRequest(
var store_id: String? = null,
var type: String? = null,
var sub_type: String? = null
)
data class GetAllGoodsResponse(
val goods_list: List<GoodsInfo>? = null
)
data class GoodsInfo(
val goods_id: String? = null,
val goods_name:String? = null,
val goods_introduce:String? = null,
val goods_price:String? = null,
val goods_image:String? = null
)
然后我们在上面的请求的基础上再发一个请求:
scopeNetLife { // 创建作用域
// 我们发起Post请求
val data = Post<GetGoodsTypeResponse>("https://zzy.com/jiazhuang/getGoodsType/"){
gson(GetGoodsTypeRequest().apply{
user_id = "123456"
store_id = "654321"
})
}.await()
if(data?.goods_type_list.size>1){
val goodsData = Post<GetAllGoodsResponse>("https://zzy.com/jiazhuang/getGoodsDetail/"){
gson(GetGoodsTypeRequest().apply{
store_id = "654321"
type = data?.goods_type_list[0]?.type
sub_type = data?.goods_type_list[0]?.sub_type
})
}.await()
}
}
可以看到,我们没有进行轮询这些操作,仅仅是判断上一个请求有没有返回,就可以发送下一个请求,具体的原理就是kotlin协程,感兴趣的朋友可以去看下,当然如果我们不要链式的请求,而是需要同步请求,Net也是可以轻松实现的,如:
scopeNetLife {
// 以下两个网络请求属于同时进行中
val aDeferred = Get<String>("https://github.com/liangjingkanji/Net/") // 发起GET请求并返回一个对象(Deferred)表示"任务A"
val bDeferred = Get<String>("https://github.com/liangjingkanji/Net/") // 发起请求并返回"任务B"
// 随任务同时进行, 但是数据依然可以按序返回
val aData = aDeferred.await() // 等待任务A返回数据
val bData = bDeferred.await() // 等待任务B返回数据
}
上面这个示例来源于Net的官方文档,不得不感叹Net的文档真的是非常清晰完整,强烈推荐大家去看看,诸如拦截器,错误处理这些操作也都有介绍,地址是这里:https://liangjingkanji.github.io/Net/
五一快乐
关于Net的介绍就是这些,感兴趣的朋友可以自己去尝试下,最后祝大家五一快乐。