Wenn Sie die HTTP-Antwortbehandlung und das Zeitlimit unabhängig voneinander in Android WebView implementieren möchten, können Sie shouldInterceptRequest überschreiben und die HTTP-Kommunikation unabhängig voneinander implementieren.
Da es sich um ein Beispiel handelt, handelt es sich um eine grobe Implementierung. Nehmen wir jedoch an, Sie haben es wie folgt implementiert.
override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest?): WebResourceResponse? {
val latch = CountDownLatch(1)
var res: InputStream? = null
val call = createOkHttpClient().newCall(Request.Builder().url(request?.url.toString()).method("POST", RequestBody.create(null, "hoge")).build())
call.enqueue(object: Callback {
override fun onFailure(call: Call, e: IOException) {
latch.countDown()
}
override fun onResponse(call: Call, response: Response) {
res = response.body()?.byteStream()
latch.countDown()
}
})
latch.await()
return WebResourceResponse("text/html", "UTF-8",res)
}
private val cookieStore = HashMap<String, MutableList<Cookie>>()
fun createOkHttpClient(): OkHttpClient {
return OkHttpClient.Builder()
.cookieJar(object: CookieJar {
override fun saveFromResponse(url: HttpUrl, cookies: MutableList<Cookie>) {
cookieStore[url.host()] = cookies
}
override fun loadForRequest(url: HttpUrl): MutableList<Cookie> {
val cookies = cookieStore[url.host()]
return cookies ?: ArrayList()
}
})
.build()
}
Aber seien Sie vorsichtig, wenn Sie dies verwenden. Betrachten Sie beispielsweise den Fall, dass Sie den folgenden HTML-Code erhalten.
<html>
<body>
<script type="text/javascript">
function doPost() {
document.TestForm.submit();
}
</script>
<h1>Test</h1>
<form id="TestForm" name="TestForm" action="http://192.168.100.2:3000/hoge" method="post">
<input type="hidden" name="hoge" value="hogeVal"/>
<input type="hidden" name="fuga" value="fugaVal"/>
<input type="submit" value="submit">
</form>
<script type="text/javascript">
doPost();
</script>
</body>
</html>
Da WebView über eine HTML-Analysefunktion verfügt, wird die Funktion doPost beim Lesen des obigen HTML-Codes aufgerufen und für das im Tag