WebView:加载URL时出现错误请求

3
当我尝试在WebView中加载URL时:
private final WebViewClient webViewClient = new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        loadUrl(url);
        return true;
    }
};
webView.setWebViewClient(webViewClient);
webView.loadUrl("https://post.craigslist.org/");

我在页面上得到了以下的html代码:

错误请求

您的浏览器发送了一个无法理解的请求给服务器。

输入图像描述

onReceivedError(WebView view, int errorCode, String description, String failingUrl) 回调中也没有任何内容。


请问您在测试时使用的是哪个 Android API 版本? - Deminem
@Deminem API-19 的清单设置为 android:targetSdkVersion="18"。但是我已经查看了4.4版WebView迁移,似乎没有任何更改会影响我的代码。 - Archie.bpgc
我只是想检查一下它是否是较早的Android API版本。因为如果URL来源是重定向(Android版本 <3.0),shouldOverrideUrlLoading将不会被调用。根据您提供的设置,我刚刚进行了测试,它完全正常,没有任何问题。顺便问一下,你为什么要尝试两次加载URL?除非您在URL过滤时执行特定操作,否则不需要在shouldOverrideUrlLoading方法中加载URL。 - Deminem
@Archie.bpgc- 经测试,无论是4.4.2还是4.4.4都可以正常工作,没有任何问题。然而,网页本身包含一些错误。 [INFO:CONSOLE(8)] "Uncaught TypeError: Cannot read property 'getItem' of null", source: https://www.craigslist.org/js/general-concat.min.js?v=c7551eda9664705c434eac8c09bcd83a (8) - Deminem
6个回答

2
这个错误是因为您没有正确处理来自此网页的重定向而导致的 尝试这样做
webview.setWebViewClient(new WebViewClient() {
  public boolean shouldOverrideUrlLoading(WebView view, String url){
    // do your handling codes here, which url is the requested url
    // probably you need to open that url rather than redirect:
    view.loadUrl(url);
    return false; // then it is not handled by default action
 }
});

1
我尝试过了。问题是它从未到达“shouldOverrideUrlLoading”。 - Archie.bpgc

2

试试这样:

public class WebPageLoader extends Activity
 {

   final Activity activity = this;
   private String html;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
      super.onCreate(savedInstanceState);
      this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
      setContentView(R.layout.activity_main);
      WebView webView = (WebView) findViewById(R.id.webview);
      webView.getSettings().setJavaScriptEnabled(true);

webview.loadUrl("https://post.craigslist.org/");

       webView.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress)
        {
            activity.setTitle("Loading...");
            activity.setProgress(progress * 100);

            if(progress == 100)
                activity.setTitle(R.string.app_name);
        }
     });

     webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
        {

        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url)
        {
            view.loadUrl(url);
            return true;
        }
    });

 }
}       

1
尝试更改 <\p>
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    loadUrl(url);
    return true;
}

this to

public boolean shouldOverrideUrlLoading(WebView view, String url) {
    return super.shouldOverrideUrlLoading(view, url);
}

我希望这能帮到你。

更新

mWebView = (WebView) getView().findViewById(R.id.webView1);
if (Patterns.WEB_URL.matcher(url).matches())
        mWebView.loadUrl(url);      

webClient = new WebViewClient() {       

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return super.shouldOverrideUrlLoading(view, url);
    }

    @Override
    public void onFormResubmission(WebView view, Message dontResend,
            Message resend) {
        // TODO Auto-generated method stub
        super.onFormResubmission(view, dontResend, resend);
    }

    @Override
    public void onLoadResource(WebView view, String url) {
        super.onLoadResource(view, url);
        if (url.contains("purchasehistory.html")) {
            mURLNavigation.onURLNavigation(3);
        }
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
    }
};

WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.setWebViewClient(webClient);

这段代码对我有效。


1

当您遇到此类问题时,最好保留API级别号。

例如,在API 19中,函数shouldOverrideUrlLoading未能调用check this,http://developer.android.com/guide/webapps/migrating.html

注意:当加载像这样的URL时,不会调用shouldOverrideUrlLoading。

loadUrl("http://google.com")

并且重定向在API Level 11及以下版本不起作用。(正如您回复Abdul的那样,它没有被调用)
使用解决方法:我的意思是覆盖onPageStarted,在所有版本上都有效。但是,唯一的问题是它稍微晚了一点。
严格随机的解决方法:
在Android 4.1.1上使用WebView.getSettings().setUseWideViewPort(true),它可以工作。

0

以下是在 WebView 中加载 URL 的方法:

private WebView URL

URL = (WebView) WebDialog.findViewById(R.id.url1);  
URL.setWebViewClient(new WebViewClient());
URL.setScrollbarFadingEnabled(true);  
URL.setHorizontalScrollBarEnabled(false);  
URL.getSettings().setJavaScriptEnabled(true);
URL.getSettings().setUserAgentString("My URL");  
URL.loadUrl("//the first url goes here");

接下来,您需要构建一个类似于此的布局作为 XML 文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <RelativeLayout

        <WebView
            android:id="@+id/ticketline"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_below="@id/Title"
            android:layout_marginTop="5dip" />
    </RelativeLayout>

</LinearLayout>

希望这能有所帮助 :)

0
        webview.loadUrl("http://route.izooto.com/?id=1563543&client=41882&rid=4188273230385&frwd=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbT91dG1fc291cmNlPWl6b290byZ1dG1fbWVkaXVtPXB1c2hfbm90aWZpY2F0aW9ucyZ1dG1fY2FtcGFpZ249VGVzdCBpWm9vdG8gTFAmdXRtX2NvbnRlbnQ9JnV0bV90ZXJtPQ==&bkey=f9_DIVuweYA:APA91bFE9x7PN6J5Oy67NypwlT8ZT3Qgz0VSYtCT4_DH5v4l7mCsY7q3aqSrOh6mCcWKIjz4aRiOWQ8ap85r85vHiTh3Mc8n4MiHSnbMXUKGB_5HkDjiBCQg5a7IQifvrakl7bIXF_oA");
       WebViewClient webClient = new WebViewClient() {

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                return super.shouldOverrideUrlLoading(view, url);
            }

            @Override
            public void onFormResubmission(WebView view, Message dontResend,
                                           Message resend) {
                // TODO Auto-generated method stub
                super.onFormResubmission(view, dontResend, resend);
            }

            @Override
            public void onLoadResource(WebView view, String url) {
                super.onLoadResource(view, url);
                if (url.contains("purchasehistory.html")) {
                   // mURLNavigation.onURLNavigation(3);
                }
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
            }
        };

        WebSettings webSettings = webview.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webview.setWebViewClient(webClient);

请尝试在您的答案中添加上下文,以及它如何解决问题。 - ChrisMM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接