跳转至

使用

Net使用协程发起网络, 但是即使不会协程也可以使用该框架


这里演示发起网络请求百度网站内容的三个步骤

  1. 创建作用域
  2. 发起请求
  3. 接收数据
scopeNetLife { // 创建作用域
    // 这个大括号内就属于作用域内部
    val data = Get<String>("http://www.baidu.com/").await() // 发起GET请求并返回`String`类型数据
}
scopeNetLife {
    val data = Get<String>("http://0000www.baidu.com/").await() // 请求A 发起GET请求并返回数据
    val data = Get<String>("http://www.baidu.com/").await() // 请求B 将等待A请求完毕后发起GET请求并返回数据
}
scopeNetLife {
    // 以下两个网络请求属于同时进行中
    val aDeferred = Get<String>("http://www.baidu.com/") // 发起GET请求并返回一个对象(Deferred)表示"任务A"
    val bDeferred = Get<String>("http://www.baidu.com/") // 发起请求并返回"任务B"

    // 随任务同时进行, 但是数据依然可以按序返回
    val aData = aDeferred.await() // 等待任务A返回数据
    val bData = bDeferred.await() // 等待任务B返回数据
}

多个网络请求放在同一个作用域内就可以统一控制, 如果你的多个网络请求毫无关联, 你可以创建多个作用域.


GetPost等函数调用就会开始发起网络请求, await只是等待其请求成功返回结果, 所以如果你在await后执行的网络请求,这不属于并发(属于串行)

并发的错误示例

scopeNetLife {
    // 请求A
    val aDeferred = Get<String>("http://www.baidu.com/").await()
    // 请求B, 由于上面使用`await()`函数, 所以必须等待A请求返回结果后才会执行B
    val bDeferred = Get<String>("http://www.baidu.com/")

    val bData = bDeferred.await() // 等待任务B返回数据
}


关于JSON解析以及全局URL等初始化配置后面讲解

请求参数

关于请求参数参数

scopeNetLife { // 创建作用域
    // 这个大括号内就属于作用域内部
    val data = Get<String>("http://www.baidu.com/"){
        param("u_name", "drake")
        param("pwd", "123456")
    }.await() // 发起GET请求并返回`String`类型数据
}

请求函数 描述
param 请求体参数
path 路径
urlParam Url参数
file 上传文件
binary 二进制
binaries 多个二进制
body 自定义请求体
json 请求参数为JSONObject/JsonArray/String

JSON请求体

这里提供三种创建Json请求的示例代码. 酌情选用

val name = "金城武"
val age = 29
val measurements = listOf(100, 100, 100)

scopeNetLife {
    tv_fragment.text = Post<String>("api") {
        json("name" to name, "age" to age, "measurements" to measurements) // 同时也支持Map集合
    }.await()
}
val name = "金城武"
val age = 29
val measurements = listOf(100, 100, 100)

scopeNetLife {
    tv_fragment.text = Post<String>("api") {
        json(JSONObject().run {
            put("name", name)
            put("age", age)
            put("measurements", JSONArray(measurements))
        })
    }.await()
}
val name = "金城武"
val age = 29
val measurements = listOf(100, 100, 100)

scopeNetLife {
    tv_fragment.text = Post<String>("api") {
        body(MyJsonBody(name, age, measurements))
    }.await()
}

对于某些可能JSON请求参数存在固定值, 可以考虑继承JsonBody来扩展出自己的新的Body(), 然后使用body函数传入请求中.

JsonBody实际上也是继承自StringBody

RESTFUL

Net支持RestFul设计风格

private fun GET() {
    scopeNetLife {
        tv_fragment.text = Get<String>("http://www.baidu.com/").await()
    }
}

private fun POST() {
    scopeNetLife {
        tv_fragment.text = Post<String>("http://www.baidu.com/").await()
    }
}

private fun HEAD() {
    scopeNetLife {
        tv_fragment.text = Head<String>("http://www.baidu.com/").await()
    }
}

private fun PUT() {
    scopeNetLife {
        tv_fragment.text = Put<String>("http://www.baidu.com/").await()
    }
}

private fun PATCH() {
    scopeNetLife {
        tv_fragment.text = Patch<String>("http://www.baidu.com/").await()
    }
}

private fun DELETE() {
    scopeNetLife {
        tv_fragment.text = Delete<String>("http://www.baidu.com/").await()
    }
}

private fun TRACE() {
    scopeNetLife {
        tv_fragment.text = Trace<String>("http://www.baidu.com/").await()
    }
}

private fun OPTIONS() {
    scopeNetLife {
        tv_fragment.text = Options<String>("http://www.baidu.com/").await()
    }
}

函数

异步请求

即会在IO线程执行网络请求, 要求在作用域内执行

异步请求函数 描述
Get 标准REST FUL
Post 标准REST FUL
Head 标准REST FUL
Options 标准REST FUL
Trace 标准REST FUL
Delete 标准REST FUL
Put 标准REST FUL
Patch 标准REST FUL
Download 下载文件(默认Get)
DownloadBody 下载文件(默认Post, 附带请求体)
DownloadImage 下载图片(可指定图片大小), 如果使用要求依赖Glide

同步请求

即在当前线程执行, 会阻塞当前线程

同步请求函数 描述
syncGet 标准REST FUL
syncPost 标准REST FUL
syncHead 标准REST FUL
syncOptions 标准REST FUL
syncTrace 标准REST FUL
syncDelete 标准REST FUL
syncPut 标准REST FUL
syncPatch 标准REST FUL
syncDownload 下载文件(默认Get)
syncDownloadBody 下载文件(默认Post, 附带请求体)
syncDownloadImage 下载图片(可指定图片大小), 如果使用要求依赖Glide