Net中关于请求的类只有两个类和他们共同的抽象父类
BaseRequest
|- UrlRequest
|- BodyRequest
根据请求方法不同使用的Request也不同
GET, HEAD, OPTIONS, TRACE, // Url request
POST, DELETE, PUT, PATCH // Body request
代码示例
scopeNetLife {
Get<String>("api") {
// this 即为 UrlRequest
}.await()
Post<String>("api") {
// this 即为 BodyRequest
}.await()
}
scopeNetLife { // 创建作用域
// 这个大括号内就属于作用域内部
val data = Get<String>("https://github.com/liangjingkanji/Net/"){
param("u_name", "drake")
param("pwd", "123456")
}.await() // 发起GET请求并返回`String`类型数据
}
|请求函数|描述|
|-|-|
|param
|支持基础类型/文件/RequestBody/Part|
|json
|请求参数为JSONObject/JsonArray/String|
|setQuery/addQuery
|设置/添加Url参数, 如果当前请求为Url请求则该函数等效于param
函数|
|setHeader/addHeader
|设置/添加请求头|
如果没有添加文件/流那么就是通过BodyRequest内部的FormBody
发起请求. 反之就是通过MultipartBody
发起请求.
当然你可以完全自定义Body来请求, 譬如以下的Json请求
这里提供三种创建Json请求的示例代码. 酌情选用
=== "JSON键值对(推荐)"
```kotlin
val name = "金城武"
val age = 29
val measurements = listOf(100, 100, 100)
scopeNetLife {
tvFragment.text = Post<String>("api") {
// 只支持基础类型的值, 如果值为对象或者包含对象的集合/数组会导致其值为null
json("name" to name, "age" to age, "measurements" to measurements)
}.await()
}
```
=== "JSONObject"
```kotlin
val name = "金城武"
val age = 29
val measurements = listOf(100, 100, 100) // 只支持基础类型的值, 如果值为对象或者包含对象的集合/数组会导致其值为null
scopeNetLife {
tvFragment.text = Post<String>("api") {
json(JSONObject().run {
put("name", name)
put("age", age)
put("measurements", JSONArray(measurements))
})
}.await()
}
```
=== "自定义的body"
```kotlin
val name = "金城武"
val age = 29
val measurements = listOf(100, 100, 100)
scopeNetLife {
tvFragment.text = Post<String>("api") {
body = MyJsonBody(name, age, measurements)
}.await()
}
```
对于某些可能JSON请求参数存在固定值:
body
字段前面提到json(Pair<String, Any?>)
函数不支持对象值, 因为框架内部使用的org.json.JSONObject
其不支持映射对象字段
这里可以创建扩展函数来支持你想要的Json解析框架, 比如以下常用的Json解析框架示例
=== "Gson"
```kotlin
fun BodyRequest.gson(vararg body: Pair<String, Any?>) {
this.body = Gson().toJson(body.toMap()).toRequestBody(MediaConst.JSON)
}
```
=== "FastJson"
```kotlin
fun BodyRequest.fastJson(vararg body: Pair<String, Any?>) {
this.body = JSON.toJSON(body.toMap()).toRequestBody(MediaConst.JSON)
}
```
使用
scopeNetLife {
tvFragment.text = Post<String>("api") {
gson("name" to name, "model" to Model()) // 参数支持Gson可解析的对象
// fastJson("name" to name, "model" to Model()) // 使用FastJson
}.await()
}
对于动态生成的全局请求头或参数都可以通过实现RequestInterceptor
来设置全局的请求拦截器来添加, 如果RequestInterceptor不满足你的需求可以使用拦截器(Interceptor)来实现
NetConfig.initialize("https://github.com/liangjingkanji/Net/", this) {
// 添加请求拦截器, 每次请求都会触发的, 可配置全局/动态参数
setRequestInterceptor(MyRequestInterceptor())
}
关于全部的请求配置选项推荐阅读函数文档或者阅读源码. Net提供清晰的函数结构浏览方便直接阅读源码