5

を使用して webview リクエストを傍受しようとしていました: ShouldInterceptRequest、その中でHttpUrlConnectionサーバーからデータをフェッチするために使用し、リダイレクトに従うように設定しました。これは webviewclient に対して透過的です。つまり、WebResponseResource("", "", data_inputstream) を返すと、webview はターゲット ホストが変更されたことを認識しない可能性があります。これが発生したことを webview に伝えるにはどうすればよいですか?

ourBrowser.setWebViewClient(new WebViewClient() {
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view,
                String url) {
                    ..... //some code omitted here

                HttpURLConnection conn = null;
                try {
                    conn = (HttpURLConnection) newUrl.openConnection();
                    conn.setFollowRedirects(true);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                   ..... //

                InputStream is = null;
                try {
                    is = conn.getInputStream();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return new WebResourceResponse(mimeType, encoding, is);

            }
        }

「google.com」をリクエストすると、「google.co.uk」にリダイレクトされるはずですが、「co.uk」に添付されているcssファイルのリンクが「/render/something.css」の場合、webviewはリダイレクトを知りませんでした"、webview は " http://www.google.com/render/something.css " に移動して、" http://www.google.co.uk/render/something.cssであるはずの css ファイルを見つけます。 "。

誰でも私を助けることができますか?

4

3 に答える 3

1

WebResourceResponse特定のメタデータ (url、ヘッダーなど) はクラスで指定できません。つまり、 を使用shouldInterceptRequestして別のデータを提供する (ページのコンテンツを変更する) ことしかできず、それをロードする URL を変更するために使用することはできません。

あなたの場合、 内でリダイレクトを消費しているため、WebView はまだ「 http://www.google.com/HttpUrlConnection 」をロードしていると考えています(コンテンツが「http://google.co.英国/ ")。Google のホームページでベース URL が明示的に設定されていない場合、WebView は引き続きベース URL が「http://www.google.com/」であると想定します (リダイレクトが表示されていないため)。相対リソース参照 ( など) は baseURL (この場合は " http://www.google.com/ " であり、" http://www.google.co.uk/ " ではありません)に対して解決されるため、あなたが観察した結果。<link href="//render/something.css" />

できることはHttpUrlConnection、ロードしようとしている URL がリダイレクトであるかどうかを調べるために使用しnull、その場合は返すことです。ただし、一般的にHttpUrlConnectionfromを使用しないことを強くお勧めしshouldInterceptRequestます。WebView のネットワーク スタックははるかに効率的であり、フェッチを並行して実行します (一方、使用shouldInterceptRequestすると、KK 以前の WebView のすべてのロードがシリアル化されます)。

于 2013-11-13T11:49:55.733 に答える
-1

すべての HttpURLConnection オブジェクトに対して HTTP リダイレクトをグローバルに有効にすることができます。

HttpURLConnection.setFollowRedirects(true);

次に、shouldInterceptRequest()メソッドで接続応答コードを確認します。

public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
  ...
  int respCode = conn.getResponseCode();
  if( respCode >= 300 && respCode < 400 ) {
    // redirect
    return null;
  } else if( respCode >= 200 && respCode < 300 ) {
    // normal processing
    ...
}

Android フレームワークは、リダイレクト先の新しい URL でshouldInterceptRequest()を再度呼び出す必要があり、今回の接続応答コードは 2xx になります。

于 2014-12-31T15:52:27.863 に答える