Si un en-tĂȘte a Ă©tĂ© dĂ©fini par dĂ©faut, il ne semble pas y avoir de moyen de l'ignorer sur une demande individuelle. Le rĂ©glage de null
ou undefined
ne fait rien.
Pourriez-vous fournir un exemple de code qui montre ce comportement ? Quel en-tĂȘte par dĂ©faut essayez-vous de supprimer ?
Si je définis axios.defaults.headers.common['Content-Type'] = 'application/json'
, je ne peux pas supprimer cet en-tĂȘte pour une demande individuelle, je ne peux que le dĂ©finir sur une autre valeur.
Comment avez-vous essayĂ© de supprimer l'en-tĂȘte ? Utiliser quelque chose comme ça ?
axios.request('/path', {
headers: {
'Content-Type': null
}
});
Oui. Cela n'a pas fonctionné
Désolé, j'ai raté le method
dans mon exemple. Cela aurait-il pu ĂȘtre ce qui l'a empĂȘchĂ© de fonctionner ?
J'ai également essayé de définir la méthode. Je soupçonne que cela a à voir avec un Object.assign()
quelque part sans faire attention Ă la undefined
.
@tyrsius quelle version d'axios utilisez-vous ? Je viens d'Ă©crire un test pour essayer de reproduire cela et il a rĂ©ussi. Je me demande si cela a pu ĂȘtre corrigĂ© dans une nouvelle version.
Pour info voici mon test :
it('should remove default headers when config indicates', function (done) {
var instance = axios.create();
instance.defaults.headers.common['Content-Type'] = 'application/json';
instance.post('/foo/bar/', {
firstName: 'foo',
lastName: 'bar'
}, {
headers: {
'Content-Type': null
}
});
getAjaxRequest().then(function (request) {
testHeaderValue(request.requestHeaders, 'Content-Type', null);
done();
});
});
J'ai eu ce problĂšme Ă©galement.
J'essaie de supprimer l'en-tĂȘte 'Authorization' de 'common' mais le seul moyen que j'ai trouvĂ© pour le faire fonctionner est de supprimer la propriĂ©tĂ© de axios.defaults.header, de faire la demande, puis de rajouter la propriĂ©tĂ© encore.
Ce sera plus facile quand ce bug sera corrigé
C'est Ă©galement un problĂšme pour moi (avec axios v0.14.0), en particulier pour les points de terminaison qui utilisent Access-Control-Allow-Headers
, auquel cas je dois m'assurer que certains en-tĂȘtes ne sont pas du tout envoyĂ©s avec la demande.
j'utilise la version 15.2 et quand je le fais
headers: {
'Content-Type': null
}
il dĂ©finit la valeur de l'en-tĂȘte sur null. mais j'ai vraiment besoin que le nom de l'en-tĂȘte soit complĂštement supprimĂ©.
par exemple, lors de l'utilisation de s3 et de la gĂ©nĂ©ration d'une URL prĂ©signĂ©e pour publier un fichier dans un compartiment, vous ne pouvez pas avoir d'en-tĂȘte Authenticate. mais j'ai une autorisation par dĂ©faut dĂ©finie car la grande majoritĂ© de mes demandes l'exigent pour ma propre API.
la façon dont j'ai contourné cela est de faire ce qui suit
var instance = axios.create();
instance.defaults.headers.common = {};
instance.put(signedUrl, file, {headers: {'Content-Type': file.type}})
.then(function (result) {
console.log(result);
})
.catch(function (err) {
console.log(err);
});
Edit : cela ne fonctionne pas comme prĂ©vu. le problĂšme est que lorsque vous effacez les en-tĂȘtes
instance.defaults.headers.common = {};
il le supprime au niveau mondial. cela me dĂ©connectera car j'utilise un en-tĂȘte pour Auth.
pour contourner ce problĂšme jusqu'Ă ce qu'il y ait une meilleure façon de gĂ©rer la configuration globale, je transmets les en-tĂȘtes requis Ă chaque appel, ce qui n'est pas idĂ©al.
J'ai eu le mĂȘme problĂšme mais rĂ©solu avec
delete axios.defaults.headers.common["Authorization"]; // or which ever header you have to remove
J'ai la situation exacte en tant que @SepiaGroup
J'ai essayé de l'écraser avec null
et ''
mais AWS voit alors null
comme mon autorisation et se plaint.
J'ai essayé de le supprimer de l'instance, mais mon autorisation est supprimée globalement, j'obtiens donc 403 sur mon propre serveur.
Je suppose que ma solution de contournement sera d'utiliser un vieux XHR
pour cela mais cela me rend triste :(
+1 Ăgalement bloquĂ© dans l'impossibilitĂ© d'effacer l'en-tĂȘte par dĂ©faut pour un appel spĂ©cifique.
+1
+1
Je constate Ă©galement ce comportement dans la derniĂšre version (0.16.2). La tristesse s'ensuit :(
il suffit de le supprimer
delete instance.defaults.headers.common.Authorization
````
the way below is not working.
----
I think we could create a logout method that recreate the axios instance to replace the old one.
let instance = axios.create({options})
fonction : déconnexion () {
instance = axios.create({options})
}
```
@lzp4ever cela fonctionnerait dans la plupart des cas, je suppose. Mais dans les cas oĂč quelqu'un a ajoutĂ© des intercepteurs de demande et de rĂ©ponse, ou fait plus de configuration de l'instance au-delĂ de la simple transmission d'options de configuration, votre approche n'exigerait-elle pas que tout cela soit refait ?
Je me demandais simplement si la solution de @axelgenus est plus propre et nĂ©cessite moins de "rĂ©initialisation" d'une instance Axios entiĂšre Ă partir de laquelle vous essayez de supprimer un en-tĂȘte personnalisĂ© particulier.
Ce serait bien de ne PAS envoyer l'en-tĂȘte par dĂ©faut sans supprimer les propriĂ©tĂ©s :)
+1
+1
+1. Il semble triste que vous ne puissiez pas supprimer les en-tĂȘtes d'une instance. Cela signifie que toutes les instances ont une rĂ©fĂ©rence Ă la variable globale.
+1
+1
+1 Veuillez résoudre ce problÚme.
+1
+1
+1
Nous rencontrons le mĂȘme problĂšme. La plupart des applications frontales que nous crĂ©ons doivent utiliser plusieurs services Web Rest. L'impossibilitĂ© de dĂ©sactiver l'en-tĂȘte de sĂ©curitĂ© est un gros problĂšme pour nous.
+1
+1
Essayez ces gars sur un objet de demande spĂ©cifique, avec des en-tĂȘtes, des donnĂ©es et une mĂ©thode :
transformRequest(data, headers) {
delete headers.common.Authorization;
return data;
}
Essayez ceci, cela résout mon problÚme :
supprimer axios.defaults.headers.common["Autorisation"] ; // et crĂ©ez vos propres en-tĂȘtes
@mukeshyadav Cette solution a été mentionnée plusieurs fois plus haut dans ce fil.
Le point soulevĂ© est que ce n'est pas nĂ©cessairement la solution idĂ©ale. Imaginez un scĂ©nario dans lequel vous avez ajoutĂ© vos propres intercepteurs de requĂȘte/rĂ©ponse personnalisĂ©s Ă une instance Axios, mais vous souhaitez qu'une requĂȘte spĂ©cifique n'inclue pas les en-tĂȘtes utilisĂ©s partout ailleurs, vous devrez supprimer le ou les en-tĂȘtes et les rajouter aprĂšs la demande est terminĂ©e.
à l'inverse, se demander s'il existe un moyen de dupliquer simplement une instance Axios avec une relative facilité à utiliser dans ces types de cas ponctuels.
+1
transformRequest: [(data, headers) => {
delete headers.common.Authorization
return data
}]
travaille pour moi
@aaronatmycujoo Cela semble ĂȘtre la solution la plus sexy ici. Cependant, je me demande si la suppression de l'en-tĂȘte comme celle-ci le supprime d'une instance Axios plus haut dans la chaĂźne. Vous devrez peut-ĂȘtre crĂ©er une copie complĂšte de headers
ou quelque chose du genre.
Faudra que je teste ça.
d'aprÚs ce que je peux dire, ce n'est pas le cas. bien qu'il puisse y avoir un cas limite que je ne déclenche pas
@SepiaGroup, vous n'avez pas besoin d'ajouter des en-tĂȘtes dans l'ensemble de vos demandes... Faites ceci :
axios.defaults.headers.common = {};
axios.defaults.headers.common.accept = âapplication/jsonâ;
Et dans les en-tĂȘtes de demande, vous ne verrez que 'application/json'
+1 merci @axelgenus votre solution a fonctionné
+1
@aaronatmycujoo FTW !!! Sa solution a fonctionné comme un charme... ty !
ConfrontĂ© au mĂȘme problĂšme lors de la tentative de tĂ©lĂ©chargement de fichiers sur S3 (n'autoriser qu'un seul mĂ©canisme d'authentification).
J'ai essayé la solution de
@aaronatmycujoo Cette solution fonctionne parfaitement pour moi ! ??
Merci les gars d'avoir sauvé ma journée!
+1
+1
+1
axios.defaults.headers.common = {};
axios.defaults.headers.common.accept = âapplication/jsonâ;
Fonctionne trĂšs bien pour moi !!!
Je ne sais pas si c'est de notoriĂ©tĂ© publique, mais il existe un ensemble d' "en-tĂȘtes interdits" , qui ne peuvent pas ĂȘtre supprimĂ©s.
Accept-Charset
Accept-Encoding
Access-Control-Request-Headers
Access-Control-Request-Method
Connection
Content-Length
Cookie
Cookie2
Date
DNT
Expect
Host
Keep-Alive
Origin
Referer
TE
Trailer
Transfer-Encoding
Upgrade
Via
TypeError : impossible de convertir un objet non défini ou nul en objet
delete axios.defaults.headers.cummon["Authorization"];
Vous avez une faute de frappe @putu-eka-mulyana et je pense que ce n'est pas le bon endroit pour signaler un tel problĂšme.
delete axios.defaults.headers.common["Authorization"];
+1, supprime le jeu de caractĂšres du type de contenu
+1, supprime l'en-tĂȘte Auth pour une seule demande, prend en charge l'objet de configuration de la demande sans le supprimer explicitement, juste en passant une valeur comme undefined ou null
+1, supprime l'en-tĂȘte Auth pour une seule demande, prend en charge l'objet de configuration de la demande sans le supprimer explicitement, juste en passant une valeur comme undefined ou null
J'ai une demande OPTION avant ma demande PUT, donc la solution transformRequest de @aaronatmycujoo a fonctionnĂ© pour ma demande OPTION, mais l'en-tĂȘte d'autorisation Ă©tait toujours appliquĂ© Ă ma demande PUT.
En fin de compte, j'ai fini par crĂ©er des instances distinctes pour les demandes d'authentification et les demandes publiques, de sorte que mon en-tĂȘte d'authentification n'a Ă©tĂ© appliquĂ© qu'Ă l'instance d'authentification.
// do not configure auth header
export const publicAxios = axios.create(...)
// configure auth header
export const authAxios = axios.create(...)
// no auth header present for public instance
publicAxios.put(...)
@rizen PR #1845 par @codeclown permettrait de null
. Cela résoudrait-il le problÚme ?
@rizen PR #1845 par @codeclown permettrait de
null
. Cela résoudrait-il le problÚme ?
Oui
Quel long voyage. J'espÚre que le #1845 sera fusionné dÚs que possible.
transformRequest: [(data, headers) => { delete headers.common.Authorization return data }]
à partir de la documentation axios :
Je rencontre une situation assez similaire mais avec une requĂȘte GETÂ :
Authorization: Bearer mytoken
Redirige vers le point de terminaison AWS S3. L'URL de redirection a une chaĂźne de requĂȘte : X-Amz-Signature=blahblahblah
ajoutée.
AWS S3 rejette l'appel car deux authentifications :
Authorization bearer token
X-Amz-Signature=blahblahblah
Ni transformRequest
, transformResponse
, axios.interceptors.request
, axios.interceptors.response
semblent pouvoir me permettre de m'injecter dans le processus et de supprimer temporairement l'en-tĂȘte d'autorisation lorsque j'appuie sur le redirection vers AWS S3 - vraisemblablement, si je pouvais entrer aprĂšs une redirection, je pourrais faire quelque chose pour effectuer delete headers.Authorization
.
MĂȘme appel avec la demande api/postman/etc fonctionne.
C'est un point de vente Ă la vapeur laid et inefficace... mais mais ça "fonctionne âą". Est-ce que je reçois un financement VC maintenant?
let retry = false;
await axios({
method: 'get',
url: "http://www.saasserviceprovider.com/notpublicapi",
headers: {
'Authorization': "Bearer mytoken",
}
})
.then((r) => {
//return successful
})
.catch ((e) => {
if (e.request.res.responseUrl.match(/s3.amazonaws.com/)) {
retry = e.request.res.responseUrl;
} else {
//log error
}
})
//Retry
if (retry) {
await axios.get(retry)
.then((r) => {
//return successful
}
})
.catch((e) => {
//log error
})
}
SĂ©rieusement, ça doit ĂȘtre mieux (dans les axios)
Je rencontre une situation assez similaire mais avec une requĂȘte GETÂ :
- OBTENEZ http://www.saasserviceprovider.com/notpublicapi avec un en-tĂȘte de
Authorization: Bearer mytoken
- Redirige vers le point de terminaison AWS S3. L'URL de redirection a une chaĂźne de requĂȘte :
X-Amz-Signature=blahblahblah
ajoutée.- AWS S3 rejette l'appel car deux authentifications :
- En-tĂȘte :
Authorization bearer token
- ChaĂźne de requĂȘte :
X-Amz-Signature=blahblahblah
Ni
transformRequest
,transformResponse
,axios.interceptors.request
,axios.interceptors.response
semblent pouvoir me permettre de m'injecter dans le processus et de supprimer temporairement l'en-tĂȘte d'autorisation lorsque j'appuie sur le bouton redirection vers AWS S3 - vraisemblablement, si je pouvais entrer aprĂšs une redirection, je pourrais faire quelque chose pour effectuerdelete headers.Authorization
.MĂȘme appel avec la demande api/postman/etc fonctionne.
SĂ©rieusement, ça doit ĂȘtre mieux (dans les axios)
@iyerusad Avez-vous trouvĂ© un meilleur moyen que votre solution de contournement ? Je suis confrontĂ© au mĂȘme problĂšme et il est frustrant de ne pas pouvoir intercepter la redirection et supprimer l'en-tĂȘte d'autorisation uniquement pour cette demande de suivi/redirection (vers amazon dans ce cas) đ€
@iyerusad Avez-vous trouvĂ© un meilleur moyen que votre solution de contournement ? Je suis confrontĂ© au mĂȘme problĂšme et il est frustrant de ne pas pouvoir intercepter la redirection et supprimer l'en-tĂȘte d'autorisation uniquement pour cette demande de suivi/redirection (vers amazon dans ce cas) đ€
Pas vraiment - en utilisant l'option B. ci-dessous.
_Les options que j'ai évaluées :_
A. Adoptez un wrapper/client alternatif (par exemple, fetch api? request? request semble fonctionner mais est apparemment obsolĂšte). C'est peut-ĂȘtre l'option la plus propre, mais cela signifie passer Ă une autre syntaxe client http.
B. Enveloppez ma solution de contournement dans une fonction et utilisez cette fonction pour les demandes qui, je le sais, rencontrent ce problĂšme - moche apparemment moins efficace, mais je l'utilise pour le moment.
C. J'espĂšre que je suis un idiot et que j'utilise mal axios et qu'il existe une solution de contournement plus saine avec axios.
D. Axios obtient-il un correctif/correctif ?
@mikhoq @iyerusad Voulez-vous ouvrir un nouveau numĂ©ro pour suivre votre problĂšme ? Parce qu'il est diffĂ©rent de l'actuel, qui a peut-ĂȘtre Ă©tĂ© corrigĂ© en #2844.
Pas de problĂšme - Ouvert #2855.
@mikhoq, veuillez y ajouter un commentaire si vous avez un point de terminaison de repro public.
Donc apparemment, transformRequest
est appelĂ© pour des requĂȘtes GET
 ? J'ai essayĂ© cela et cela a fonctionnĂ©, cela n'a supprimĂ© que l'en-tĂȘte de la demande en cours.
transformRequest: [(data, headers) => {
delete headers.common.Authorization
return data
}]
Mais les docs disent
//
transformRequest
permet de modifier les donnĂ©es de la requĂȘte avant qu'elles ne soient envoyĂ©es au serveur
// Ceci n'est applicable que pour les mĂ©thodes de requĂȘte 'PUT', 'POST', 'PATCH' et 'DELETE'
Ce qui m'a fait penser que transformRequest
ne serait pas appelĂ© pour les requĂȘtes GET
, mais c'est le cas. Alors, que signifie réellement cette ligne ?
"Cela ne s'applique qu'aux mĂ©thodes de requĂȘte 'PUT', 'POST', 'PATCH' et 'DELETE'"
Peut-ĂȘtre, "Ceci n'est potentiellement utile que pour ...." ....? C'est trompeur imo.
cela marche:
en-tĂȘtes : {
« type de contenu » : « application/json »,
'Autorisation' : nulle,
}
J'ai essayé de régler { headers: { 'Content-Type' = null } }
sans succĂšs,
donc pour ajouter au commentaire utile de @axelgenus , je devais aller un peu plus loin :
import Axios from 'axios'
const client = Axios.create({
// ...
transformRequest: [(data, headers) => {
// add required "Content-Type" whenever body is defined
if (data) headers['Content-Type'] = 'application/x-www-form-urlencoded'
return data
}],
})
// completely remove "Content-Type" from instance by default
delete client.defaults.headers.common['Content-Type']
delete client.defaults.headers.post['Content-Type']
delete client.defaults.headers.put['Content-Type']
delete client.defaults.headers.patch['Content-Type']
// ...
Le cas d'utilisation consistait Ă implĂ©menter la couche de requĂȘtes pour la mĂ©thode d'authentification Bitstamp API V2 .
Commentaire le plus utile
travaille pour moi