DSL


转载:摘抄自《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({ 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)
        }
    }
}

你可能感兴趣的:(kotlin,DSL,Kotlin,okhttp)