使用
本框架使用Android主流的Http框架OkHttp作为请求内核, 遵守不影响OkHttp原有的函数组件使用原则开发
非常欢迎共同贡献代码/修订文档, 点击文档右上角小铅笔可直接修订文档 ↗
前言¶
- 避免写一个函数封装一个请求函数, 避免过度封装
Post/Get等
函数属于请求动作.scope*
等函数属于作用域, 假设你要封装请求尽量封装请求动作
而不是作用域- 快速改变项目的请求URL可以URL作为常量写到单一文件将而不建议将所有请求动作写到单一文件
- Net支持目前最先进的协程并发网络, 当然即使不会协程也可以使用该框架
- 如果你觉得文档看不懂或者有歧义那肯定是作者问题, 请反馈给作者或者自我修订
使用¶
这里演示发起网络请求百度网站
内容的三个步骤
- 创建作用域
- 发起请求
- 接收数据
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返回数据
}
多个网络请求放在同一个作用域内就可以统一控制, 如果你的多个网络请求毫无关联, 你可以创建多个作用域.
当
Get
或Post
等函数调用就会开始发起网络请求,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返回数据
}
返回结果¶
返回结果支持的数据类型(即Post等函数的泛型
)由转换器决定, 默认支持以下类型
函数 | 描述 |
---|---|
String | 字符串 |
ByteArray | 字节数组 |
ByteString | 内部定义的一种字符串对象 |
Response | 最基础的响应 |
File | 文件对象, 这种情况其实应当称为下载文件 |
非以上类型要求自定义转换器
转换器的返回值决定你的网络请求的返回结果类型, 你甚至可以返回null, 前提是泛型为可空类型
RestFul¶
Net支持RestFul设计风格
scopeNetLife {
tvFragment.text = Get<String>("http://www.baidu.com/").await()
tvFragment.text = Post<String>("http://www.baidu.com/").await()
tvFragment.text = Head<String>("http://www.baidu.com/").await()
tvFragment.text = Put<String>("http://www.baidu.com/").await()
tvFragment.text = Patch<String>("http://www.baidu.com/").await()
tvFragment.text = Delete<String>("http://www.baidu.com/").await()
tvFragment.text = Trace<String>("http://www.baidu.com/").await()
tvFragment.text = Options<String>("http://www.baidu.com/").await()
}
函数¶
默认在IO线程执行网络请求(通过作用域参数可以控制Dispatch调度器), 要求在协程作用域内执行.
请求函数 | 描述 |
---|---|
Get | 标准Http请求方法 |
Post | 标准Http请求方法 |
Head | 标准Http请求方法 |
Options | 标准Http请求方法 |
Trace | 标准Http请求方法 |
Delete | 标准Http请求方法 |
Put | 标准Http请求方法 |
Patch | 标准Http请求方法 |