如何使用 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
?它识别是否没有互联网连接。
但是这个错误有点毁了整个应用程序,因为即使网页重新上线,这个屏幕也不会消失。这意味着我被迫 setAppCacheEnabled
到 false
.
我想那是因为它存储在缓存中或缺少重新加载按钮。但是由于我们在共享主机上,我们无法向此 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
)
我正在使用 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
?它识别是否没有互联网连接。
但是这个错误有点毁了整个应用程序,因为即使网页重新上线,这个屏幕也不会消失。这意味着我被迫 setAppCacheEnabled
到 false
.
我想那是因为它存储在缓存中或缺少重新加载按钮。但是由于我们在共享主机上,我们无法向此 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
)