如何使用 Android WebView 处理 "Internal Server Error"?

How to handle an "Internal Server Error" with Android WebView?

我正在使用 onReceivedError 拦截加载 webview 时的任何错误。由于我们的网页有一个 Internal Server Error 并且整个应用程序基于 webview(没有本机导航),因此它看起来像这样:

Example Screenshot

这样我拦截错误:

    @SuppressLint("NewApi")
    public void onReceivedError(final WebView view, WebResourceRequest request, final WebResourceError error) {
        Log.d(TAG, "HTTP error " + error.getErrorCode() + " ---> " + error.getDescription());
        int err = error.getErrorCode();
        if (err == -2) {
            view.loadUrl("about:blank");
            view.loadUrl("file:///android_asset/de_offline.html");
        } else {
            view.reload();
        }
    }

为什么应用程序无法识别此 Internal Server Error?它识别是否没有互联网连接。

但是这个错误有点毁了整个应用程序,因为即使网页重新上线,这个屏幕也不会消失。这意味着我被迫 setAppCacheEnabledfalse.

我想那是因为它存储在缓存中或缺少重新加载按钮。但是由于我们在共享主机上,我们无法向此 html 错误页面添加重新加载按钮。

即使我完全关闭应用程序并重新启动,也会显示此错误。

用户唯一的选择是手动卸载应用程序或删除缓存,但我认为没有人会这样做,或者在大多数情况下不知道。

所以我的问题是为什么 onReceivedError 甚至没有加载本地 de_offline.html 资产 html 页面?我是否必须在更早的某个时间点进行拦截,那是什么方法或在哪里?

检查错误页面是否未使用 HTTP 200 状态代码进行响应。服务器错误应使用 HTTP-5xx 状态代码进行响应。 我怀疑 WebView 正在接收 HTTP 2xx 并且 "thinks" 响应正常,因此您的错误处理没有发生。

参考:List of HTTP status codes and their meaning

编辑: 我刚刚查看了:WebViewClient - Error Code 据我所知,这描述了一组完全不同的错误。但是为什么?

另一个编辑:我的天……到底是什么?! 据我所知,没有办法在 WebView 中获取 HTTP 状态代码?!这超出了我的范围。 我所能得到的就是这个解决方法 How can I check from Android WebView if a page is a "404 page not found"?。针对内部服务器错误调整此方法(如果适用,请使用 Android SDK API 级别 23 中的方法,其中添加了 onReceivedHttpError