基於OkHttp的輕量級Kotlin DSL網絡請求框架

EasyHttp

PRs Welcome
Kotlin
GitHub release
API
License Apache2.0

EasyHttp是一個基於OkHttp封裝的Kotlin DSL網絡請求框架android

Github地址git

功能

  • [x] 支持HTTP GET/POST/PUT/DELETE
  • [x] 文件下載(帶進度)
  • [x] 文件上傳 (multipart/form-data)(帶進度)
  • [x] RxJava2.0請求響應支持
  • [x] 支持Gson自動序列化與Parser自定義拓展
  • [x] 支持OkHttpClient的自定義配置
  • [x] DSL配置請求

目錄

安裝說明

Gradle:github

  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配置

配置全局OkHttpClientapi

/**
              * 構建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")
                 }
             }
複製代碼

或者直接傳入自定義的OkHttpClientbash

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)
複製代碼

接下來,簡便一點:app

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( ̄▽ ̄)ブmaven

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來實現本身的數據前處理ide

這個過程是發生在子線程中的,咱們能夠去解析一些特意複雜的請求返回數據

實現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( ̄▽ ̄)ブ

感謝

相關文章
相關標籤/搜索