Ajouter des en-têtes personnalisés aux requêtes de ressources WebView – Android

Je dois append des en-têtes personnalisés à chaque demande provenant de WebView. Je sais que loadURL a le paramètre pour extraHeaders , mais ceux-ci ne sont appliqués qu’à la demande initiale. Toutes les requêtes suivantes ne contiennent pas les en-têtes. J’ai examiné tous les remplacements dans WebViewClient , mais rien ne permet d’append des en-têtes aux requêtes de ressources – onLoadResource(WebView view, Ssortingng url) . Toute aide serait merveilleuse.

Merci, Ray

Essayer

 loadUrl(Ssortingng url, Map extraHeaders) 

Pour append des en-têtes aux ressources chargeant les demandes, personnalisez WebViewClient et remplacez:

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

Vous devrez intercepter chaque requête à l’aide de WebViewClient.shouldInterceptRequest

A chaque interception, vous devrez prendre l’URL, faire cette demande vous-même et renvoyer le stream de contenu:

 WebViewClient wvc = new WebViewClient() { @Override public WebResourceResponse shouldInterceptRequest(WebView view, Ssortingng 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(); Ssortingng contentTypeValue = null; Ssortingng 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 votre cible API minimale est le niveau 21 , vous pouvez utiliser le nouveau shouldInterceptRequest qui vous donne des informations de demande supplémentaires (telles que les en-têtes) au lieu de simplement l’URL.

Peut-être ma réponse assez tard, mais elle couvre les API au- dessous et audessus du niveau 21.

Pour append des en-têtes, nous devons intercepter chaque requête et en créer une nouvelle avec les en-têtes requirejs.

Nous devons donc remplacer la méthode shouldInterceptRequest appelée dans les deux cas: 1. pour API jusqu’au niveau 21; 2. pour le niveau API 21+

  webView.setWebViewClient(new WebViewClient() { // Handle API until level 21 @SuppressWarnings("deprecation") @Override public WebResourceResponse shouldInterceptRequest(WebView view, Ssortingng url) { return getNewResponse(url); } // Handle API 21+ @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { Ssortingng url = request.getUrl().toSsortingng(); return getNewResponse(url); } private WebResourceResponse getNewResponse(Ssortingng url) { try { OkHttpClient httpClient = new OkHttpClient(); Request request = new Request.Builder() .url(url.sortingm()) .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 le type de réponse doit être traité, vous pouvez changer

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

à

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

et append une méthode

  private Ssortingng getMimeType(Ssortingng url) { Ssortingng type = null; Ssortingng 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; } 

Comme mentionné précédemment, vous pouvez le faire:

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

J’ai testé ceci et avec un contrôleur MVC que j’ai étendu l’atsortingbut Authorize pour inspecter l’en-tête et que l’en-tête est là.

Cela fonctionne pour moi:

  1. Tout d’abord, vous devez créer une méthode, qui retournera vos en-têtes à append à la requête:

     private Map getCustomHeaders() { Map headers = new HashMap<>(); headers.put("YOURHEADER", "VALUE"); return headers; } 
  2. Deuxièmement, vous devez créer WebViewClient:

     private WebViewClient getWebViewClient() { return new WebViewClient() { @Override @TargetApi(Build.VERSION_CODES.LOLLIPOP) public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { view.loadUrl(request.getUrl().toSsortingng(), getCustomHeaders()); return true; } @Override public boolean shouldOverrideUrlLoading(WebView view, Ssortingng url) { view.loadUrl(url, getCustomHeaders()); return true; } }; } 
  3. Ajoutez WebViewClient à votre WebView:

     webView.setWebViewClient(getWebViewClient()); 

J’espère que cela t’aides.

Vous devriez pouvoir contrôler tous vos en-têtes en ignorant loadUrl et en écrivant votre propre loadPage en utilisant HttpURLConnection de Java. Ensuite, utilisez le loadData de la vue Web pour afficher la réponse.

Il n’y a pas d’access aux en-têtes fournis par Google. Ils sont dans un appel JNI, profondément dans la source WebView.

Cela a fonctionné pour moi. Créez WebViewClient comme ci-dessous et définissez le WebClient sur votre site Web. J’ai dû utiliser webview.loadDataWithBaseURL car mes URL (dans mon contenu) n’avaient pas les URL baseurl mais seulement relatives. Vous obtiendrez l’URL correctement uniquement lorsqu’il existe un ensemble baseur à l’aide de loadDataWithBaseURL.

 public WebViewClient getWebViewClientWithCustomHeader(){ return new WebViewClient() { @Override public WebResourceResponse shouldInterceptRequest(WebView view, Ssortingng url) { try { OkHttpClient httpClient = new OkHttpClient(); com.squareup.okhttp.Request request = new com.squareup.okhttp.Request.Builder() .url(url.sortingm()) .addHeader("", "") .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; } } }; } 

Je suis tombé sur le même problème et résolu.

Comme indiqué précédemment, vous devez créer votre WebViewClient personnalisé et remplacer la méthode shouldInterceptRequest.

 WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) 

Cette méthode doit émettre un fichier webView.loadUrl lors du retour d’un “WebResourceResponse” vide.

Quelque chose comme ça:

 @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 customHeaders = new HashMap(); customHeaders.put("Your Header","Your Header Value"); view.loadUrl(url, customHeaders); return new WebResourceResponse("", "", null); } 

Page: MainActivity.java

import android.webkit.WebView;

la classe publique MainActivity étend AppCompatActivity {

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); WebView WebViw = (WebView) findViewById(R.id.webView1); WebViw.getSettings().setJavaScriptEnabled(true); WebViw.getSettings().setUserAgentSsortingng("User-Agent"); WebViw.loadUrl("http://www.educationlife-online.com/"); } 

}

cette voie est le succès.

Vous pouvez utiliser ceci:

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

Utilisez ceci:

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