Pasar encabezados con solicitud POST de axios

134

He escrito una solicitud POST de axios como se recomienda en la documentación del paquete npm como:

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

Y funciona, pero ahora he modificado mi API de back-end para aceptar encabezados.

Tipo de contenido: 'application / json'

Autorización: 'JWT fefege ...'

Ahora, esta solicitud funciona bien en Postman, pero cuando escribo una llamada axios, sigo este enlace y no puedo hacer que funcione.

Constantemente recibo 400 BAD Requesterrores.

Aquí está mi solicitud modificada:

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

Cualquier ayuda es muy apreciada.

Jagrati
fuente

Respuestas:

241

Cuando utilice axios, para pasar encabezados personalizados, proporcione un objeto que contenga los encabezados como último argumento

Modifique su solicitud de axios como:

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
fuente
@KishoreJethava, 500 es un error interno del servidor, ¿puede verificar en el lado del servidor si vienen encabezados o hay algún otro error?
Shubham Khatri
@KishoreJethava, puede que acaba de registrar los encabezados en su servidor y ver si está recibiendo los valores correctos
Shubham Khatri
¿No necesitas publicar ningún dato? También asegúrese de que this.state.token contenga un valor
Shubham Khatri el
Continuemos esta discusión en el chat .
Kishore Jethava
@ShubhamKhatri, ¿puedo pedirle que eche un vistazo a una axiospregunta relacionada aquí: stackoverflow.com/questions/59470085/… ?
Istiaque Ahmed
37

Aquí hay un ejemplo completo de una solicitud axios.post con encabezados personalizados

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
fuente
frente a este problema para obtener la solicitud. La respuesta viene en formato xml. Esto no resuelve el problema.
Eswar
3

Esto puede ser útil

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);
 })
Nota: Todos los códigos de estado superiores a 400 se capturarán en el bloque de captura Axios. Además, los encabezados son opcionales para el método de publicación en Axios

Blockquote

Blockquote

Fahd Jamy
fuente
2

La respuesta de Shubham no funcionó para mí.

Cuando utiliza la biblioteca axios y pasa encabezados personalizados, necesita construir encabezados como un objeto con el nombre clave "encabezados". La clave de encabezado debe contener un objeto, aquí está Content-Type y Authorization.

El siguiente ejemplo está funcionando bien.

    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
fuente
1

También puedes usar interceptores para pasar los encabezados

Puede ahorrarte mucho código

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
fuente
Sugeriría usarconfig.method.toUpperCase()
Constantine
@Constantine Creo que ya es mayúscula
Israel kusayev
Lamentablemente, la mía fue menor
Constantine
0

O, si está utilizando alguna propiedad del prototipo vuejs que no se puede leer en la creación, también puede definir encabezados y escribir, es decir

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
fuente
-4

Json tiene que formatearse con comillas dobles

Me gusta:

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

No solo:

headers: {
                'Content-Type': 'application/json',
                'Authorization': 'JWT fefege...'
         }
Dunks184
fuente
Eso es cierto para el formato JSON, pero cuando usa JavaScript, puede escribir cadenas de JavaScript como desee y seguirá funcionando, ¡porque el serializador JSON en axios no sabe la diferencia! :-)
Jono