Android:拦截来自WebView的AJAX调用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android:拦截来自WebView的AJAX调用相关的知识,希望对你有一定的参考价值。
我想要一个html/javascript
应用程序,在WebView
中运行,以生成由AJAX
代码处理的Java
调用。
理想的是拦截调用(简单,只需使用shouldOverrideUrlLoading()
)并“返回”一些数据。
但是,除了使用WebView
调用javascript
函数之外,我找不到“返回”对loadUrl()
的响应的方法。
这对我来说不起作用,因为HTML/javascript
应用程序是我无法控制的插件应用程序。就HTML / javascript应用程序而言,它只是执行AJAX
调用并返回一些数据。
有什么想法吗?
每个人都好消息:在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;
}
public WebResourceResponse shouldInterceptRequest(WebView视图,String url)
自:API等级11
通知主机应用程序资源请求并允许应用程序返回数据。如果返回值为null,则
WebView
将继续像往常一样加载资源。否则,将使用返回响应和数据。注意:此方法由网络线程调用,因此客户端在访问私有数据时应谨慎。参数
view
请求资源的WebView
。
url
资源的原始网址。返回
包含响应信息的
WebResourceResponse
,如果WebView
应加载资源本身,则为null。
还要检查WebResourceResponse。
希望这可以帮助。
您可以使用JavascriptInterface以下列方式拦截AJAX调用以及JQuery方法ajaxStart
和ajaxComplete
:
// 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
"});");
});
}
}
主要想法来自here,并提出了一些调整。 虽然提交答案有点迟,但希望这对其他人也有帮助!
最后我还是使用了问题中描述的方法;
我拦截了一些特定的请求,例如:foo://bar/get/1?callback=foobar
然后解析了URL
并用实际数据调用了一个javascript回调函数。
回调函数在URL
的查询部分中定义,因此在上面的示例中将是:foobar();
调用该函数很简单,只需使用:yourWebView.loadUrl("javascript:foobar('somedata')");
以上是关于Android:拦截来自WebView的AJAX调用的主要内容,如果未能解决你的问题,请参考以下文章