当前位置:  开发笔记 > 编程语言 > 正文

Android:拦截来自WebView的AJAX调用

如何解决《Android:拦截来自WebView的AJAX调用》经验,为你挑选了2个好方法。

我想要一个HTML/javascript应用程序,在a中运行WebView以进行AJAXJava代码处理的调用.
理想的做法是拦截调用(简单,只是使用shouldOverrideUrlLoading())并"返回"一些数据.
但是,WebView除了使用javascript函数调用函数之外,我找不到"返回"响应的方法loadUrl().
这对我不起作用,因为该HTML/javascript应用程序是我无法控制的插入式应用程序.就HTML/javascript应用程序而言,它只是进行AJAX调用并接收一些数据.

有什么想法吗?



1> Nappy..:

大家好消息:使用API​​级别11,他们将shouldInterceptRequest方法放入WebViewClient类中.它还触发了WebView触发器内的应用程序请求.您可以按如下方式覆盖它:

@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url)
{
    if (magicallyMatch(url))
        return new WebResourceResponse("application/json", "utf-8", magicallyGetSomeInputStream());

    return null;
}

来自Android参考:

public WebResourceResponse shouldInterceptRequest(WebView视图,String url)

自:API等级11

通知主机应用程序资源请求并允许应用程序返回数据.如果返回值为null, WebView则将继续像往常一样加载资源.否则,将使用返回响应和数据.注意:此方法由网络线程调用,因此客户端在访问私有数据时应谨慎.

参数

viewWebView所请求的资源.

url 资源的原始网址.

返回

A WebResourceResponse包含响应信息,如果WebView应该加载资源本身,则为null .

另请检查WebResourceResponse.

希望这可以帮助.



2> S1LENT WARRI..:

您可以使用JavascriptInterface拦截AJAX调用以及JQuery方法,ajaxStartajaxComplete采用以下方式:

// our JavascriptInterface
public class AjaxHandler {

    private static final String TAG = "AjaxHandler";
    private final Context context;

    public AjaxHandler(Context context) {
        this.context = context;
    }

    public void ajaxBegin() {
        Log.w(TAG, "AJAX Begin");
        Toast.makeText(context, "AJAX Begin", Toast.LENGTH_SHORT).show();
    }

    public void ajaxDone() {
        Log.w(TAG, "AJAX Done");
        Toast.makeText(context, "AJAX Done", Toast.LENGTH_SHORT).show();
    }
}

以下是如何AjaxHandler使用Activity:

    public class MainActivity extends Activity {

    private static final String TAG = "MainActivity";

    private WebView webView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        // get web view
        webView = (WebView) findViewById(R.id.web); 

        // configure web view 
        final WebSettings webSettings = webView.getSettings();
        webSettings.setBuiltInZoomControls(true);
        webSettings.setJavaScriptEnabled(true);

        webView.loadUrl("http://foo.com");

        // add javascript interface
        webView.addJavascriptInterface(new AjaxHandler(this), "ajaxHandler");

        // override onPageFinished method of WebViewClient to handle AJAX calls 
        webView.setWebViewClient(new WebViewClient() {

                @Override
                public void onPageFinished(WebView view, String url) {
                    super.onPageFinished(view, url);

                    view.loadUrl("javascript:$(document).ajaxStart(function (event, request, settings) { " +
                            "ajaxHandler.ajaxBegin(); " + // Event called when an AJAX call begins
                            "});");
                    view.loadUrl("javascript:$(document).ajaxComplete(function (event, request, settings) { " +
                            "ajaxHandler.ajaxDone(); " + // Event called when an AJAX call ends
                            "});");

            });
    }
}

主要想法是从这里采取并提出一些调整.
虽然提交答案有点迟,但希望这对其他人也有帮助!

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有