Comment accéder aux en-têtes de réponse HTTP d'une page via JavaScript?
Lié à cette question , qui a été modifiée pour demander l'accès à deux en-têtes HTTP spécifiques.
Connexe:
Comment puis-je accéder aux champs d'en-tête de demande HTTP via JavaScript?
javascript
http
http-headers
keparo
la source
la source
Réponses:
Il n'est pas possible de lire les en-têtes actuels. Vous pouvez faire une autre demande à la même URL et lire ses en-têtes, mais rien ne garantit que les en-têtes sont exactement égaux à l'actuel.
Utilisez le code JavaScript suivant pour obtenir tous les en-têtes HTTP en effectuant une
get
demande:la source
Malheureusement, il n'y a pas d'API pour vous donner les en-têtes de réponse HTTP pour votre demande de page initiale. C'était la question originale affichée ici. Il a également été demandé à plusieurs reprises , car certaines personnes souhaiteraient obtenir les en-têtes de réponse réels de la demande de page d'origine sans en émettre un autre.
Pour les demandes AJAX:
Si une requête HTTP est effectuée sur AJAX, il est possible d'obtenir les en-têtes de réponse avec la
getAllResponseHeaders()
méthode. Cela fait partie de l'API XMLHttpRequest. Pour voir comment cela peut être appliqué, consultez lafetchSimilarHeaders()
fonction ci-dessous. Notez qu'il s'agit d'une solution de contournement au problème qui ne sera pas fiable pour certaines applications.L'API a été spécifiée dans la recommandation candidate suivante pour XMLHttpRequest: XMLHttpRequest - Recommandation candidate W3C 3 août 2010
Plus précisément, la
getAllResponseHeaders()
méthode a été spécifiée dans la section suivante: w3.orgXMLHttpRequest
:: lagetallresponseheaders()
méthodeLa documentation est bon MDN aussi: developer.mozilla.org:
XMLHttpRequest
.Cela ne vous donnera pas d'informations sur les en-têtes de réponse HTTP de la demande de page d'origine, mais cela pourrait être utilisé pour faire des suppositions éclairées sur ce que ces en-têtes étaient. Plus d'informations à ce sujet sont décrites ci-dessous.
Obtention des valeurs d'en-tête à partir de la demande de page initiale:
Cette question a été posée pour la première fois il y a plusieurs années, demandant spécifiquement comment obtenir les en-têtes de réponse HTTP d'origine pour la page actuelle (c'est-à-dire la même page à l'intérieur de laquelle le javascript était en cours d'exécution). C'est une question très différente de la simple obtention des en-têtes de réponse pour toute requête HTTP. Pour la demande de page initiale, les en-têtes ne sont pas facilement disponibles en javascript. Si les valeurs d'en-tête dont vous avez besoin seront fiables et suffisamment cohérentes si vous demandez à nouveau la même page via AJAX, cela dépendra de votre application particulière.
Voici quelques suggestions pour contourner ce problème.
1. Demandes de ressources largement statiques
Si la réponse est en grande partie statique et que les en-têtes ne devraient pas changer beaucoup entre les demandes, vous pouvez faire une demande AJAX pour la même page sur laquelle vous êtes actuellement et supposer que ce sont les mêmes valeurs qui faisaient partie des pages. Réponse HTTP. Cela pourrait vous permettre d'accéder aux en-têtes dont vous avez besoin en utilisant la belle API XMLHttpRequest décrite ci-dessus.
Cette approche sera problématique si vous devez vraiment vous fier aux valeurs cohérentes entre les demandes, car vous ne pouvez pas garantir qu'elles sont identiques. Cela dépendra de votre application spécifique et si vous savez que la valeur dont vous avez besoin est quelque chose qui ne changera pas d'une demande à l'autre.
2. Faire des inférences
Il existe certaines propriétés de nomenclature (Browser Object Model) que le navigateur détermine en regardant les en-têtes. Certaines de ces propriétés reflètent directement les en-têtes HTTP (par exemple,
navigator.userAgent
sont définies sur la valeur duUser-Agent
champ d'en-tête HTTP ). En reniflant les propriétés disponibles, vous pourrez peut-être trouver ce dont vous avez besoin, ou quelques indices pour indiquer le contenu de la réponse HTTP.3. Cachez-les
Si vous contrôlez le côté serveur, vous pouvez accéder à tout en-tête que vous aimez pendant que vous construisez la réponse complète. Les valeurs peuvent être transmises au client avec la page, stockées dans un balisage ou peut-être dans une structure JSON intégrée. Si vous souhaitez que chaque en-tête de requête HTTP soit disponible pour votre javascript, vous pouvez les parcourir sur le serveur et les renvoyer en tant que valeurs masquées dans le balisage. Ce n'est probablement pas idéal pour envoyer des valeurs d'en-tête de cette façon, mais vous pouvez certainement le faire pour la valeur spécifique dont vous avez besoin. Cette solution est sans doute inefficace aussi, mais elle ferait l'affaire si vous en aviez besoin.
la source
À l'aide de,
XmlHttpRequest
vous pouvez afficher la page en cours, puis examiner les en-têtes http de la réponse.Le meilleur cas est de simplement faire une
HEAD
demande, puis d'examiner les en-têtes.Pour quelques exemples de cela, consultez http://www.jibbering.com/2002/4/httprequest.html
Juste mes 2 cents.
la source
Une solution avec Service Workers
Les employés de service peuvent accéder aux informations du réseau, y compris les en-têtes. La bonne partie est qu'il fonctionne sur tout type de demande, pas seulement sur XMLHttpRequest.
Comment ça fonctionne:
fetch
demande au travailleur du service avec larespondWith
fonction.postMessage
fonction.Exemple de travail:
Les employés de service sont un peu compliqués à comprendre, j'ai donc construit une petite bibliothèque qui fait tout cela. Il est disponible sur github: https://github.com/gmetais/sw-get-headers .
Limites:
la source
Pour ceux qui recherchent un moyen d'analyser tous les en-têtes HTTP dans un objet accessible en tant que dictionnaire
headers["content-type"]
, j'ai créé une fonctionparseHttpHeaders
:la source
Une autre façon d'envoyer des informations d'en-tête à JavaScript serait d'utiliser des cookies. Le serveur peut extraire toutes les données dont il a besoin des en-têtes de demande et les renvoyer dans un en-
Set-Cookie
tête de réponse - et les cookies peuvent être lus en JavaScript. Comme le dit keparo, il est préférable de le faire pour un ou deux en-têtes plutôt que pour tous.la source
Si nous parlons d'en- têtes de demande , vous pouvez créer vos propres en-têtes lors de l'exécution de XmlHttpRequests.
la source
Vous ne pouvez pas accéder aux en-têtes http, mais certaines des informations qui y sont fournies sont disponibles dans le DOM. Par exemple, si vous souhaitez voir le référent http (sic), utilisez document.referrer. Il peut y en avoir d'autres pour d'autres en-têtes http. Essayez de googler la chose spécifique que vous voulez, comme "http referer javascript".
Je sais que cela devrait être évident, mais j'ai continué à chercher des trucs comme "http headers javascript" alors que tout ce que je voulais était le référent, et je n'ai pas obtenu de résultats utiles. Je ne sais pas comment je n'ai pas réalisé que je pouvais faire une requête plus spécifique.
la source
Comme beaucoup de gens, j'ai creusé le filet sans vraie réponse :(
J'ai néanmoins découvert un contournement qui pourrait aider les autres. Dans mon cas, je contrôle entièrement mon serveur Web. En fait, cela fait partie de ma candidature (voir référence de fin). Il m'est facile d'ajouter un script à ma réponse http. J'ai modifié mon serveur httpd pour injecter un petit script dans toutes les pages html. Je ne pousse qu'une ligne de «script js» supplémentaire juste après ma construction d'en-tête, qui définit une variable existante de mon document dans mon navigateur [je choisis l'emplacement], mais toute autre option est possible. Bien que mon serveur soit écrit en nodejs, je ne doute pas que la même technique puisse être utilisée à partir de PHP ou d'autres.
Maintenant, toutes les pages html chargées depuis mon serveur, ont ce script exécuté par le navigateur à la réception. Je peux ensuite facilement vérifier à partir de JavaScript si la variable existe ou non. Dans mon cas d'utilisation, je dois savoir si je dois utiliser le profil JSON ou JSON-P pour éviter le problème CORS, mais la même technique peut être utilisée à d'autres fins [par exemple: choisir entre le serveur de développement / production, obtenir du serveur un REST / API clé, etc ....]
Sur le navigateur, il vous suffit de vérifier la variable directement à partir de JavaScript comme dans mon exemple, où je l'utilise pour sélectionner mon profil Json / JQuery
Pour qui souhaite vérifier mon code: https://www.npmjs.org/package/gpsdtracking
la source
En utilisant mootools, vous pouvez utiliser this.xhr.getAllResponseHeaders ()
la source
Je viens de tester, et cela fonctionne pour moi en utilisant Chrome Version 28.0.1500.95.
J'avais besoin de télécharger un fichier et de lire le nom du fichier. Le nom du fichier est dans l'en-tête, j'ai donc fait ce qui suit:
Production:
la source
Voici mon script pour obtenir tous les en-têtes de réponse:
Ayant comme résultat les en-têtes de réponse.
Il s'agit d'un test de comparaison utilisant Hurl.it:
la source
Pour obtenir les en-têtes comme un objet plus pratique (amélioration de la réponse de Raja ):
la source
Le lien d'Allain Lalonde a fait ma journée. Ajout d'un simple code html fonctionnel ici.
Fonctionne avec n'importe quel navigateur raisonnable depuis des âges plus IE9 + et Presto-Opera 12.
Remarque: Vous obtenez des en-têtes d'une deuxième demande, le résultat peut différer de la demande initiale.
Une autre façon
est l'
fetch()
API plus modernehttps://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch
Per caniuse.com prise en charge par Firefox 40, Chrome 42, Edge 14, Safari 11
Exemple de travail code:
la source
C'est une vieille question. Je ne sais pas quand le soutien est devenu plus large, mais
getAllResponseHeaders()
etgetResponseHeader()
semble être maintenant assez standard: http://www.w3schools.com/xml/dom_http.aspla source
Comme cela a déjà été mentionné, si vous contrôlez le côté serveur, il devrait être possible de renvoyer les en-têtes de demande initiaux au client dans la réponse initiale.
Dans Express, par exemple, les travaux suivants:
app.get('/somepage', (req, res) => { res.render('somepage.hbs', {headers: req.headers}); })
Les en-têtes sont ensuite disponibles dans le modèle, ils peuvent donc être masqués visuellement mais inclus dans le balisage et lus par javascript côté client.la source
Je pense que la question a mal tourné.Si vous souhaitez prendre l'en-tête Request de JQuery / JavaScript, la réponse est simplement non. Les autres solutions sont de créer une page aspx ou une page jsp, nous pouvons facilement accéder à l'en-tête de la demande. Prenez toute la demande dans la page aspx et placez dans une session / cookies alors vous pouvez accéder aux cookies dans la page JavaScript.
la source