我需要在我的Android应用程序中检查请求是否是POST或者在shouldInterceptRequest中的GET.
见下面的代码:
public class CustomWebViewClient extends WebViewClient {
...
@Override
public WebResourceResponse shouldInterceptRequest(WebView view,String url) {
if ("request is POST")
Log.d("CustomWebViewClient","request is a POST");
else if ("request is GET")
Log.d("CustomWebViewClient","request is a GET");
...
}
}
是否有可能在WebViewClient的范围内确定这一点?
最佳答案
可以通过扩展WebViewClient来实现,但它可能涉及比预期更多的工作. WebViewClient中的回调方法由JNI调用,您无法调用以获取标头和方法,因此最好的办法是使用JavaScript.
原文链接:https://www.f2er.com/android/430712.html该解决方案基于kristof对http://code.google.com/p/android/issues/detail?id=9122#c21的评论
1.创建一个名为post_interceptor.js的文件,并将其放在res / raw中
post_interceptor.js
HTMLFormElement.prototype._submit = HTMLFormElement.prototype.submit;
HTMLFormElement.prototype.submit = interceptor;
window.addEventListener('submit',function(e) {
interceptor(e);
},true);
function interceptor(e) {
var frm = e ? e.target : this;
interceptor_onsubmit(frm);
frm._submit();
}
function interceptor_onsubmit(f) {
var jsonArr = [];
for (i = 0; i < f.elements.length; i++) {
var parName = f.elements[i].name;
var parValue = f.elements[i].value;
var parType = f.elements[i].type;
jsonArr.push({
name : parName,value : parValue,type : parType
});
}
window.interception.customSubmit(JSON.stringify(jsonArr),f.attributes['method'] === undefined ? null : f.attributes['method'].nodeValue,f.attributes['enctype'] === undefined ? null : f.attributes['enctype'].nodeValue);
}
lastXmlhttpRequestPrototypeMethod = null;
XMLHttpRequest.prototype.reallyOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(method,url,async,user,password) {
lastXmlhttpRequestPrototypeMethod = method;
this.reallyOpen(method,password);
};
XMLHttpRequest.prototype.reallySend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(body) {
window.interception.customAjax(lastXmlhttpRequestPrototypeMethod,body);
lastXmlhttpRequestPrototypeMethod = null;
this.reallySend(body);
};
2.创建一个名为JavascriptPostIntercept的Java类
根据需要更改包/类名.
JavascriptPostIntercept.java
public class JavascriptPostIntercept {
public interface JavascriptPostInterceptInterface {
public void nextMessageIsAjaxRequest(AjaxRequestContents contents);
public void nextMessageIsFormRequest(FormRequestContents contents);
}
private static String sInterceptHeader;
private JavascriptPostInterceptInterface mClient;
public static String getInterceptHeader() {
if (sInterceptHeader == null) {
// Assuming you have your own stream to string implementation
sInterceptHeader = StringUtils.readInputStream(
Resources.getSystem().openRawResource(R.raw.post_interceptor));
}
return sInterceptHeader;
}
public static class AjaxRequestContents {
private String mMethod;
private String mBody;
public AjaxRequestContents(String method,String body) {
mMethod = method;
mBody = body;
}
public String getMethod() {
return mMethod;
}
public String getBody() {
return mBody;
}
}
public static class FormRequestContents {
private String mJson;
private String mMethod;
private String mEnctype;
public FormRequestContents(String json,String method,String enctype) {
mJson = json;
mMethod = method;
mEnctype = enctype;
}
public String getJson() {
return mJson;
}
public String getMethod() {
return mMethod;
}
public String getEnctype() {
return mEnctype;
}
}
public JavascriptPostIntercept(JavascriptPostInterceptInterface client) {
mClient = client;
}
@JavascriptInterface
public void customAjax(final String method,final String body) {
mClient.nextMessageIsAjaxRequest(new AjaxRequestContents(method,body));
}
@JavascriptInterface
public void customSubmit(String json,String enctype) {
mClient.nextMessageIsFormRequest(new FormRequestContents(json,method,enctype));
}
}
3.创建WebViewClient子类
下面的代码只获取最新请求的HTTP方法,这看起来足以满足您的要求,但很明显,AjaxRequestContents和FormSubmitContents上的其他方法可以让您在需要时访问帖子正文和其他内容.
class MyWebViewClient extends WebViewClient implements JavascriptPostIntercept.JavascriptPostInterceptInterface {
private String mLastRequestMethod = "GET";
/// evaluate post_interceptor.js after the page is loaded
@Override
public void onPageFinished(WebView view,String url) {
view.loadUrl("javascript: " + JavascriptPostIntercept.getInterceptHeader());
}
@TargetApi(11)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view,String url) {
if (mLastRequestMethod.equals("POST")) {
// do stuff here...
} else if (mLastRequestMethod.equals("GET")) {
// do other stuff here...
}
// return something here...
}
@Override
public void nextMessageIsAjaxRequest(JavascriptPostIntercept.AjaxRequestContents contents) {
mLastRequestMethod = contents.getMethod();
}
@Override
public void nextMessageIsFormRequest(JavascriptPostIntercept.FormRequestContents contents) {
mLastRequestMethod = contents.getMethod();
}
}
4.创建适当的JS-Java链接
MyWebViewClient webViewClient = new MyWebViewClient();
mWebView.setWebViewClient(webViewClient);
mWebView.addJavascriptInterface(new JavascriptPostIntercept(webViewClient),"interception");