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

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

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; } }); 
  • WebView oculta el teclado virtual durante loadUrl (), lo que significa que un teclado no puede permanecer abierto mientras llama a javascript
  • Android WebView con caracteres UTF-8 ilegibles.
  • OnRecivedError no muestra la página de error personalizada
  • Android: mantenimiento de la API SCORM entre dos webviews
  • Configuración correcta de AppCache para Android WebView
  • Cómo cargar cadena html en una vista web?
  • Inyección de Javascript en la vista web
  • Android y Jsoup
  • Phonegap Media API (Android) - El soporte no está definido
  • Cómo obtener el url de la página actual desde la vista web en android
  • problema de base de datos de acceso a HTML5 WebView HTML
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.