¿Tiene acceso a los encabezados de respuesta http en WebView?

¿Hay alguna manera de ver los encabezados de respuesta http en una actividad una vez que se ha cargado una página web en un WebView? Parece que esto debería ser posible, pero no puedo encontrar ningún método que exponga los encabezados.

Ni WebView ni WebViewClient proporcionan métodos para hacerlo, aunque puede intentar implementarlo manualmente. Puedes hacer algo como esto:

 private WebView webview; public void onCreate(Bundle icicle){ // bla bla bla // here you initialize your webview webview = new WebView(this); webview.setWebViewClient(new YourWebClient()); } // this will be the webclient that will manage the webview private class YourWebClient extends WebViewClient{ // you want to catch when an URL is going to be loaded public boolean shouldOverrideUrlLoading (WebView view, String urlConection){ // here you will use the url to access the headers. // in this case, the Content-Length one URL url; URLConnection conexion; try { url = new URL(urlConection); conexion = url.openConnection(); conexion.setConnectTimeout(3000); conexion.connect(); // get the size of the file which is in the header of the request int size = conexion.getContentLength(); } // and here, if you want, you can load the page normally String htmlContent = ""; HttpGet httpGet = new HttpGet(urlConection); // this receives the response HttpResponse response; try { response = httpClient.execute(httpGet); if (response.getStatusLine().getStatusCode() == 200) { // la conexion fue establecida, obtener el contenido HttpEntity entity = response.getEntity(); if (entity != null) { InputStream inputStream = entity.getContent(); htmlContent = convertToString(inputStream); } } } catch (Exception e) {} webview.loadData(htmlContent, "text/html", "utf-8"); return true; } public String convertToString(InputStream inputStream){ StringBuffer string = new StringBuffer(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line; try { while ((line = reader.readLine()) != null) { string.append(linea + "\n"); } } catch (IOException e) {} return string.toString(); } } 

No puedo probarlo ahora, pero eso es básicamente lo que podrías hacer (aunque es muy loco :).

Inspirado por la respuesta de Cristian , necesitaba interceptar las llamadas AJAX que está haciendo webview, donde necesitaba interceptar encabezados de respuesta para obtener cierta información (recuento de elementos del carrito en la aplicación de comercio electrónico), que necesitaba aprovechar en la aplicación. Como la aplicación está usando okhttp, terminé haciendo esto y está funcionando :

  @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { Log.i(TAG,"shouldInterceptRequest path:"+request.getUrl().getPath()); WebResourceResponse returnResponse = null; if (request.getUrl().getPath().startsWith("/cart")) { // only interested in /cart requests returnResponse = super.shouldInterceptRequest(view, request); Log.i(TAG,"cart AJAX call - doing okRequest"); Request okRequest = new Request.Builder() .url(request.getUrl().toString()) .post(null) .build(); try { Response okResponse = app.getOkHttpClient().newCall(okRequest).execute(); if (okResponse!=null) { int statusCode = okResponse.code(); String encoding = "UTF-8"; String mimeType = "application/json"; String reasonPhrase = "OK"; Map responseHeaders = new HashMap(); if (okResponse.headers()!=null) { if (okResponse.headers().size()>0) { for (int i = 0; i < okResponse.headers().size(); i++) { String key = okResponse.headers().name(i); String value = okResponse.headers().value(i); responseHeaders.put(key, value); if (key.toLowerCase().contains("x-cart-itemcount")) { Log.i(TAG,"setting cart item count"); app.setCartItemsCount(Integer.parseInt(value)); } } } } InputStream data = new ByteArrayInputStream(okResponse.body().string().getBytes(StandardCharsets.UTF_8)); Log.i(TAG, "okResponse code:" + okResponse.code()); returnResponse = new WebResourceResponse(mimeType,encoding,statusCode,reasonPhrase,responseHeaders,data); } else { Log.w(TAG,"okResponse fail"); } } catch (IOException e) { e.printStackTrace(); } } return returnResponse; } 

Espero que esto pueda ser útil para otros y si alguien tiene sugerencias para mejorar, le agradecería. Desafortunadamente, solo es compatible con LOLLIPOP y superior, ya que desde esta versión puede acceder / devolver encabezados utilizando WebResourceRequest , que era necesario para mi caso.

Debería poder controlar todos sus encabezados omitiendo loadUrl y escribiendo su propia página de carga usando HttpURLConnection de Java. Luego vea los encabezados, haga lo suyo, y use loadData de la página web para mostrar la respuesta.

Como la respuesta aceptada solo funcionará con HttpGet, aquí hay un truco que estoy usando actualmente (en este momento parece funcionar)

En el controlador onPageFinished, si hay un error, el título de la página será como “ERROR_NUM – ERROR_DESCRIPTION”, como “500 – Internal Server Error”, así que lo único que hago es obtener el título de la vista web en la función y luego verificar el título.

view.getTitle ()