You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.6 KiB
122 lines
3.6 KiB
package com.gyf.csams.util
|
|
|
|
import com.google.gson.Gson
|
|
import com.orhanobut.logger.Logger
|
|
import okhttp3.*
|
|
import okhttp3.MediaType.Companion.toMediaType
|
|
import okhttp3.RequestBody.Companion.toRequestBody
|
|
import java.io.IOException
|
|
import java.lang.reflect.Type
|
|
|
|
object HttpClient{
|
|
private val httpClient:OkHttpClient=OkHttpClient()
|
|
|
|
private val JSON_CONTENT_TYPE="application/json; charset=UTF-8".toMediaType()
|
|
|
|
|
|
private fun buildQueryParams(params:Map<String,String>?):String{
|
|
return if(params?.isNotEmpty() == true) {
|
|
val urlPath = StringBuilder("?")
|
|
for(i in params){
|
|
urlPath.append(i.key).append("=").append(i.value)
|
|
}
|
|
|
|
urlPath.toString()
|
|
}else{
|
|
""
|
|
}
|
|
}
|
|
|
|
private fun buildFormBody(params: Map<String, String>?):FormBody{
|
|
val builder=FormBody.Builder()
|
|
if(params?.isNotEmpty()==true){
|
|
for(item in params){
|
|
builder.add(item.key,item.value)
|
|
}
|
|
}
|
|
return builder.build()
|
|
}
|
|
|
|
/**
|
|
* HTTP GET
|
|
*
|
|
* @param url
|
|
* @param callback
|
|
* @param params
|
|
*/
|
|
fun get(url:String, callback: Callback, params: Map<String, String>?=null){
|
|
val request = Request.Builder()
|
|
.url(url.plus(buildQueryParams(params = params)))
|
|
.build()
|
|
val call=httpClient.newCall(request)
|
|
call.enqueue(callback)
|
|
}
|
|
|
|
/**
|
|
* HTTP POST
|
|
* 发送表单
|
|
*
|
|
* @param url
|
|
* @param callback
|
|
* @param params
|
|
*/
|
|
fun post(url:String, callback: Callback, params: Map<String, String>?=null){
|
|
val request = Request.Builder()
|
|
.url(url)
|
|
.post(body = buildFormBody(params))
|
|
.build()
|
|
val call=httpClient.newCall(request)
|
|
call.enqueue(callback)
|
|
}
|
|
|
|
/**
|
|
* HTTP POST
|
|
* 发送JSON
|
|
*
|
|
* @param url
|
|
* @param callback
|
|
* @param jsonBody
|
|
*/
|
|
fun post(url:String, callback: Callback, jsonBody:String){
|
|
val request = Request.Builder()
|
|
.url(url)
|
|
.post(body = jsonBody.toRequestBody(contentType = JSON_CONTENT_TYPE))
|
|
.build()
|
|
val call=httpClient.newCall(request)
|
|
call.enqueue(callback)
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
data class ApiResponse<T>(val code:Int,val message:String,val body:T?=null)
|
|
|
|
class SimpleCallback<T>(private val action:String,
|
|
private val onSuccess:(res:ApiResponse<T>) -> Unit,
|
|
private val onFail:(error:String) -> Unit,
|
|
private val type: Type):Callback{
|
|
override fun onFailure(call: Call, e: IOException) {
|
|
onFail("${action}失败,请联系管理员")
|
|
Logger.e(e,"${action}请求失败,发生IO异常")
|
|
}
|
|
|
|
override fun onResponse(call: Call, response: Response) {
|
|
if (response.code == 200) {
|
|
val body=response.body
|
|
if (body!=null&&body.contentType()?.subtype == "json") {
|
|
val jsonRes=body.string()
|
|
val res:ApiResponse<T> = Gson().fromJson(jsonRes, type)
|
|
Logger.i("${action}请求响应成功:")
|
|
Logger.json(jsonRes)
|
|
onSuccess(res)
|
|
} else {
|
|
onFail("${action}失败,请联系管理员")
|
|
Logger.e("无法解析${action}请求响应数据:,响应码:${response.code},${response.body}")
|
|
}
|
|
}else{
|
|
onFail("${action}失败,请联系管理员")
|
|
Logger.e("${action}失败,请求响应码:${response.code}")
|
|
}
|
|
}
|
|
} |