Je dois ajouter des en-têtes personnalisés à CHAQUE demande provenant de WebView. Je sais qu'il loadURL
a le paramètre pour extraHeaders
, mais ceux-ci ne sont appliqués qu'à la demande initiale. Toutes les demandes suivantes ne contiennent pas les en-têtes. J'ai regardé tous les remplacements dans WebViewClient
, mais rien ne permet d'ajouter des en-têtes aux demandes de ressources - onLoadResource(WebView view, String url)
. Toute aide serait merveilleuse.
Merci, Ray
Réponses:
Essayer
Pour ajouter des en-têtes aux demandes de chargement de ressources, créez un WebViewClient personnalisé et remplacez:
la source
view.loadUrl("http://www.facebook.com", extraHeaders)
, il y a plusieurs demandes de ressources telles'http://static.fb.com/images/logo.png'
que etc qui sont envoyées à partir de la vue Web. Pour ces demandes, les en-têtes supplémentaires ne sont pas ajoutés. Et shouldOverrideUrlLoading n'est pas appelé pendant de telles demandes de ressources. Le rappel «OnLoadResource» est appelé, mais il n'y a aucun moyen de définir des en-têtes à ce stade.WebViewClient.shouldInterceptRequest(android.webkit.WebView view, java.lang.String url)
Check out pour plus.shouldInterceptRequest
méthode, pouvez-vous expliquer comment?Vous devrez intercepter chaque requête à l'aide de WebViewClient.shouldInterceptRequest
À chaque interception, vous devrez prendre l'url, faire cette demande vous-même et renvoyer le flux de contenu:
Si votre cible API minimale est de niveau 21 , vous pouvez utiliser le nouveau shouldInterceptRequest qui vous donne des informations de requête supplémentaires (telles que des en-têtes) au lieu de simplement l'URL.
la source
public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)
plutôt pour en savoir plus iciPeut-être ma réponse assez tardive, mais elle couvre l'API ci - dessous et au dessus du niveau 21.
Pour ajouter des en-têtes, nous devons intercepter chaque requête et créer une nouvelle avec les en-têtes requis.
Nous devons donc remplacer méthode shouldInterceptRequest appelée dans les deux cas: 1. pour l'API jusqu'au niveau 21; 2. pour le niveau d'API 21+
Si le type de réponse doit être traité, vous pouvez changer
à
et ajouter une méthode
la source
Comme mentionné précédemment, vous pouvez le faire:
J'ai testé cela et avec un contrôleur MVC que j'ai étendu l'attribut d'autorisation pour inspecter l'en-tête et l'en-tête est là.
la source
Cela fonctionne pour moi:
Vous devez d'abord créer une méthode, qui retournera vos en-têtes que vous souhaitez ajouter à la requête:
Deuxièmement, vous devez créer WebViewClient:
Ajoutez WebViewClient à votre WebView:
J'espère que cela t'aides.
la source
loadUrl(String url, Map<String, String> additionalHttpHeaders)
signifie ajouter des enVous devriez pouvoir contrôler tous vos en-têtes en ignorant loadUrl et en écrivant votre propre loadPage à l'aide de HttpURLConnection de Java. Utilisez ensuite loadData de la vue Web pour afficher la réponse.
Il n'y a pas d'accès aux en-têtes fournis par Google. Ils sont dans un appel JNI, au plus profond de la source WebView.
la source
Voici une implémentation utilisant HttpUrlConnection:
Notez que cela ne fonctionne pas pour les requêtes POST car WebResourceRequest ne fournit pas de données POST. Il existe une bibliothèque Request Data - WebViewClient qui utilise une solution de contournement par injection JavaScript pour intercepter les données POST.
la source
Cela a fonctionné pour moi. Créez WebViewClient comme ci-dessous et définissez le client Web sur votre vue Web. J'ai dû utiliser webview.loadDataWithBaseURL car mes urls (dans mon contenu) n'avaient pas le baseurl mais seulement des URL relatives. Vous n'obtiendrez correctement l'URL que s'il y a un baseurl défini à l'aide de loadDataWithBaseURL.
la source
Vous pouvez utiliser ceci:
la source
Je suis tombé sur le même problème et je l'ai résolu.
Comme indiqué précédemment, vous devez créer votre WebViewClient personnalisé et remplacer la méthode shouldInterceptRequest.
Cette méthode doit émettre un webView.loadUrl tout en renvoyant un WebResourceResponse «vide».
Quelque chose comme ça:
la source
Utilisez ceci:
la source