Lorsque vous souhaitez implémenter indépendamment la gestion des réponses HTTP et le délai d'expiration dans Android WebView, vous pouvez remplacer shouldInterceptRequest et implémenter la communication HTTP indépendamment.
Puisqu'il s'agit d'un échantillon, il s'agit d'une implémentation approximative, mais disons que vous l'avez implémentée comme suit.
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()
}
Mais soyez prudent lorsque vous l'utilisez. Par exemple, considérons le cas de l'obtention du code HTML suivant.
<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>
Puisque WebView a une fonction d'analyse HTML, la fonction doPost est appelée lors de la lecture du code HTML ci-dessus, et pour le
http: //192.168.100.2: 3000 / hoge``` défini dans la balise