在Android WebView中获取HTTP状态代码

Vic*_*bar 28 android http android-webview

我正在开发一个在WebView中加载网站的Android应用程序,但有时网站会返回HTTP代码500.

我的问题是:有没有办法从带有监听器或其他类的WebView获取HTTP状态代码?

我试图实现一个WebViewClient,但是我无法获得WebView收到的HTTP状态代码.

Jef*_*man 17

这是不可能的(截至我写这篇文章的时候).这些文档onReceiveError()充其量是模棱两可的,但是你看看这个问题,

http://code.google.com/p/android/issues/detail?id=968

很明显,不会通过该机制报告HTTP状态代码.开发人员如何编写WebView无法检索HTTP状态代码的方式真的让我大吃一惊.

  • 从SDK 23开始,情况就不再如此. (3认同)

Ale*_*rev 14

您可以使用ajax加载内容,然后使用loadDataWithBaseURL将其放入webview.

创建这样的网页

<script type="text/javascript">
    function loadWithAjax() {
        var httpRequest = new XMLHttpRequest();
        var path = 'PATH';
        var host = 'HOST';
        var url = 'URL';

        httpRequest.onreadystatechange = function(){
            if (httpRequest.readyState === 4) { 
                if (httpRequest.status === 200) {
                    browserObject.onAjaxSuccess(host, url, httpRequest.responseText);
                } else {
                    browserObject.onAjaxError(host, url, httpRequest.status);
                }
            }
        };

        httpRequest.open('GET', path, true);
        httpRequest.send(null);
    }
</script>
<body onload="loadWithAjax()">
Run Code Online (Sandbox Code Playgroud)

browserObject是注入javascript的java对象.

addJavascriptInterface(this, "browserObject");
Run Code Online (Sandbox Code Playgroud)

并将其加载到webView中.您应该用您的值替换path/url.

ajaxHtml = IOUtils.toString(getContext().getAssets().open("web/ajax.html"));
            ajaxHtml = ajaxHtml.replace("PATH", path);
            ajaxHtml = ajaxHtml.replace("URL", url);
            ajaxHtml = ajaxHtml.replace("HOST", host);

loadDataWithBaseURL(host, ajaxHtmlFinal, "text/html", null, null);
Run Code Online (Sandbox Code Playgroud)

然后像这样处理onAjaxSuccess/onAjaxError:

    public void onAjaxSuccess(final String host, final String url, final String html)
    {
        ((Activity) getContext()).runOnUiThread(new Runnable()
        {
            @Override
            public void run()
            {
                loadDataWithBaseURL(url, html, "text/html", null, null);
            }
        });
    }

    public void onAjaxError(final String host, final String url, final int errorCode)
    {

    }
Run Code Online (Sandbox Code Playgroud)

现在您可以处理http错误.


Jar*_*lav 8

您可以覆盖方法 onReceivedHttpError 并在那里您可以看到状态代码:

@Override
public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
    super.onReceivedHttpError(view, request, errorResponse);
    int statusCode = errorResponse.getStatusCode();
    // TODO: dou your logic..
}
Run Code Online (Sandbox Code Playgroud)


Jos*_*mez 5

看起来这可以通过 Android M API ( https://code.google.com/p/android/issues/detail?id=82069#c7 ) 中的新回调实现。

void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse)

不幸的是,这很可能在 Android M 之前的设备中不可用。


Mik*_*ike 1

我认为不可能以简单的方式从 webView 获取状态代码(如果可能的话)。

我的想法是使用 WebViewClient 中的 onReceivedError() 方法(如您所说)并在 WebViewClient 中定义错误(完整的错误列表可在此处找到:http ://developer.android.com/reference/android/webkit/WebViewClient.html )并假设例如 504 状态代码等于 WebViewClient.ERROR_TIMEOUT 等。