【安卓三分钟】分享一个开源的网络请求框架--Net

介绍

最近在工作中接触到了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的介绍就是这些,感兴趣的朋友可以自己去尝试下,最后祝大家五一快乐。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值