/EasyHttp

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

Primary LanguageKotlinMIT LicenseMIT

EasyHttp

PRs Welcome Kotlin GitHub release API License Apache2.0

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

功能

  • 支持HTTP GET/POST/PUT/DELETE
  • 文件下载(带进度)
  • 文件上传 (multipart/form-data)(带进度)
  • RxJava2.0请求响应支持
  • 支持Gson自动序列化与Parser自定义拓展
  • 支持OkHttpClient的自定义配置
  • 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_GETTYPE.METHOD_POSTTYPE.METHOD_PUTTYPE.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出来。另外欢迎大家为EasyHttp贡献智慧,欢迎大家Fork and Pull requests。 喜欢就给个star呗,o( ̄▽ ̄)ブ

感谢