我需要在WebView中发布一个URL,其中包含标题和表单主体.我添加了下面的代码,但WebView加载页面内容纯HTML.

有人能帮我解决这个问题吗?任何帮助都是高度赞赏.

thanks in advance

binding.webView.apply { 
settings.javaScriptEnabled = true 
settings.domStorageEnabled = true 
settings.allowContentAccess = true 
settings.loadWithOverviewMode = true 
settings.javaScriptCanOpenWindowsAutomatically = true 
settings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
        
webViewClient = object : WebViewClient() {
           override fun shouldOverrideUrlLoading(
                view: WebView?,
                request: WebResourceRequest?
            ): Boolean {
                showLoadingView()
                return false
            }

            override fun onPageFinished(view: WebView?, url: String?) {
                super.onPageFinished(view, url)
                hideLoadingView()
            }

            override fun shouldInterceptRequest(
                view: WebView?,
                request: WebResourceRequest
            ): WebResourceResponse {
                return postDataOkHttpClient(supportCenter)
            }
        }
        loadUrl(supportCenter?.consumerUrl ?: "")
}

private fun postDataOkHttpClient(supportCenter: SupportCenter?): WebResourceResponse {    

    val client = OkHttpClient()

    val mediaType = "application/json; charset=utf-8".toMediaType()

    val jsonObject = JSONObject()
    jsonObject.put("token", supportCenter?.token ?: "")
    jsonObject.put("lang", supportCenter?.lang ?: "")
    jsonObject.put("channel", supportCenter?.channel ?: "")

    val body = jsonObject.toString().toRequestBody(mediaType)

    val request = Request.Builder()
        .url(supportCenter?.consumerUrl ?: "")
        .addHeader("Authorization", supportCenter?.authToken ?: "")
        .addHeader("Content-Type", "application/x-www-form-urlencoded")
        .post(body)
        .build()

    val response = client.newCall(request).execute()

    return WebResourceResponse(
        getMimeType(supportCenter?.consumerUrl ?: ""),
        response.header("content-encoding", "utf-8"),
        response.body!!.byteStream()
    )
}

private fun getMimeType(url: String?): String? { 
            var type: String? = null val 
            extension = MimeTypeMap.getFileExtensionFromUrl(url) 
            if (extension != null) { 
            when (extension) { 
            "js" -> { 
                return "text/javascript" 
            }            
            "woff" -> {
                return "application/font-woff"
            }

            "woff2" -> {
                return "application/font-woff2"
            }

            "ttf" -> {
                return "application/x-font-ttf"
            }

            "eot" -> {
                return "application/vnd.ms-fontobject"
            }

            "svg" -> {
                return "image/svg+xml"
            }

            else -> type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension)
        }
    }
    return type
}

我已经try 了不同的设置为WebView,因此,你看到这么多的设置应用,并设置settings.layout算法rithm = WebSettings.Layout算法rithm.NORMAL以及我try 了与和没有mimeType在WebResourceResponse.但它似乎没有正确加载页面.

推荐答案

使用OkHttpClient:您正在使用OkHttpClient在shouldInterceptRequest方法中发出网络请求.这种方法是不正确的,因为shouldInterceptRequest的目的是拦截和修改请求,而不是发出新的网络请求.相反,您应该修改作为参数传递的原始请求.

webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(
    view: WebView?,
    request: WebResourceRequest?
): Boolean {
    showLoadingView()
    return false
}

override fun onPageFinished(view: WebView?, url: String?) {
    super.onPageFinished(view, url)
    hideLoadingView()
}

override fun shouldInterceptRequest(
    view: WebView?,
    request: WebResourceRequest
): WebResourceResponse? {
    if (request.url.toString() == supportCenter?.consumerUrl) {
        val postData = "token=${supportCenter?.token}&lang=${supportCenter?.lang}&channel=${supportCenter?.channel}"
        val postDataBytes = postData.toByteArray(Charsets.UTF_8)

        val headers = HashMap<String, String>()
        headers["Authorization"] = supportCenter?.authToken ?: ""
        headers["Content-Type"] = "application/x-www-form-urlencoded"

        // Execute the request asynchronously
        OkHttpClient().newCall(Request.Builder()
            .url(request.url.toString())
            .headers(Headers.of(headers))
            .post(RequestBody.create(MediaType.parse("text/plain; charset=utf-8"), postData))
            .build()
        ).enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {
                e.printStackTrace()
                // Handle failure if needed
            }

            override fun onResponse(call: Call, response: Response) {
                val contentType = response.header("Content-Type")
                val charset = response.body?.contentType()?.charset(Charsets.UTF_8) ?: Charsets.UTF_8
                val data = response.body?.string() ?: ""

                // Convert response data to input stream
                val inputStream = ByteArrayInputStream(data.toByteArray(charset))

                // Pass the response data to WebView
                view?.post {
                    view.loadDataWithBaseURL(null, data, contentType, "UTF-8", null)
                }
            }
        })

        // Return null to indicate that the WebView should not load the original request
        return null
    }
    return null
}

}

Java相关问答推荐

如何在PFA中使用不确定的进度指标制作可暂停的任务?

将状态栏和导航栏设置为白色,带有深色文本

我应该避免在Android中创建类并在运行时编译它们吗?

Java模式匹配记录

暂停计时器

OpenGL ES 3.0-纹理黑色

把一条整型短裤和两条短裤装成一条长的

MySQL数据库中未应用具有Spring数据的唯一约束

如何在JavaFX循环中完美地制作一个AudioClip/MediaPlayer?

在Oracle JDBC连接中,连接失效和身份验证失效是什么意思?

Regex以查找不包含捕获组的行

无法播放音频:从资源加载库GStreamer-Lite失败

如何以编程方式保存workBench.xmi?

我可以在@Cacheable中使用枚举吗

项目react 堆中doOnComplete()和Subscribe()的第三个参数之间的差异

Java System.getProperty在哪里检索user.home?

AspectJ编织外部依赖代码,重新打包jar并强制依赖用户使用它

将@Transactional添加到Spring框架中链下的每个方法会产生什么效果?

Java中计算大n和k值模10^9+7的二项式系数的乘法公式输出错误值

双对象供应商