Axios: Ajout d'en-tĂȘtes Ă  la mĂ©thode axios.post

CrĂ©Ă© le 24 avr. 2017  Â·  17Commentaires  Â·  Source: axios/axios

Salut,

J'ai essayé de faire une demande de publication sur une adresse IP interdomaine et mon code ressemble à;

  var authOptions = {
    method: 'POST',
    url: 'http://10.254.147.184:7777/auth/oauth/token',
    data: qs.stringify(data),
    headers: {
        'Authorization': 'Basic Y2xpZW50OnNlY3JldA==',
        'Content-Type': 'application/x-www-form-urlencoded'
    },
    json: true
  };
  return dispatch => {
    return axios(authOptions)
    .then(function(response){
      console.log(response.data);
      console.log(response.status);
    })
    .catch(function(error){
      console.log(error);
    });

Mais chaque fois que j'y ajoute des ' en-tĂȘtes ', ma requĂȘte se transforme automatiquement en 'OPTIONS' Ă  partir de la mĂ©thode 'POST' et je ne sais pas pourquoi. Y a-t-il un bogue Ă  ce sujet ou quelque chose que je n'ai pas trouvĂ©?

Commentaire le plus utile

Edit : j'ai dĂ» ajouter une autorisation aux en-tĂȘtes autorisĂ©s dans mon filtre CORS


@jffernandez

J'ai le mĂȘme problĂšme. Lorsque je laisse de cĂŽtĂ© l'en-tĂȘte Auth, je reçois une requĂȘte Options qui renvoie POST, OPTIONS, puis le POST qui renvoie un 403 car il manque l'en-tĂȘte Authorization (attendu).

Lorsque j'ajoute l'en-tĂȘte, je reçois simplement la demande d'option et cela ne fait jamais le POST.

post("http://localhost:8080/foo", foo)

vs

post("http://localhost:8080/foo", foo, {
    headers: { Authorization: "Bearer " + token }
})

Tous les 17 commentaires

Ce n'est pas un bug, cela fonctionne comme prévu.
Vous gĂ©nĂ©rez une demande de contrĂŽle en amont (pas simple) comme indiquĂ© dans la documentation https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS car vous ajoutez un en-tĂȘte et un type de contenu qui force cela.
Ainsi, dans ce mode, une requĂȘte OPTIONS est Ă©mise avant votre requĂȘte principale, vous devez vous assurer que le serveur peut gĂ©rer la requĂȘte OPTIONS pour que cela fonctionne.

Edit : j'ai dĂ» ajouter une autorisation aux en-tĂȘtes autorisĂ©s dans mon filtre CORS


@jffernandez

J'ai le mĂȘme problĂšme. Lorsque je laisse de cĂŽtĂ© l'en-tĂȘte Auth, je reçois une requĂȘte Options qui renvoie POST, OPTIONS, puis le POST qui renvoie un 403 car il manque l'en-tĂȘte Authorization (attendu).

Lorsque j'ajoute l'en-tĂȘte, je reçois simplement la demande d'option et cela ne fait jamais le POST.

post("http://localhost:8080/foo", foo)

vs

post("http://localhost:8080/foo", foo, {
    headers: { Authorization: "Bearer " + token }
})

C'est un problĂšme CORS, pas dans axios. Veuillez consulter le lien fourni par @jffernandez ou recherchez des problĂšmes similaires ici.

Oui, il s'agit de CORS. Mais si vous ĂȘtes comme moi, vous avez probablement oubliĂ© d'ajouter Content-Type autorisĂ© dans votre serveur API.

AllowedHeaders : Content-Type et X-Requested-With
Et l'autorisation dans votre cas.

Et bien sûr, n'oubliez pas d'autoriser également la méthode OPTIONS.

axios({ method: 'POST', url: 'you http api here', headers: {autorizacion: localStorage.token}, data: { user: 'name' } })

Ou si vous voulez surmonter cette erreur CORS, vous pouvez installer le package corsproxy dans votre nƓud. Cela vous aidera avec les erreurs d'origine croisĂ©e. Vous pouvez vous rĂ©fĂ©rer au lien ci-dessous :

https://github.com/gr2m/CORS-Proxy

````
Connexion = () => {
console.log('connexion cliqué')
laisser data = JSON.stringify({
mot de passe : this.state.password,
nom d'utilisateur : this.state.email
})

axios.post('url', data, {
    headers: {
        'Content-Type': 'application/json',
    }
}
)

}
```

RĂ©solvez-le en ajoutant cet en-tĂȘte

   axios.post('http://localhost/M-Experience/resources/GETrends.php',
      {
        firstName: this.name
      },
      {
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
      });

Voici comment j'ai dĂ» formater ma requĂȘte POST

    var postData = {
      email: "[email protected]",
      password: "password"
    };

    let axiosConfig = {
      headers: {
          'Content-Type': 'application/json;charset=UTF-8',
          "Access-Control-Allow-Origin": "*",
      }
    };

    axios.post('http://<host>:<port>/<path>', postData, axiosConfig)
    .then((res) => {
      console.log("RESPONSE RECEIVED: ", res);
    })
    .catch((err) => {
      console.log("AXIOS ERROR: ", err);
    })

pour résoudre l'erreur cors, exécutez simplement cette commande npm i --save cors puis dans votre importation app.js comme ceci

var cors = require('cors');
puis appelez comme ça dans le mĂȘme fichier dans mon cas, mon fichier racine est app.js
app.use(cors());

cela résoudra votre problÚme cors

@mirzaumersaleem Je n'utilise pas le cors mais j'essaie de publier sur mon backend en utilisant axios et je reçois une requĂȘte 400 Bad

fetch peut faire avec cors (le backend n'a pas de problÚme), mais avec axios, parfois échoué.

pour résoudre l'erreur cors, exécutez simplement cette commande npm i --save cors puis dans votre importation app.js comme ceci

var cors = require('cors');
puis appelez comme ça dans le mĂȘme fichier dans mon cas, mon fichier racine est app.js
app.use(cors());

cela résoudra votre problÚme cors

Dans mes voyages, CORS doit ĂȘtre fait sur le serveur (.net/java/node/php etc..)

Edit : j'ai dĂ» ajouter une autorisation aux en-tĂȘtes autorisĂ©s dans mon filtre CORS

@jffernandez

J'ai le mĂȘme problĂšme. Lorsque je laisse de cĂŽtĂ© l'en-tĂȘte Auth, je reçois une requĂȘte Options qui renvoie POST, OPTIONS, puis le POST qui renvoie un 403 car il manque l'en-tĂȘte Authorization (attendu).

Lorsque j'ajoute l'en-tĂȘte, je reçois simplement la demande d'option et cela ne fait jamais le POST.

post("http://localhost:8080/foo", foo)

vs

post("http://localhost:8080/foo", foo, {
    headers: { Authorization: "Bearer " + token }
})

la rĂ©ponse rapide est que le premier argument aprĂšs l'url et le second est souvent mal placĂ©, c'est-Ă -dire axios (url, data, config), donc si vous omettez la partie config ou commutez les donnĂ©es et la config, vous obtenez probablement des rĂ©sultats inattendus, en gĂ©nĂ©ral, travailler avec localhost devrait ĂȘtre sans aucun problĂšme.

En général, ce n'est pas trÚs lisible

axios.request(config)
axios.get(url[, config])
axios.delete(url[, config])
axios.head(url[, config])
axios.options(url[, config])
axios.post(url[, données[, config]])
axios.put(url[, données[, config]])
axios.patch(url[, données[, config]])

Je m'attendais à ce que toutes les API soient cohérentes et aient
1) url comme premier paramĂštre,
2) config comme deuxiĂšme paramĂštre (optionnel),
3) données (facultatif)

car c'est ce à quoi les utilisateurs s'attendent, malgré cela, axios a créé un énorme problÚme à partir de cette toute petite décision d'api, de sorte que presque tout le monde s'y est piégé au moins une fois dans sa vie.

Travail pour moi :

`
en-tĂȘtes const = {
'Type de contenu' : 'application/json',
'Autorisation' : 'JWT fege...'
}

axios.post(Helper.getUserAPI(), données, {
en-tĂȘtes : en-tĂȘtes
})
.then((réponse) => {
envoi({
saisissez : FOUND_USER,
données : réponse.données[0]
})
})
.catch((erreur) => {
envoi({
saisissez : ERROR_FINDING_USER
})
})
`

Face au mĂȘme problĂšme ici avec jquery, la demande est rĂ©ussie, mais lorsque j'envoie le req avec axios, j'obtiens le problĂšme cors.
Ma demande--

      .post('https://test.pi.com/j_spring_security_check', {

        withCredentials: true,
        crossorigin: true,
        headers: {
          common:{
            'Content-Type': 'application/json',
            'Accept': 'application/json',
            'WithCredentials': true,
            'Access-Control-Allow-Origin': '*'
        }
      },
        data: JSON.stringify({
          j_username: email,
          j_password: password
        }),

        // proxy: {
        //   '/j_spring_security_check/*': 'https://devtest.pvai.com/j_spring_security_check',
        // }
      })

ce sont les en-tĂȘtes de rĂ©ponse du serveur et mon origine locahost est autorisĂ©e, les en-tĂȘtes que j'envoie sont autorisĂ©s et les mĂ©thodes Ă©galement.

access-control-allow-credentials: true
access-control-allow-headers: Authorization, X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept
access-control-allow-methods: POST, GET, OPTIONS
access-control-allow-origin: http://localhost:5000
access-control-expose-headers: Authorization
cache-control: no-cache, no-store, max-age=0, must-revalidate
content-length: 0
date: Wed, 11 Dec 2019 04:53:25 GMT
expires: 0
location: /authFailure
pragma: no-cache
status: 302
strict-transport-security: max-age=31536000 ; includeSubDomains
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block

Voici comment j'ai dĂ» formater ma requĂȘte POST

    var postData = {
      email: "[email protected]",
      password: "password"
    };

    let axiosConfig = {
      headers: {
          'Content-Type': 'application/json;charset=UTF-8',
          "Access-Control-Allow-Origin": "*",
      }
    };

    axios.post('http://<host>:<port>/<path>', postData, axiosConfig)
    .then((res) => {
      console.log("RESPONSE RECEIVED: ", res);
    })
    .catch((err) => {
      console.log("AXIOS ERROR: ", err);
    })

Merci, j'ai sauvé ma journée ! A travaillé pour moi

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

Questions connexes

samayo picture samayo  Â·  3Commentaires

altruisticsoftware picture altruisticsoftware  Â·  3Commentaires

emaincourt picture emaincourt  Â·  3Commentaires

ghprod picture ghprod  Â·  3Commentaires

helmus picture helmus  Â·  3Commentaires