Przekazywanie nagłówków z żądaniem POST axios

134

Napisałem żądanie POST axios zgodnie z zaleceniami z dokumentacji pakietu npm, na przykład:

var data = {
    'key1': 'val1',
    'key2': 'val2'
}
axios.post(Helper.getUserAPI(), data)       
.then((response) => {
    dispatch({type: FOUND_USER, data: response.data[0]})
})
.catch((error) => {
    dispatch({type: ERROR_FINDING_USER})
})

I to działa, ale teraz zmodyfikowałem moje zaplecze API, aby akceptowało nagłówki.

Content-Type: „application / json”

Zezwolenie: „JWT fefege ...”

To żądanie działa dobrze na Postmanie, ale pisząc wywołanie axios, podążam za tym linkiem i nie mogę go uruchomić.

Ciągle otrzymuję 400 BAD Requestbłąd.

Oto moja zmodyfikowana prośba:

axios.post(Helper.getUserAPI(), {
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'JWT fefege...'
    },
    data
})      
.then((response) => {
    dispatch({type: FOUND_USER, data: response.data[0]})
})
.catch((error) => {
    dispatch({type: ERROR_FINDING_USER})
})

Każda pomoc jest bardzo ceniona.

Jagrati
źródło

Odpowiedzi:

242

Używając axios, aby przekazać własne nagłówki, podaj obiekt zawierający nagłówki jako ostatni argument

Zmodyfikuj żądanie dotyczące Axios, na przykład:

const headers = {
  'Content-Type': 'application/json',
  'Authorization': 'JWT fefege...'
}

axios.post(Helper.getUserAPI(), data, {
    headers: headers
  })
  .then((response) => {
    dispatch({
      type: FOUND_USER,
      data: response.data[0]
    })
  })
  .catch((error) => {
    dispatch({
      type: ERROR_FINDING_USER
    })
  })
Shubham Khatri
źródło
@KishoreJethava, 500 to wewnętrzny błąd serwera, czy możesz sprawdzić po stronie serwera, czy nadchodzą nagłówki, czy też jest jakiś inny błąd
Shubham Khatri
@KishoreJethava, czy możesz po prostu zalogować nagłówki na swoim serwerze i sprawdzić, czy otrzymujesz prawidłowe wartości
Shubham Khatri
Nie musisz publikować żadnych danych? Upewnij się również, że this.state.token zawiera wartość
Shubham Khatri,
Daj nam kontynuować tę dyskusję w czacie .
Kishore Jethava,
@ShubhamKhatri, czy mogę prosić o przyjrzenie się axiospokrewnemu pytaniu tutaj: stackoverflow.com/questions/59470085/… ?
Istiaque Ahmed
37

Oto pełny przykład żądania axios.post z niestandardowymi nagłówkami

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);
})

Matthew Rideout
źródło
napotykając ten problem, aby uzyskać żądanie Odpowiedź przychodzi w formacie xml. To nie rozwiązuje problemu.
Eswar
3

To może być pomocne,

const data = {
  email: "[email protected]",
  username: "me"
};

const options = {
  headers: {
      'Content-Type': 'application/json',
  }
};

axios.post('http://path', data, options)
 .then((res) => {
   console.log("RESPONSE ==== : ", res);
 })
 .catch((err) => {
   console.log("ERROR: ====", err);
 })
Uwaga: Wszystkie kody stanu powyżej 400 zostaną przechwycone w bloku Axios catch. Ponadto nagłówki są opcjonalne dla metody post w Axios

Zablokować cytat

Zablokować cytat

Fahd Jamy
źródło
2

Odpowiedź Shubhama nie działa dla mnie.

Kiedy używasz biblioteki axios i przekazujesz własne nagłówki, musisz skonstruować nagłówki jako obiekt z nazwą klucza "headers". Klucz nagłówków powinien zawierać obiekt, tutaj jest to Content-Type and Authorization.

Poniższy przykład działa dobrze.

    var headers = {
        'Content-Type': 'application/json',
        'Authorization': 'JWT fefege...' 
    }
    axios.post(Helper.getUserAPI(), data, {"headers" : headers})

        .then((response) => {
            dispatch({type: FOUND_USER, data: response.data[0]})
        })
        .catch((error) => {
            dispatch({type: ERROR_FINDING_USER})
        })
Hemadri Dasari
źródło
1

Możesz także użyć przechwytywaczy, aby przejść przez nagłówki

Może zaoszczędzić dużo kodu

axios.interceptors.request.use(config => {
  if (config.method === 'POST' || config.method === 'PATCH' || config.method === 'PUT')
    config.headers['Content-Type'] = 'application/json;charset=utf-8';

  const accessToken = AuthService.getAccessToken();
  if (accessToken) config.headers.Authorization = 'Bearer ' + accessToken;

  return config;
});
Israel kusayev
źródło
Proponuję użyćconfig.method.toUpperCase()
Constantine
@Constantine Myślę, że to już wielkie litery
Israel kusayev
Niestety mój był niższy
Constantine
0

Lub, jeśli używasz jakiejś właściwości z prototypu vuejs, której nie można odczytać podczas tworzenia, możesz również zdefiniować nagłówki i napisać np.

storePropertyMaxSpeed(){
                axios.post('api/property', {
                    "property_name" : 'max_speed',
                    "property_amount" : this.newPropertyMaxSpeed
                    },
                    {headers :  {'Content-Type': 'application/json',
                                'Authorization': 'Bearer ' + this.$gate.token()}})
                  .then(() => { //this below peace of code isn't important 
                    Event.$emit('dbPropertyChanged');

                    $('#addPropertyMaxSpeedModal').modal('hide');

                    Swal.fire({
                        position: 'center',
                        type: 'success',
                        title: 'Nova brzina unešena u bazu',
                        showConfirmButton: false,
                        timer: 1500
                        })
                })
                .catch(() => {
                     Swal.fire("Neuspješno!", "Nešto je pošlo do đavola", "warning");
                })
            }
        },
Dach0
źródło
-4

Json musi być sformatowany za pomocą podwójnych cudzysłowów

Lubić:

headers: {
                "Content-Type": "application/Jason",
                "Authorization": "JWT fefege..."
            }

Nie tylko:

headers: {
                'Content-Type': 'application/json',
                'Authorization': 'JWT fefege...'
         }
Dunks184
źródło
To prawda w przypadku formatu JSON, ale używając javascript, możesz pisać ciągi javascript w dowolny sposób i nadal będzie działać - ponieważ serializator JSON w axios nie zna różnicy! :-)
Jono