转载:摘抄自《Kotlin极简教程》-陈光剑
DSL 是什么
DSL(Domain-Specific Language,领域特定语言)指的是专注于特定问题领域的计算机语言(领 域专用语言)。不同于通用的计算机语言(GPL),领域特定语言只用在某些特定的领域。 比如用来 显示网页的HTML语言,以及Emacs所使用的Emac LISP语言等。更加典型的例子是Gradle,它基于 Ant 和 Maven,使用基于Groovy的DSL 来声明项目设置,而不是传统的XML。
DSL 简单讲就是对一个特定问题 (受限的表达能力) 的方案模型的更高层次的抽象表达(领域语 言),使其更加简单易懂 (容易理解的语义以及清晰的语义模型)。
DSL 只是问题解决方案模型的外部封装,这个模型可能是一个 API 库,也可能是一个完整的框架等 等。DSL 提供了思考特定领域问题的模型语言,这使得我们可以更加简单高效地来解决问题。DSL 聚焦一个特定的领域,简单易懂,功能极简但完备。DSL 让我们理解和使用模型更加简易。
Kotlin 的 DSL 特性支持
package com.example.xy
import android.util.Log
import io.reactivex.BackpressureStrategy
import io.reactivex.Flowable
import io.reactivex.schedulers.Schedulers
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody
import okhttp3.Response
import java.util.concurrent.TimeUnit
class RequestWrapper {
var url: String? = null
var method: String? = null
var body: RequestBody? = null
var timeout: Long = 10
internal var _success: (String) -> Unit = { }
internal var _fail: (Throwable) -> Unit = {}
fun onSuccess(onSuccess: (String) -> Unit) {
_success = onSuccess
}
fun onFail(onError: (Throwable) -> Unit) {
_fail = onError
}
}
fun http(init: RequestWrapper.() -> Unit) {
val wrap = RequestWrapper()
wrap.init()
executeForResult(wrap)
}
private fun executeForResult(wrap: RequestWrapper) {
Flowable.create<Response>({ e ->
e.onNext(onExecute(wrap))
}, BackpressureStrategy.BUFFER).subscribeOn(Schedulers.io())
.subscribe(
{ resp ->
wrap._success(resp.body()!!.string())
},
{ e -> wrap._fail(e) })
}
private fun onExecute(wrap: RequestWrapper): Response? {
var req: Request? = null
when (wrap.method) {
"get", "Get", "GET" -> req = Request.Builder().url(wrap.url).build()
"post", "Post", "POST" -> req = Request.Builder().url(wrap.url).post(wrap.body).build()
"put", "Put", "PUT" -> req = Request.Builder().url(wrap.url).put(wrap.body).build()
"delete", "Delete", "DELETE" -> req = Request.Builder().url(wrap.url).delete(wrap.body).build()
}
val http = OkHttpClient.Builder().connectTimeout(wrap.timeout, TimeUnit.SECONDS).build()
val resp = http.newCall(req).execute()
return resp
}
GET
private fun test() {
http {
url = "http://www.163.com/"
method = "get"
onSuccess { string ->
Log.i("TAG", string)
}
onFail { e ->
Log.i("TAG", e.message)
}
}
}
POST
private fun test() {
var json = JSONObject()
json.put("xxx","yyyy")
val postBody = RequestBody.create(MediaType.parse("application/json; charset=ut f-8"),json.toString())
http {
url = "http://www.163.com/"
method = "get"
body = postBody
onSuccess { string ->
Log.i("TAG", string)
}
onFail { e ->
Log.i("TAG", e.message)
}
}
}