知識點:1.構建器的使用;2.接口(或者函數)回調;
DSL网络请求构建器:
package pers.lansir.Demo
import java.net.HttpURLConnection
import java.net.URL
import java.util.*
fun main(args: Array<String>) {
http {
path = "www.baidu.com"
method = "GET"
onSuccess { str:String ->
println("调用成功")
}
onError { str:String ->
println("调用失败")
}
}
}
fun MyRequest.onSuccess(block: (String) -> Unit) {
this.onSuccess = block//注意:此处容易想不到!
}
fun MyRequest.onError(block: (String) -> Unit) {
this.onError = block
}
fun http(block: MyRequest.() -> Unit) {
//此处如果创建val httpUtil = HttpUtil(),里面的参数没办法传递,因此需要构建器,来传递参数
val myRequest = MyRequest()
myRequest.block()
myRequest.send()
}
//创建构建器
class MyRequest(var path: String? = null, var method: String? = null, var onSuccess: ((String) -> Unit)? = null, var onError: ((String) -> Unit)? = null) {
//构建器里的send方法
fun send() {
val httpUtil = HttpUtil()
httpUtil.sendRequest(path, method, onSuccess, onError)
}
}
//HttpUtil类
class HttpUtil {
//请求方法及其参数(请求路径(网址),请求方法(get/post),请求成功,请求失败)
fun sendRequest(path: String?, method: String?, onSuccess: ((String) -> Unit)?, onError: ((String) -> Unit)?) {
//因为网络请求需要耗时较多,所以需要另开线程操作
Thread {
//常见URL对象
// val url = URL(path)
println("创建URL对象")
//打开网络连接
// val conn = url.openConnection() as HttpURLConnection
println("打开网络连接")
//获取响应码
// val resCode = conn.responseCode
println("获取响应码")
val resCode = Random().nextInt(10)
if (resCode % 2 == 0) {
onSuccess?.invoke("调用成功")
} else {
onError?.invoke("调用失败")
}
}.start()
}
}
网友评论