1***@163.com
1***@163.com
  • 发布: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

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Mac

PC开发环境操作系统版本号: 11.7.9

HBuilderX类型: 正式

HBuilderX版本号: 3.8.12

手机系统: Android

手机系统版本号: Android 13

手机厂商: 华为

手机机型: 荣耀X50

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

示例代码:
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()  
}  

操作步骤:
调用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)

bug描述:

我的安卓原生插件中自定义了OkHttp类,使用android studio安装应用一切正常,使用uniapp调用原生插件报错。
implementation "com.squareup.okhttp3:okhttp:5.0.0-alpha.11"

2023-08-29 16:08 负责人:无 分享
已邀请:

要回复问题请先登录注册