Android – 检查请求是GET还是POST

前端之家收集整理的这篇文章主要介绍了Android – 检查请求是GET还是POST前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我需要在我的Android应用程序中检查请求是否是POST或者在shouldInterceptRequest中的GET.
见下面的代码

@H_502_6@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.

解决方案基于kristof对http://code.google.com/p/android/issues/detail?id=9122#c21评论

1.创建一个名为post_interceptor.js的文件,并将其放在res / raw中

post_interceptor.js

@H_502_6@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

@H_502_6@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上的其他方法可以让您在需要时访问帖子正文和其他内容.

@H_502_6@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链接

@H_502_6@MyWebViewClient webViewClient = new MyWebViewClient(); mWebView.setWebViewClient(webViewClient); mWebView.addJavascriptInterface(new JavascriptPostIntercept(webViewClient),"interception");

猜你在找的Android相关文章