【问题标题】:WebView: Bad Request when loading a urlWebView:加载网址时出现错误请求
【发布时间】:2014-11-07 06:37:16
【问题描述】:

当我尝试在 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 API-19,清单设置为 android:targetSdkVersion="18"。但我检查了WebView migration for 4.4,这些更改似乎都没有影响我的代码。
  • 我只是想检查它是否是早期的 android API 版本。因为如果 URL 源是(Android 版本 shouldOverrideUrlLoading。根据您给定的设置,我刚刚进行了测试,它运行良好,没有任何问题。顺便说一句,你为什么要两次加载 url?你不需要在 shouldOverrideUrlLoading 方法中加载 url,直到你对 URL 过滤做一些特定的事情。
  • @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)

标签: android webview


【解决方案1】:

它给你这个错误是因为你没有正确处理来自这个网页的重定向 试试这个

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
 }
});

【讨论】:

  • 我试过了。问题是,它永远不会到达shouldOverrideUrlLoading
【解决方案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;
        }
    });

 }
}       

【讨论】:

    【解决方案3】:

    尝试改变

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

    这个给

    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);
    

    这段代码对我有用..

    【讨论】:

      【解决方案4】:

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

      例如,在 API 19 中,函数 shouldOverrideUrlLoading 调用失败检查此,http://developer.android.com/guide/webapps/migrating.html

      注意: shouldOverrideUrlLoading 在加载类似 url 时不会被调用

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

      而且重定向不适用于 API 级别 11 及更低级别。 (正如你回复阿卜杜勒,它不叫)

      使用解决方法:我的意思是覆盖适用于所有版本的 onPageStarted。但是,唯一的问题是它稍后会被调用。

      完全随机解决:

      在 Android 4.1.1 上使用 WebView.getSettings().setUseWideViewPort(true),它可以工作。

      【讨论】:

        【解决方案5】:

        这是在 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>
        

        希望这会有所帮助:)

        【讨论】:

          【解决方案6】:
                  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);
          

          【讨论】:

          • 请尝试在您的答案中添加上下文,以及它如何解决问题
          猜你喜欢
          • 1970-01-01
          • 2015-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-08
          • 1970-01-01
          • 2019-09-04
          • 2021-01-21
          相关资源
          最近更新 更多