Android: comprueba si la solicitud es GET o POST

Necesito comprobar si la petición es un POST o un GET en shouldInterceptRequest en mi aplicación de Android. Vea el código abajo:

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"); ... } } 

¿Es posible determinar esto en una extensión de WebViewClient?

One Solution collect form web for “Android: comprueba si la solicitud es GET o POST”

Es posible extendiendo WebViewClient, pero podría implicar un poco más de trabajo de lo que esperaba. Los métodos de devolución de llamada en WebViewClient son llamados por JNI que no puede llamar para obtener encabezados y método, por lo que su mejor opción es usar JavaScript.

Esta solución se basa en el comentario de kristof en http://code.google.com/p/android/issues/detail?id=9122#c21

1. Cree un archivo llamado post_interceptor.js y póngalo en 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, url, async, user, password); }; XMLHttpRequest.prototype.reallySend = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.send = function(body) { window.interception.customAjax(lastXmlhttpRequestPrototypeMethod, body); lastXmlhttpRequestPrototypeMethod = null; this.reallySend(body); }; 

2. Cree una clase Java llamada JavascriptPostIntercept

Cambie nombres de paquete / clase según sea necesario.

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 method, String enctype) { mClient.nextMessageIsFormRequest(new FormRequestContents(json, method, enctype)); } } 

3. Cree su subclase WebViewClient

El código siguiente sólo obtiene el método HTTP de la última solicitud, que parece suficiente para lo que estás preguntando, pero obviamente los otros métodos de AjaxRequestContents y FormSubmitContents te darán acceso al cuerpo de la publicación y otras cosas si lo necesitas.

 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. Cree los enlaces JS-Java adecuados

 MyWebViewClient webViewClient = new MyWebViewClient(); mWebView.setWebViewClient(webViewClient); mWebView.addJavascriptInterface(new JavascriptPostIntercept(webViewClient), "interception"); 
  • Vista Web de Android
  • Android - Utilice OkHttp con Webview
  • Android: EventHub.removeMessages (int what = 107) no es compatible antes de que se configure WebViewCore
  • Abrir PDF en un WebView
  • WebView Crash por java.io.IOException: cerrar error: EIO (error de E / S) libcore.io.IoUtils.close (IoUtils.java:41)
  • ¿Cuál es la diferencia entre setWebViewClient y setWebChromeClient?
  • SaveState de Webview no maneja WebViewClient personalizado
  • Android 4.4 dando ERR_CACHE_MISS error en onReceivedError para WebView volver
  • WebView de Android ignorando target = "_ blank" cuando se agrega WebViewClient
  • Proguard warning biblioteca clase android.webkit.WebView depende de la clase del programa android.webkit.WebViewClien
  • ¿Qué se considera onPageFinished en el WebViewClient para Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.