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
- Cómo cargar cadena html en una vista web?
- Prestación de HTML en un WebView con CSS personalizado
- Superposición azul de OnClick
- ¿Cómo abrir la página HTML local en el navegador androide nativo (no en la vista web)?
- WebSocket en Android WebView
@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.
- Android: "onBackPressed" sólo se llama desde la primera página de Cordova 3 webview, no se puede anular desde páginas interiores
- Android webview html cumplimiento?
- ¿Existe una alternativa a NestedScrollView para su uso con un WebView?
- Proguard rompe Android WebView, ¿Por qué?
- ¿Cómo puedo desplazar un WebView a un punto específico en Android
- El video de YouTube no se abre en webView
- Cómo incrustar una fuente personalizada en la aplicación de Android (WebView)
- Escáner de código de barras ZXing para Webapps
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?