studio example codigo based app java android webkit android-webview

java - example - webview android studio 2018



Agregue encabezados personalizados a las solicitudes de recursos de WebView-Android (10)

Como se mencionó anteriormente, puede hacer esto:

WebView host = (WebView)this.findViewById(R.id.webView); String url = "<yoururladdress>"; Map <String, String> extraHeaders = new HashMap<String, String>(); extraHeaders.put("Authorization","Bearer"); host.loadUrl(url,extraHeaders);

Probé esto y lo otro con un Controlador MVC que extendí el Atributo Autorizado para inspeccionar el encabezado y el encabezado estaba allí.

Necesito agregar encabezados personalizados a CADA solicitud proveniente de WebView. Sé que loadURL tiene el parámetro para extraHeaders , pero esos solo se aplican a la solicitud inicial. Todas las solicitudes posteriores no contienen los encabezados. He examinado todas las anulaciones en WebViewClient , pero nada permite agregar encabezados a las solicitudes de recursos: onLoadResource(WebView view, String url) . Cualquier ayuda sería maravillosa.

Gracias, Ray


Deberá interceptar cada solicitud utilizando WebViewClient.shouldInterceptRequest

Con cada intercepción, deberá tomar la url, realizar esta solicitud usted mismo y devolver la secuencia de contenido:

WebViewClient wvc = new WebViewClient() { @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { try { DefaultHttpClient client = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url); httpGet.setHeader("MY-CUSTOM-HEADER", "header value"); httpGet.setHeader(HttpHeaders.USER_AGENT, "custom user-agent"); HttpResponse httpReponse = client.execute(httpGet); Header contentType = httpReponse.getEntity().getContentType(); Header encoding = httpReponse.getEntity().getContentEncoding(); InputStream responseInputStream = httpReponse.getEntity().getContent(); String contentTypeValue = null; String encodingValue = null; if (contentType != null) { contentTypeValue = contentType.getValue(); } if (encoding != null) { encodingValue = encoding.getValue(); } return new WebResourceResponse(contentTypeValue, encodingValue, responseInputStream); } catch (ClientProtocolException e) { //return null to tell WebView we failed to fetch it WebView should try again. return null; } catch (IOException e) { //return null to tell WebView we failed to fetch it WebView should try again. return null; } } } Webview wv = new WebView(this); wv.setWebViewClient(wvc);

Si su objetivo de API mínimo es el nivel 21 , puede usar el nuevo shouldInterceptRequest que le brinda información de solicitud adicional (como encabezados) en lugar de solo la URL.


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

No hay acceso a los encabezados que proporciona Google. Están en una llamada JNI, en lo profundo de la fuente WebView.


Encontré el mismo problema y lo resolví.

Como dije antes, necesita crear su WebViewClient personalizado y anular el método shouldInterceptRequest.

WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request)

Ese método debería emitir un webView.loadUrl mientras devuelve un WebResourceResponse "vacío".

Algo como esto:

@Override public boolean shouldInterceptRequest(WebView view, WebResourceRequest request) { // Check for "recursive request" (are yor header set?) if (request.getRequestHeaders().containsKey("Your Header")) return null; // Add here your headers (could be good to import original request header here!!!) Map<String, String> customHeaders = new HashMap<String, String>(); customHeaders.put("Your Header","Your Header Value"); view.loadUrl(url, customHeaders); return new WebResourceResponse("", "", null); }


Esto funcionó para mí. Cree WebViewClient de la siguiente manera y configure el cliente web en su vista web. Tuve que usar webview.loadDataWithBaseURL ya que mis direcciones URL (en mi contenido) no tenían la URL básica, sino solo direcciones URL relativas. Obtendrá la url correctamente solo cuando haya un conjunto baseurl usando loadDataWithBaseURL.

public WebViewClient getWebViewClientWithCustomHeader(){ return new WebViewClient() { @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { try { OkHttpClient httpClient = new OkHttpClient(); com.squareup.okhttp.Request request = new com.squareup.okhttp.Request.Builder() .url(url.trim()) .addHeader("<your-custom-header-name>", "<your-custom-header-value>") .build(); com.squareup.okhttp.Response response = httpClient.newCall(request).execute(); return new WebResourceResponse( response.header("content-type", response.body().contentType().type()), // You can set something other as default content-type response.header("content-encoding", "utf-8"), // Again, you can set another encoding as default response.body().byteStream() ); } catch (ClientProtocolException e) { //return null to tell WebView we failed to fetch it WebView should try again. return null; } catch (IOException e) { //return null to tell WebView we failed to fetch it WebView should try again. return null; } } }; }


Esto funciona para mí:

  1. Primero debe crear el método, que le devolverá los encabezados que desea agregar para solicitar:

    private Map<String, String> getCustomHeaders() { Map<String, String> headers = new HashMap<>(); headers.put("YOURHEADER", "VALUE"); return headers; }

  2. En segundo lugar, necesita crear WebViewClient:

    private WebViewClient getWebViewClient() { return new WebViewClient() { @Override @TargetApi(Build.VERSION_CODES.LOLLIPOP) public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { view.loadUrl(request.getUrl().toString(), getCustomHeaders()); return true; } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url, getCustomHeaders()); return true; } }; }

  3. Agregue WebViewClient a su WebView:

    webView.setWebViewClient(getWebViewClient());

Espero que esto ayude.


Puedes usar esto:

@Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // Here put your code Map<String, String> map = new HashMap<String, String>(); map.put("Content-Type","application/json"); view.loadUrl(url, map); return false; }


Tal vez mi respuesta es bastante tarde, pero cubre API por debajo y por encima del nivel 21.

Para agregar encabezados, debemos interceptar cada solicitud y crear una nueva con los encabezados requeridos.

Por lo tanto, debemos anular el método shouldInterceptRequest llamado en ambos casos: 1. para API hasta el nivel 21; 2. para nivel de API 21+

webView.setWebViewClient(new WebViewClient() { // Handle API until level 21 @SuppressWarnings("deprecation") @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { return getNewResponse(url); } // Handle API 21+ @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { String url = request.getUrl().toString(); return getNewResponse(url); } private WebResourceResponse getNewResponse(String url) { try { OkHttpClient httpClient = new OkHttpClient(); Request request = new Request.Builder() .url(url.trim()) .addHeader("Authorization", "YOU_AUTH_KEY") // Example header .addHeader("api-key", "YOUR_API_KEY") // Example header .build(); Response response = httpClient.newCall(request).execute(); return new WebResourceResponse( null, response.header("content-encoding", "utf-8"), response.body().byteStream() ); } catch (Exception e) { return null; } } });

Si el tipo de respuesta se procesara, podría cambiar

return new WebResourceResponse( null, // <- Change here response.header("content-encoding", "utf-8"), response.body().byteStream() );

a

return new WebResourceResponse( getMimeType(url), // <- Change here response.header("content-encoding", "utf-8"), response.body().byteStream() );

y agregar método

private String getMimeType(String url) { String type = null; String extension = MimeTypeMap.getFileExtensionFromUrl(url); if (extension != null) { switch (extension) { case "js": return "text/javascript"; case "woff": return "application/font-woff"; case "woff2": return "application/font-woff2"; case "ttf": return "application/x-font-ttf"; case "eot": return "application/vnd.ms-fontobject"; case "svg": return "image/svg+xml"; } type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); } return type; }


Tratar

loadUrl(String url, Map<String, String> extraHeaders)

Para agregar encabezados a las solicitudes de carga de recursos, cree WebViewClient personalizado y anule:

API 24+: WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) or WebResourceResponse shouldInterceptRequest(WebView view, String url)


Utilizar esta:

webView.getSettings().setUserAgentString("User-Agent");