import com.xdwalker.xdlocation.log.GlobalLogger
import okhttp3.Call
import okhttp3.Callback
import okhttp3.FormBody
import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.MediaType
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import org.json.JSONObject
import java.io.IOException
class OkHttp {
fun get(url: String, params: HashMap<String, String>? = null): String? {
// GlobalLogger.i("data", params.toString())
// okhttp get 请求添加参数
val urlBuilder = url.toHttpUrlOrNull()?.newBuilder()
?.apply {
if (params != null) {
addQueryParamMap(params)
}
}
val client = OkHttpClient()
val request = Request.Builder()
.url(urlBuilder!!.build())
.build()
// GlobalLogger.i("request", request.toString())
val response = client.newCall(request).execute()
val body = response.body?.string()
// GlobalLogger.i("response", response.toString())
return body
}
fun post(url: String, data: Map<String, String>? = null): String? {
val temp = FormBody.Builder().apply {
if (data != null) {
addBodyMap(data)
}
}.build()
val client = OkHttpClient()
val request = Request.Builder()
.url(url)
.post(temp)
.build()
val response = client.newCall(request).execute()
// GlobalLogger.i("response", response.toString())
return response.body?.string()
}
fun jsonPost(url: String, jsonObject: JSONObject): String? {
try {
val body: RequestBody = jsonObject.toString().toRequestBody(jsonType)
val client = OkHttpClient()
val request = Request.Builder()
.url(url)
.post(body)
.build()
val response = client.newCall(request).execute()
if (response.code != 200) {
// throw Exception("responseError: ${response.code}")
return null
} else {
return response.body.string()
}
} catch (e: Exception) {
GlobalLogger.e("jsonPost", "jsonPost error: $e" + e.message)
GlobalLogger.e("responseError", e.toString())
}
// val res = response.body?.string()
// simpleDealData(response)
// GlobalLogger.i("response", res.toString())
// val result = Utils.jsonToMap(response.body?.string()!!)
// return res
return null
}
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.addBodyMap(
headerMap: Map<String, String>,
): FormBody.Builder {
headerMap.forEach { (key, value) ->
this.add(key, value)
}
return this
}
private fun HttpUrl.Builder.addQueryParamMap(headerMap: HashMap<String, String>): HttpUrl.Builder {
headerMap.forEach { (key, value) ->
this.addQueryParameter(key, value)
}
return this
}
private val jsonType get() = "application/json; charset=utf-8".toMediaTypeOrNull()
// -----------------------------------------
fun simplePostUseJson(url: String, jsonStr: String? = null) {
val requestBody = jsonStr?.let {
//创建requestBody 以json的形式
val contentType: MediaType = "application/json; charset=utf-8".toMediaType()
jsonStr.toRequestBody(contentType)
} ?: run {
//如果参数为null直接返回null
FormBody.Builder().build()
}
val okHttpClient = OkHttpClient()
val request = Request.Builder()
.url(url)
.post(requestBody) //以post的形似 添加requestBody
.build()
okHttpClient.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
GlobalLogger.i("", "go failure ${e.message}")
}
override fun onResponse(call: Call, response: Response) {
GlobalLogger.i("response", response.toString())
val msg = if (response.isSuccessful) {
simpleDealData(response)
} else {
"failure code:${response.code} message:${response.message}"
}
GlobalLogger.i("", msg)
}
})
}
fun simplePostUseFrom(url: String, params: Map<String, String>? = null) {
//创建 formBody
val formBody = FormBody.Builder()
.also { builder ->
params?.forEach { (name, value) ->
//参数需要 add 进入FormBody.Builder
builder.add(name, value)
}
}.build()
val okHttpClient = OkHttpClient()
val request = Request.Builder()
.url(url)
.post(formBody) //注意:此时formBody以post的形式传入
.build()
okHttpClient.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
GlobalLogger.d("ERROR", "go failure ${e.message}")
}
override fun onResponse(call: Call, response: Response) {
val msg = if (response.isSuccessful) {
simpleDealData(response)
} else {
"failure code:${response.code} message:${response.message}"
}
GlobalLogger.d("ERROR", msg.toString())
}
})
}
//该函数用于简单处理返回的信息,这里放一次,下面就不放了。
private fun simpleDealData(response: Response): String = StringBuilder().apply {
append("\n\t")
append("header")
append("\n\t")
append(response.headers.joinToString("\n\t"))
append("\n\t")
append("body")
append("\n\t")
append("responseCode: ${response.code}")
append("\n\t")
append(
"content: ${
(response.body?.string() ?: "").let { s: String ->
//对获取到的数据 简单做一下格式化
s.split(",").joinToString("\n\t")
}
}"
)
}.toString()
}
- 发布:2023-08-29 16:08
- 更新:2023-08-29 16:08
- 阅读:115
【报Bug】com.squareup.okhttp3:okhttp:5.0.0-alpha.11 java.lang.NoSuchFieldError: No field Companion
产品分类: uniapp/App
PC开发环境操作系统: Mac
PC开发环境操作系统版本号: 11.7.9
HBuilderX类型: 正式
HBuilderX版本号: 3.8.12
手机系统: Android
手机系统版本号: Android 13
手机厂商: 华为
手机机型: 荣耀X50
页面类型: vue
vue版本: vue2
打包方式: 云端
项目创建方式: HBuilderX
示例代码:
操作步骤:
调用OkHttp().jsonPost(url, jsonData)方法
调用OkHttp().jsonPost(url, jsonData)方法
预期结果:
可以正常发送请求
可以正常发送请求
实际结果:
2023-08-29 15:41:34.572 24255-24973/uni.UNIC425B5C E/UncaughtExceptionHandler: java.lang.NoSuchFieldError: No field Companion of type Lokhttp3/RequestBody$Companion; in class Lokhttp3/RequestBody; or its superclasses (declaration of 'okhttp3.RequestBody' appears in /data/app/~~_iGWpnlXoehBGol6O_DSuQ==/uni.UNIC425B5C-C6bwRigpzMgitZF9vdBC1g==/base.apk!classes2.dex)
2023-08-29 15:41:34.572 24255-24973/uni.UNIC425B5C E/UncaughtExceptionHandler: java.lang.NoSuchFieldError: No field Companion of type Lokhttp3/RequestBody$Companion; in class Lokhttp3/RequestBody; or its superclasses (declaration of 'okhttp3.RequestBody' appears in /data/app/~~_iGWpnlXoehBGol6O_DSuQ==/uni.UNIC425B5C-C6bwRigpzMgitZF9vdBC1g==/base.apk!classes2.dex)
bug描述:
我的安卓原生插件中自定义了OkHttp类,使用android studio安装应用一切正常,使用uniapp调用原生插件报错。
implementation "com.squareup.okhttp3:okhttp:5.0.0-alpha.11"
0 个回复