Android: WebView shouldInterceptRequest no agregar RequestProperties en el WebView
Estoy interceptando solicitudes de la webview usando shouldInterceptRequest
A continuación está mi código para devolver mi WebResourceResponse
- Cuando invoco una función Java desde mi código Javascript, WebView se bloquea. ¿Por qué?
- Espacios en blanco usando la vista web de android dentro de scrollview con una red móvil de jQuery
- ¿Cómo puedo usar Android para descargar un archivo basado en sesión / cookie usando webView?
- Webview no cambia el tamaño cuando aparece el teclado
- Android: cómo saber si una vista se desplaza
@TargetApi(Build.VERSION_CODES.LOLLIPOP) private static WebResourceResponse handleRequestViaUrlOnly(WebResourceRequest webResourceRequest){ String url = webResourceRequest.getUrl().toString(); Log.i("intercepting req....!!!", url); String ext = MimeTypeMap.getFileExtensionFromUrl(url); String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext); try { HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); conn.setRequestProperty("Sample-Header", "hello"); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); return new WebResourceResponse(mime, "UTF-8", conn.getInputStream()); } catch (IOException e) { e.printStackTrace(); } return null; }
Llamo a este método dentro de mi CustomWebViewClient
class CustomWebViewClient extends WebViewClient { @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { return handleRequestViaUrlOnly(request); } }
Sin embargo, cuando compruebo los encabezados de solicitud desde el depurador remoto WebView en chrome: // inspect / # devices.
El RequestProperty adicional que agregué no está presente.
conn.setRequestProperty("Sample-Header", "hello");
El encabezado de muestra no está presente en los encabezados de solicitud en el WebView.
¿Me estoy perdiendo de algo? Apreciaré cualquier ayuda.
- BasicAuthentication en android para que la vista web no funcione
- WebView con https loadUrl muestra la página en blanco
- Enlace de correo electrónico de Webview (mailto)
- ¿Justificar texto en una aplicación de Android utilizando un WebView pero presentando una interfaz similar a TextView?
- Cómo proporcionar entrada a un campo de entrada webView mediante programación en Android Kitkat (4.4)
- Soporte de lienzo HTML5 y vista Web de Android
- La concurrencia de webview de Android causó SQLiteException: la base de datos está bloqueada
- Colocación de contenido HTML en dos columnas dentro de WebView
Así que el problema es que cuando se pasa conn.getInputStream()
sólo da datos. Los encabezados de respuesta podrían ser extraídos por conn.getHeaderFields()
. Además, no podrá obtener su encabezado extra a menos que el servidor lo apoye y CORS no esté involucrado. Aquí está la salida wireshark
de la conexión
GET /~fdc/sample.html HTTP/1.1 Sample-Header: hello Content-Type: application/x-www-form-urlencoded User-Agent: Dalvik/2.1.0 (Linux; U; Android 7.1; Android SDK built for x86_64 Build/NPF26K) Host: www.columbia.edu Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 0 HTTP/1.1 200 OK Date: Wed, 01 Mar 2017 09:06:58 GMT Server: Apache Last-Modified: Thu, 22 Apr 2004 15:52:25 GMT Accept-Ranges: bytes Vary: Accept-Encoding,User-Agent Content-Encoding: gzip Content-Length: 8664 Keep-Alive: timeout=15, max=99 Connection: Keep-Alive Content-Type: text/html
Como se puede ver no hay Sample-Header: hello
encabezado en respuesta.
Aquí está el código simple que construirá encabezados de WebResourceResponse
de respuesta y agregará su encabezado personalizado a él:
webView.setWebViewClient(new WebViewClient() { private Map<String, String> convertResponseHeaders(Map<String, List<String>> headers) { Map<String, String> responseHeaders = new HashMap<>(); responseHeaders.put("Sample-Header", "hello"); for (Map.Entry<String, List<String>> item : headers.entrySet()) { List<String> values = new ArrayList<String>(); for (String headerVal : item.getValue()) { values.add(headerVal); } String value = StringUtil.join(values, ","); Log.e(TAG, "processRequest: " + item.getKey() + " : " + value); responseHeaders.put(item.getKey(), value); } return responseHeaders; } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { final String method = request.getMethod(); final String url = request.getUrl().toString(); Log.d(TAG, "processRequest: " + url + " method " + method); String ext = MimeTypeMap.getFileExtensionFromUrl(url); String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext); try { HttpURLConnection conn = (HttpURLConnection)new URL(url).openConnection(); conn.setRequestMethod(method); conn.setRequestProperty("Sample-Header", "hello"); conn.setDoInput(true); conn.setUseCaches(false); Map<String, String> responseHeaders = convertResponseHeaders(conn.getHeaderFields()); responseHeaders.put("Sample-Header", "hello"); return new WebResourceResponse( mime, conn.getContentEncoding(), conn.getResponseCode(), conn.getResponseMessage(), responseHeaders, conn.getInputStream() ); } catch (Exception e) { Log.e(TAG, "shouldInterceptRequest: " + e); } return null; } });
- Ios como el selector de fecha / hora para la plataforma android
- ¿Tiene Jellybean 4.2 la intención de conectarse a una VPN ya definida?