Android-如何在API级别4上拦截Android WebViewClient中的表单帖子
我的Android-如何在API级别4上拦截Android WebViewClient中的表单帖子,android,forms,post,webviewclient,Android,Forms,Post,Webviewclient,我的WebView附带了一个WebView客户机,如下所示: webView.setWebViewClient(new MyWebViewClient()); 下面是我对MyWebViewClient的实现: private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) {
WebView
附带了一个WebView客户机
,如下所示:
webView.setWebViewClient(new MyWebViewClient());
下面是我对MyWebViewClient的实现:
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
webView.loadUrl(url);
return true;
}
}
我通过loadUrl()
为WebView
提供一个要加载的URL。如果我在页面中有一个链接(a href…
),则调用我的shouldOverrideUrlLoading
方法,我可以拦截该链接单击
但是,如果我有一个方法为POST
的表单,则不会调用shouldOverrideUrlLoading
方法
我在这里注意到了一个类似的问题:它似乎建议在我的WebView
中覆盖postUrl
。但是,此API仅从API级别5开始提供
如果我处于API级别4,我可以做什么?还有其他方法可以拦截表单帖子吗?您真的需要使用帖子吗?如果您想在本地处理formdata,为什么不让一段javascript使用addJavascriptInterface处理您的表单和带有“本机”java代码的接口呢。例如
WebView engine = (WebView) findViewById(R.id.web_engine);
engine.getSettings().setJavaScriptEnabled(true);
engine.addJavascriptInterface(new MyBridge(this), "bridge");
engine.loadUrl(...)
您的网桥基本上可以是任何类,您应该能够直接从javascript访问其方法。例如
public class MyBridge {
public MyBridge(Context context) {
// ...
}
public String doIt(String a, String b) {
JSONArray result = new JSONArray();
result.put("Hello " + a);
result.put("Hello " + b);
return result.toString();
}
您的html/javascript可能如下所示:
<script type="text/javascript">
$("#button").click(function() {
var a = $("#a").val();
var b = $("#b").val();
var result=JSON.parse(bridge.doIt(a, b));
// ...
}
</script>
<input id="a"><input id="b"><button id="button">click</button>
$(“#按钮”)。单击(函数(){
var a=$(“#a”).val();
var b=$(“#b”).val();
var result=JSON.parse(bridge.doIt(a,b));
// ...
}
点击
这是一个已知的问题,应该覆盖以下内容
不要捕获帖子。有关详细信息,请参阅
使用GET!我个人尝试使用POST,因为我希望GET参数有一些限制(即URL的长度),但我刚刚成功地通过GET本地传递了32000字节,没有任何问题。我认为您可以覆盖
onLoadResource(WebView视图,字符串URL)
来自WebViewClient
。此函数在API级别1中添加
当WebView
将加载给定url指定的资源时,调用此函数。资源包括js
,css
,iframe
嵌入的url。代码示例如下:
@Override
public void onLoadResource(WebView view, String url) {
if (url.indexOf("http://www.example.com") != -1 && view != null) {
// open url in default browser
view.stopLoading();
view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
}
}
你可以尝试覆盖WebViewClient中的onPageStarted回调。谢谢。我尝试过了,效果很好,但问题是我不想加载表单的页面-这是一个虚假的URL,因此我最终得到了webview错误页面。我通过在onPageStarted中检查URL是否与我的表单URL匹配来解决这个问题,如果是,请在我的应用程序中处理然后告诉webViewClient返回。这听起来合理吗?您找到解决方案了吗?现在,我们有
WebResourceResponse shouldInterceptRequest(WebView视图,WebResourceRequest)
它确实拦截POST。它仍然不够完美;您不能简单地设置自定义头并让请求继续进行–您必须知道这是理想的解决方案,但不幸的是,它似乎无法在2.3 emulator和该代的各种手机上工作。请查找VM崩溃并出现以下错误:JNI警告:jarray 0x40533560 p指向非数组对象的点(Ljava/lang/String;)谷歌搜索更多信息,我真的需要找到解决方案。因为,在我的情况下,实际上,切换到获取并不在我的手中。我无法理解android中是如何丢失它的。原因是什么。在webView
中覆盖postrl
。这是从API级别5开始提供的。我做到了,没有成功。我没有处理。我我还需要一个解决方案。我需要为通过我的WebView发出的所有请求添加一个自定义标题。我首先加载一个重定向的url(通过POST wheee!)到另一个页面,我无法捕获该重定向并正确添加自定义标题。我无法控制服务器以及服务器使用POST而不是GET的事实。在问题中,它被要求拦截POST请求,而不是尝试加载资源。两者都是不同的。对于对此响应添加负数的人:根据HTT根据标准,“资源”不仅仅是文件(js、css等)。“资源”是URI指向的任何东西。例如,API端点也是资源。