首先匯入okhttp的包:
implementation 'com.squareup.okhttp3:okhttp:4.2.0'
現在kotlin用的人越來越多了.真好.因為kt的版本一直在更新著,我現在用的是1.3.72的
之下代碼還是需要一些kt的基礎的要不然會有點難理解
首先創建okhttp的一個實體物件
private class ZTrustManager : X509TrustManager {
override fun checkClientTrusted(chain: Array<out X509Certificate>?, authType: String?) {
}
override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?) {
}
override fun getAcceptedIssuers(): Array<X509Certificate> = arrayOf()
}
private val cookieStore by lazy {
HashMap<HttpUrl?, List<Cookie>>()
}
// 就在這里實體化okhttp 其他的東西用到即可添加.用不到注釋掉也無大礙.
private val mOkHttpClient by lazy {
OkHttpClient().newBuilder().apply {
this.connectTimeout(40, TimeUnit.SECONDS)
this.readTimeout(40, TimeUnit.SECONDS)
this.writeTimeout(40, TimeUnit.SECONDS)
// 如果后臺需要用到cookie 就加上就可以
cookieJar(object : CookieJar {
override fun loadForRequest(url: HttpUrl): List<Cookie> {
val cookies: List<Cookie>? =
cookieStore.get(CloudUrlIinterface.url.toHttpUrlOrNull())
if (cookies == null) {
// println("沒加載到cookie")
}
return cookies ?: ArrayList()
}
override fun saveFromResponse(url: HttpUrl, cookies: List<Cookie>) {
cookieStore.put(url, cookies)
cookieStore.put(CloudUrlIinterface.url.toHttpUrlOrNull(), cookies)
/*for (cookie in cookies) {
println("guo cookice name:" + cookie.name)
println("guo cookece path:" + cookie.path)
}*/
}
})
///
val trustAllCerts: Array<TrustManager> = arrayOf(ZTrustManager())
val sslContext: SSLContext = SSLContext.getInstance("SSL")
sslContext.init(null, trustAllCerts, SecureRandom())
val sslSocketFactory: SSLSocketFactory = sslContext.socketFactory
sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager)
hostnameVerifier(HostnameVerifier { _: String?, _: SSLSession? -> true })
}.build()
}
GET請求,只有帶url的那種…
fun getAsync(url: String, callback: ResultCallback<*>) {
val request = Request.Builder()
.url(url)
.build()
deliverResult(callback, request)
}
GET請求,需要用到token
/**
* get 只帶token(放headers中)
* @param headerMap token
*/
fun getAsync(
url: String,
headerMap: Map<String, String>,
callback: ResultCallback<*>
) {
// okhttp get 請求添加引數
val request = Request.Builder()
.url(url)
.addHeaderMap(headerMap)
.build()
deliverResult(callback, request)
}
GET請求,只帶引數,拼接的那種
/**
* get 只帶引數
* @param hashMap 引數串列
*/
fun getAsync(
url: String,
params: HashMap<String, String>,
callback: ResultCallback<*>
) {
// okhttp get 請求添加引數
val urlBuilder = url.toHttpUrlOrNull()?.newBuilder()
?.apply {
addQueryParamMap(params)
}
val request = Request.Builder()
.url(urlBuilder!!.build())
.build()
deliverResult(callback, request)
}
GET請求,token,拼接引數
/**
* get 帶引數請求,帶token
* @param hashMap 引數串列
* @param headerMap token
*/
fun getAsync(
url: String,
hashMap: HashMap<String, String>,
headerMap: Map<String, String>,
callback: ResultCallback<*>
) {
// okhttp get 請求添加引數
val urlBuilder = url.toHttpUrlOrNull()?.newBuilder()
?.apply {
addQueryParamMap(hashMap)
}
val request = Request.Builder()
.url(urlBuilder!!.build())
.addHeaderMap(headerMap)
.build()
deliverResult(callback, request)
}
POST請求,帶token,請求方式為form-body

/**
* put 帶引數請求,帶token
* @param hashMap 引數串列(引數form-body請求)
* @param headerMap token
*/
fun putAsync(
url: String,
hashMap: HashMap<String, String>,
headerMap: Map<String, String>,
callback: ResultCallback<*>
) {
val body = FormBody.Builder().apply {
addHeaderMap(hashMap)
}.build()
val request = Request.Builder()
.url(url)
.put(body)
.addHeaderMap(headerMap)
.build()
deliverResult(callback, request)
}
POST請求方式,raw提交方式

private val jsonType get() = "application/json; charset=utf-8".toMediaTypeOrNull()
/**
* post 帶引數,(raw請求方式)
* 帶token
*/
fun postAsync(
url: String,
headerMap: Map<String, String>,
jsonObject: JSONObject,
callback: ResultCallback<*>
) {
val body: RequestBody = jsonObject.toString().toRequestBody(jsonType)
val request: Request = Request
.Builder()
.url(url)
.addHeaderMap(headerMap)
.post(body)
.build()
deliverResult(callback, request)
}
PUT請求方式
/**
* put請求 帶引數,帶token(引數row請求方式)
*/
fun putAsync(
url: String,
jsonObject: JSONObject,
headerMap: Map<String, String>,
callback: ResultCallback<*>
) {
val body: RequestBody = jsonObject.toString().toRequestBody(jsonType)
val request = Request.Builder()
.url(url)
.addHeaderMap(headerMap)
.put(body)
.build()
deliverResult(callback, request)
}
DELETE請求
/**
* delete
* 帶引數,帶token
*/
fun deleteAsync(
url: String,
paramMap: HashMap<String, String>,
headerMap: Map<String, String>,
callback: ResultCallback<*>
) {
val body = FormBody.Builder().apply {
addHeaderMap(paramMap)
}.build()
val request: Request = Request
.Builder()
.url(url)
.addHeaderMap(headerMap)
.delete(body)
.build()
deliverResult(callback, request)
}
其他在請求中用到的幾個東西
集中在這里做了請求回呼的處理
deliverResult()
private fun deliverResult(callback: ResultCallback<*>, request: Request) {
mOkHttpClient.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
sendFailureStringCallback(request, e, callback)
}
override fun onResponse(call: Call, response: Response) {
sendSuccessResultCallback(response, callback as ResultCallback<Any>)
}
})
}
// 創建一個單例的handler,發送在主執行緒的.
private val mHandler by lazy {
Handler(Looper.getMainLooper())
}
fun sendFailureStringCallback(
request: Request,
exception: Exception,
callback: ResultCallback<*>
) {
// 這里回呼在主執行緒
mHandler.post {
callback.onError(request, exception)
}
}
/**
* 這里就不在這里回呼到主執行緒,前面做處理把
*/
fun sendSuccessResultCallback(mObject: Any, callback: ResultCallback<Any>) {
callback.onResponse(mObject)
}
回呼類,也就是在網路請求下來的用到的callback
import com.google.gson.internal.`$Gson$Types`
import okhttp3.Request
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type
/**
* Created by Android Studio.
* User: GGY
* Date: 2020/10/21
*/
abstract class ResultCallback<T> {
val mType: Type by lazy {
getSuperclassTypeParameter(javaClass)
}
companion object {
fun getSuperclassTypeParameter(subclass: Class<*>): Type {
val superclass = subclass.genericSuperclass
if (superclass is Class<*>) {
throw RuntimeException("Miss type parameter.")
}
val parameterizedType = superclass as ParameterizedType
return `$Gson$Types`.canonicalize(parameterizedType.actualTypeArguments[0])
}
}
abstract fun onError(request: Request, exception: Exception)
abstract fun onResponse(response: T)
}
可能你在使用的程序對這些函式產生了疑惑
addHeaderMap(),addQueryParamMap(),為什么我呼叫不到呢?
這里我為了方便簡寫在請求中添加map(引數)寫了幾個擴展函式
//寫介面擴展函式, 方便在做請求的時候,直接可以傳入Map型別
private fun Request.Builder.addHeaderMap(
headerMap: Map<String, String>
): Request.Builder {
headerMap.forEach { key, token ->
this.addHeader(key, token)
}
return this
}
private fun FormBody.Builder.addHeaderMap(
headerMap: Map<String, String>
): FormBody.Builder {
headerMap.forEach { key, token ->
this.add(key, token)
}
return this
}
private fun HttpUrl.Builder.addQueryParamMap(headerMap: HashMap<String, String>): HttpUrl.Builder {
headerMap.forEach { key, value ->
this.addQueryParameter(key, value)
}
return this
}
在用row請求的時候,JSONObject不會用的話,我也貼出來把,不過都會用把…
val jsonObject = JSONObject()
jsonObject.put("device_code", deviceCode)
jsonObject.put("is_online", isOnlie)
基本把整個類都貼完了.這也是我用到的幾種請求方式.寫的方式可能有些不雅,不過不要擔心,人都是要慢慢成長的.理解了代碼等你寫出來肯定會比我強.一起加油把.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/227560.html
標籤:其他
上一篇:沒有卡頓的全域設定防暴力點擊事件
