EasyHttp
EasyHttp
是一個基于OkHttp封裝的Kotlin DSL網(wǎng)絡(luò)請求框架
Github地址
功能
- [x] 支持HTTP GET/POST/PUT/DELETE
- [x] 文件下載(帶進度)
- [x] 文件上傳 (multipart/form-data)(帶進度)
- [x] RxJava2.0請求響應(yīng)支持
- [x] 支持Gson自動序列化與Parser自定義拓展
- [x] 支持OkHttpClient的自定義配置
- [x] DSL配置請求
目錄
安裝說明
Gradle:
- 先在 build.gradle(Project:XXXX) 的 repositories 添加:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
- 然后在 build.gradle(Module:app) 的 dependencies 添加:
dependencies {
compile 'com.github.Rayhahah:EasyHttp:{release_version}'
}
Client配置
配置全局OkHttpClient
/**
* 構(gòu)建OkHttpClient
* 使用這種方式構(gòu)建的話,會直接配置成默認使用的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` : 區(qū)別請求類型栏妖,`TYPE.METHOD_GET` 、`TYPE.METHOD_POST`笆包、`TYPE.METHOD_PUT` 、`TYPE.METHOD_DELETE` 酸舍、
- `data` : 請求攜帶的參數(shù)亲雪,`"key"("value")`
- `header` : 請求頭參數(shù) ,`"key"("value")`
- `go(success,fail,progress)` : 發(fā)送請求锅睛,回調(diào)都是在主線程中
- `success = {data:Response->}` : 請求成功回調(diào)
- `fail = {call:Call,e:Exception -> }` : 請求失敗回調(diào)
- `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"("上傳文件類型"现拒,F(xiàn)ile())`
- `"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`內(nèi)部使用`Gson`來自動序列化JSON字符串辣垒。
我們也可以自定義`Parser`來實現(xiàn)自己的數(shù)據(jù)前處理
這個過程是發(fā)生在子線程中的,我們可以去解析一些特地復(fù)雜的請求返回數(shù)據(jù)
實現(xiàn)`Parser`接口印蔬,根據(jù)自己的需求處理數(shù)據(jù)返回即可勋桶,
ps:這里的返回值要與請求時的泛型類型保持一致
class CustomParser : Parser {
/**
* 數(shù)據(jù)解析
*/
override fun parse(response: Response): Any? {
return response.body()?.string()
}
/**
* 數(shù)據(jù)解析的規(guī)則
*/
override fun isCanParse(response: Response): Boolean {
return true
}
/**
* 數(shù)據(jù)解析
*/
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/)