Axios: Ne pas envoyer l'en-tĂȘte par dĂ©faut

CrĂ©Ă© le 19 juil. 2016  Â·  64Commentaires  Â·  Source: axios/axios

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.

headers

Commentaire le plus utile

transformRequest: [(data, headers) => {
    delete headers.common.Authorization
    return data
}]

travaille pour moi

Tous les 64 commentaires

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.

545

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

Erreur

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 :

> Ceci n'est applicable que pour les mĂ©thodes de requĂȘte 'PUT', 'POST', 'PATCH' et 'DELETE'

Je rencontre une situation assez similaire mais avec une requĂȘte GET :

  1. OBTENEZ http://www.saasserviceprovider.com/notpublicapi avec un en-tĂȘte de Authorization: Bearer mytoken
  1. 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.

  2. 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 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.

"Solution de contournement":

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 :

  1. OBTENEZ http://www.saasserviceprovider.com/notpublicapi avec un en-tĂȘte de Authorization: Bearer mytoken
  2. 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.
  3. 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 effectuer delete 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 .

Cette page vous a été utile?
0 / 5 - 0 notes