Acceso a los encabezados de respuesta http en un WebView?

¿Hay una 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 hacer eso, 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 puedes hacer (es muy loco, sin embargo :).

Inspirado en la respuesta de Cristian que necesitaba para interceptar las llamadas de AJAX que webview está haciendo, donde necesitaba interceptar encabezados de respuesta para obtener alguna información (recuento de artículos de carro en la aplicación de comercio electrónico), que necesitaba aprovechar en la aplicación. Como la aplicación está usando okhttp he terminado 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<String,String> responseHeaders = new HashMap<String,String>(); 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 puede ser útil para otros y si alguien tiene una sugerencia de mejora estaría agradecido. Desafortunadamente es compatible solamente con LOLLIPOP y más alto que a partir de esta versión que usted puede tener acceso / vuelve los encabezamientos usando WebResourceRequest , que era necesario para mi caso.

Usted debe ser capaz de controlar todos sus encabezados saltando loadUrl y escribiendo su propio loadPage usando HttpURLConnection de Java. A continuación, vea los encabezados, haga lo suyo y utilice el loadData de la webview para mostrar la respuesta.

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

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", por lo que todo lo que hago es obtener el título de webview en la función y, a continuación, el título.

View.getTitle ()

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.