美文网首页安卓开发相关Android技术知识Android开发经验谈
基于OkHttp的轻量级Kotlin DSL网络请求框架

基于OkHttp的轻量级Kotlin DSL网络请求框架

作者: Rayhaha | 来源:发表于2018-03-09 23:00 被阅读1204次

    EasyHttp

    EasyHttp是一个基于OkHttp封装的Kotlin DSL网络请求框架
    Github地址

    功能

    • [x] 支持HTTP GET/POST/PUT/DELETE
    • [x] 文件下载(带进度)
    • [x] 文件上传 (multipart/form-data)(带进度)
    • [x] RxJava2.0请求响应支持
    • [x] 支持Gson自动序列化与Parser自定义拓展
    • [x] 支持OkHttpClient的自定义配置
    • [x] DSL配置请求

    目录

    安装说明

    Gradle:

    1. 先在 build.gradle(Project:XXXX) 的 repositories 添加:
        allprojects {
            repositories {
                ...
                maven { url 'https://jitpack.io' }
            }
        }
    
    1. 然后在 build.gradle(Module:app) 的 dependencies 添加:
        dependencies {
              compile 'com.github.Rayhahah:EasyHttp:{release_version}'
        }
    

    Client配置

    配置全局OkHttpClient

        /**
                  * 构建OkHttpClient
                  * 使用这种方式构建的话,会直接配置成默认使用的OkHttpClient
                  */
                 EClient {
                     //配置默认的baseUrl
                     baseUrl = "http://mall.rayhahah.com/"
                     //配置默认的请求类型
                     type = TYPE.METHOD_POST
                     timeUnit = TimeUnit.SECONDS
                     connectTimeout = 10
                     readTimeout = 10
                     writeTimeout = 10
                     interceptors()
                     networkInterceptors()
                     retryOnConnectionFailure = true
                     cache = null
                     //配置默认的解析器
                     parser = null
                     //配置全局通用的请求头
                     header = {
                         "custom_head"("rayhahah")
                     }
                 }
    
    或者直接传入自定义的`OkHttpClient`
    
    

    EClient(client: OkHttpClient)

    
    ## GET/POST/PUT/DELETE请求
    - `client` : 本次请求使用的`OkHttpClient`,不配置的话默认使用上面`EClient`配置的`OkHttpClient`对象
    - `type` : 区别请求类型,`TYPE.METHOD_GET` 、`TYPE.METHOD_POST`、`TYPE.METHOD_PUT` 、`TYPE.METHOD_DELETE` 、
    - `data` :  请求携带的参数,`"key"("value")`
    - `header` : 请求头参数 ,`"key"("value")`
    - `go(success,fail,progress)` : 发送请求,回调都是在主线程中
        - `success = {data:Response->}` : 请求成功回调
        - `fail = {call:Call,e:Exception -> }` : 请求失败回调
        - `progess = {value:Float,total:Long -> }`: 请求过程回传,上传文件可以查看
    
    一次正常且配置详细的请求如下:
    

    EHttp {
    client = okHttpClient
    baseUrl = "http://mall.rayhahah.com/"
    src = "user/login.do"
    type = TYPE.METHOD_GET
    data = {
    "username"(username)
    "password"(password)
    }
    header = {
    "cache-Control"("no-cache")
    }

        }.go(success,fail,progress)
    
    
    接下来,简便一点:
    

    EHttp{
    baseUrl = "http://mall.rayhahah.com/"
    src = "user/login.do"
    type = TYPE.METHOD_GET
    data = {
    "username"(username)
    "password"(password)
    }
    }.go{data:Response -> }

    
    或者简单的请求可以这样
    
    
    

    EGet(url:String,params:HashMap<String,String>())
    .go{data:Response->}

    EPost(url:String,params:HashMap<String,String>())
    .go{data:Response->}

    
    
    ## 文件上传
    
    - `file` : 上传的文件
        - `"key"("上传文件类型",File())`
        - `"key"(HttpFile("上传文件类型",ArrayList<File>())`
    
    
     EHttp {
            baseUrl = "http://mall.rayhahah.com/"
            src = "easysport/user/update_cover.do"
            type = TYPE.METHOD_POST
            data = {
                "username"(username)
                "password"(password)
                file = {
                    //上传单个文件
                    "upload_file"(Files.FILE_TYPE_MULTIPART, cover)
                    //上传单个字段多个文件
                     val fileList = ArrayList<File>()
                    fileList.add(File("1.txt"))
                    fileList.add(File("2.txt"))
                    fileList.add(File("3.txt"))
                    "upload"(HttpFile(Files.FILE_TYPE_MULTIPART, fileList))
                }
            }
            header = {
                "cache-Control"("no-cache")
            }
    
        }.go(success, fail, progress)
    
    
    
    
    ## 文件下载
    
    
    

    EHttp {
    baseUrl = "http://thing.rayhahah.com/version/EasySport_1.1.4.apk"
    download = {
    fileDir = FileUtils.getRootFilePath() + "EasyHttp/images"
    fileName = "test.apk"
    }
    }.download(success={ data: File ->
    data.log()

            }, fail={ call: Call, exception: Exception ->
    
    
            }, progress={ value: Float, total: Long ->
                value.log()
                total.log()
            })
    

    //简单一点~~~~
    EDownload(url,fileDir:String,fileName:String,success,fail,progress)

    
    
    ## RxJava兼容
    只要把`go` 或者`rx`就可以返回`Observable<Response>`o(* ̄▽ ̄*)ブ
    
    

    EHttp {
    baseUrl = "http://mall.rayhahah.com/"
    src = "user/login.do"
    type = method
    data = {
    "username"(username)
    "password"(password)
    }
    header = {
    "cache-Control"("no-cache")
    }

        }.rx(progress = { value, total -> })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe { t: Response ->
                        t.log()
                        mTvTest.setText(t.body()?.string())
                    }
    
    
    ## 自定义Parser
    默认提供`JsonParser`内部使用`Gson`来自动序列化JSON字符串。
    我们也可以自定义`Parser`来实现自己的数据前处理
    
    这个过程是发生在子线程中的,我们可以去解析一些特地复杂的请求返回数据
    
    实现`Parser`接口,根据自己的需求处理数据返回即可,
    
    ps:这里的返回值要与请求时的泛型类型保持一致
    
    

    class CustomParser : Parser {
    /**
    * 数据解析
    */
    override fun parse(response: Response): Any? {
    return response.body()?.string()
    }

    /**
     * 数据解析的规则
     */
    override fun isCanParse(response: Response): Boolean {
        return true
    }
    
    /**
     * 数据解析
     */
    override fun unParse(response: Response): Any? {
        return response.body()?.string()
    }
    

    }

    
    
    ## 贡献
    如果你在使用EasyHttp中遇到任何问题可以提[Issues](https://github.com/Rayhahah/EasyHttp/issues)出来。另外欢迎大家为EasyHttp贡献智慧,欢迎大家[Fork and Pull requests](https://github.com/Rayhahah/EasyHttp)。
    喜欢就给个star呗,o(* ̄▽ ̄*)ブ
    
    ## 感谢
    - [OkHttp](https://github.com/square/okhttp/)
    - [RxJava](https://github.com/ReactiveX/RxJava/)
    
    

    相关文章

      网友评论

        本文标题:基于OkHttp的轻量级Kotlin DSL网络请求框架

        本文链接:https://www.haomeiwen.com/subject/ifzmfftx.html