Axios: No enviar encabezado predeterminado

Creado en 19 jul. 2016  ·  64Comentarios  ·  Fuente: axios/axios

Si un encabezado se ha establecido como predeterminado, no parece haber ninguna forma de omitirlo en una solicitud individual. Configurar null o undefined no hace nada.

headers

Comentario más útil

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

funciona para mi

Todos 64 comentarios

¿Podría proporcionar algún ejemplo de código que muestre ese comportamiento? ¿Qué encabezado predeterminado estás intentando desarmar?

Si configuro axios.defaults.headers.common['Content-Type'] = 'application/json' , no puedo desarmar ese encabezado para una solicitud individual, solo puedo configurarlo en otro valor.

¿Cómo intentaste desarmar el encabezado? ¿Estás usando algo como esto?

axios.request('/path', {
  headers: {
    'Content-Type': null
  }
});

Si. Eso no funcionó

Lo siento, me perdí el method en mi ejemplo. ¿Podría haber sido eso lo que hizo que no funcionara?

También intenté configurar el método. Sospecho que tiene que ver con un Object.assign() algún lugar que simplemente no presta atención al undefined .

@tyrsius ¿qué versión de axios estás usando? Acabo de escribir una prueba para intentar reproducir esto y pasó. Me pregunto si esto se pudo haber solucionado en una versión más reciente.

Como referencia, aquí está mi prueba:

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

También tuve este problema.
Estoy tratando de eliminar el encabezado 'Autorización' de 'común', pero la única forma que he encontrado para que funcione es eliminar la propiedad de axios.defaults.header, realizar la solicitud y luego agregar la propiedad nuevamente de nuevo.
Esto será más fácil cuando se solucione este error.

Esto también es un problema para mí (usando axios v0.14.0), especialmente para los puntos finales que usan Access-Control-Allow-Headers , en cuyo caso necesito asegurarme de que ciertos encabezados no se envíen con la solicitud en absoluto.

estoy usando la versión 15.2 y cuando lo hago

headers: {
      'Content-Type': null
    }

establece el valor del encabezado en nulo. pero realmente necesito que el nombre del encabezado se elimine por completo.

por ejemplo, cuando usa s3 y genera una URL pre-firmada para publicar un archivo en un depósito, no puede tener un encabezado Authenticate. pero tengo un conjunto de Autorización predeterminado porque la gran mayoría de mis solicitudes lo requieren para mi propia API.

la forma en que solucioné esto es haciendo lo siguiente

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

Editar: esto no funciona como se esperaba. el problema es que cuando borras los encabezados

instance.defaults.headers.common = {};

lo elimina a nivel mundial. esto me cerrará la sesión ya que uso un encabezado para Auth.

para solucionar este problema hasta que haya una mejor manera de manejar la configuración global, estoy pasando los encabezados requeridos en cada llamada, no lo ideal.

545

Tuve el mismo problema pero resuelto con

delete axios.defaults.headers.common["Authorization"]; // or which ever header you have to remove

Tengo la situación exacta como @SepiaGroup
Intenté sobrescribirlo con null y '' pero luego AWS ve null como mi Autorización y se queja.
Intenté eliminarlo de la instancia, pero luego mi Autorización se elimina globalmente, por lo que obtengo 403 en mi propio servidor.

Supongo que mi solución será usar un antiguo XHR para esto, pero me entristece :(

+1 También se quedó sin poder borrar el encabezado predeterminado para una llamada específica.

+1

+1

También veo este comportamiento en la última versión (0.16.2). Sobreviene la tristeza :(

solo bórralo

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.

dejar instancia = axios.create ({opciones})

función: cerrar sesión () {
instancia = axios.create ({opciones})
}
''

@ lzp4ever eso funcionaría en la mayoría de los casos, espero. Pero en los casos en que alguien haya agregado interceptores de solicitud y respuesta, o haya realizado más configuraciones de la instancia más allá de simplemente pasar las opciones de configuración, ¿su enfoque no requeriría que todo eso se rehaga?

Me pregunto si quizás la solución de

Sería bueno poder NO enviar el encabezado predeterminado sin eliminar las propiedades :)

+1

+1

+1. Parece triste que no pueda eliminar los encabezados de una instancia. Esto significa que todas las instancias tienen una referencia a la variable global.

+1

+1

+1 Solucione este problema.

+1

+1

+1

Nos encontramos con el mismo problema. La mayoría de las aplicaciones de front-end que creamos necesitan consumir varios servicios web Rest. No poder cancelar la suscripción al encabezado de seguridad es un gran problema para nosotros.

+1

+1

Pruebe a estos chicos en un objeto de solicitud específico, junto con encabezados, datos y método:
transformRequest(data, headers) { delete headers.common.Authorization; return data; }

Prueba esto, resuelve mi problema:

eliminar axios.defaults.headers.common ["Autorización"]; // y crea tus propios encabezados

@mukeshyadav Esa solución se ha mencionado varias veces más adelante en este hilo.

El punto es que esta no es necesariamente la solución ideal. Imaginando un escenario en el que ha agregado sus propios interceptores de solicitud / respuesta personalizados a una instancia de Axios, pero desea que una solicitud específica no incluya los encabezados utilizados en cualquier otro lugar, tendría que eliminar los encabezados y volver a agregarlos después la solicitud está completa.

Por el contrario, me pregunto si hay alguna manera de que pueda, con relativa facilidad, simplemente duplicar una instancia de Axios para usar en este tipo de casos únicos.

+1

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

funciona para mi

@aaronatmycujoo Esa parece la solución más sexy aquí. Aunque, preguntarse si eliminar el encabezado de esa manera lo elimina de una instancia de Axios más arriba en la cadena. Puede que tenga que crear una copia profunda de headers o algo así.

Tendré que probar eso.

por lo que puedo decir que no. aunque podría haber un caso límite que no estoy activando

@SepiaGroup no necesita agregar encabezados en todas sus solicitudes ... Haga esto:

axios.defaults.headers.common = {};
axios.defaults.headers.common.accept = ‘application/json’;

Y en los encabezados de la solicitud solo verá 'application / json'

+1 gracias @axelgenus ur solución funcionó

+1

@aaronatmycujoo FTW !!! Su solución funcionó a las mil maravillas ... ¡tío!

Enfrenté el mismo problema al intentar cargar archivos en S3 (solo permite un mecanismo de autenticación).
Probé la solución de @SepiaGroup pero también elimina el encabezado de autenticación globalmente para todas las siguientes instancias :(
@aaronatmycujoo ¡ Esta solución funciona perfectamente para mí! 🎉
¡Gracias chicos por salvarme el día!

+1

+1

+1

axios.defaults.headers.common = {};
axios.defaults.headers.common.accept = ‘application/json’;

¡¡¡Funciona muy bien para mí !!!

No estoy seguro de si esto es de conocimiento común, pero hay un conjunto de "encabezados prohibidos" que no se pueden eliminar.

  • 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

error

TypeError: no se puede convertir indefinido o nulo en objeto

delete axios.defaults.headers.cummon["Authorization"];

Tiene un error tipográfico @ putu-eka-mulyana. También creo que este es el lugar equivocado para informar un problema de este tipo.

delete axios.defaults.headers.common["Authorization"];

+1, eliminar el juego de caracteres del tipo de contenido

+1, elimine el encabezado Auth para solo una solicitud, tome el objeto de configuración de la solicitud sin eliminarlo explícitamente, simplemente pasando algún valor como indefinido o nulo

+1, elimine el encabezado Auth para solo una solicitud, tome el objeto de configuración de la solicitud sin eliminarlo explícitamente, simplemente pasando algún valor como indefinido o nulo

Tengo una solicitud de OPCIÓN antes de mi solicitud de PUT, por lo que la solución transformRequest de

En última instancia, terminé creando instancias separadas para solicitudes de autenticación frente a solicitudes públicas, por lo que mi encabezado de autenticación solo se aplicó a la instancia de autenticación.

// 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 de @codeclown permitiría desarmar encabezados pasando null . ¿Resolvería esto el problema?

@rizen PR # 1845 de @codeclown permitiría desarmar encabezados pasando null . ¿Resolvería esto el problema?

Qué viaje tan largo. Hope # 1845 se fusionará lo antes posible.

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

De la documentación de axios:

> Esto solo es aplicable para los métodos de solicitud 'PUT', 'POST', 'PATCH' y 'DELETE'

Me encuentro con una situación bastante similar pero con una solicitud GET:

  1. OBTENGA http://www.saasserviceprovider.com/notpublicapi con encabezado de Authorization: Bearer mytoken
  1. Redirige al punto de enlace de AWS S3. La URL de redireccionamiento tiene una cadena de consulta: X-Amz-Signature=blahblahblah añadida.

  2. AWS S3 rechaza la llamada debido a dos autenticación:

    • Encabezado: Authorization bearer token
    • Cadena de consulta: X-Amz-Signature=blahblahblah

Ni transformRequest , transformResponse , axios.interceptors.request , axios.interceptors.response parecen poder permitirme inyectarme en el proceso y eliminar temporalmente el encabezado de autorización al presionar el redirección a AWS S3: presumiblemente, si pudiera ingresar después de una redirección, podría hacer algo con un efecto de delete headers.Authorization .

Misma llamada con solicitud api / cartero / etc funciona.

"Solución alterna":

Este es un POS de vaporización feo e ineficaz ... pero "funciona ™". ¿Obtengo financiación de capital riesgo ahora?

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

Aunque en serio ... tiene que ser mejor (dentro de axios)

Me encuentro con una situación bastante similar pero con una solicitud GET:

  1. OBTENGA http://www.saasserviceprovider.com/notpublicapi con encabezado de Authorization: Bearer mytoken
  2. Redirige al punto de enlace de AWS S3. La URL de redireccionamiento tiene una cadena de consulta: X-Amz-Signature=blahblahblah adjunta.
  3. AWS S3 rechaza la llamada debido a dos autenticación:
  • Encabezado: Authorization bearer token
  • Cadena de consulta: X-Amz-Signature=blahblahblah

Ni transformRequest , transformResponse , axios.interceptors.request , axios.interceptors.response parecen poder permitirme inyectarme en el proceso y eliminar temporalmente el encabezado de autorización al presionar el redirección a AWS S3: presumiblemente, si pudiera ingresar después de una redirección, podría hacer algo con un efecto de delete headers.Authorization .

Misma llamada con solicitud api / cartero / etc funciona.

Aunque en serio ... tiene que ser mejor (dentro de axios)

@iyerusad ¿Encontraste alguna manera mejor que tu solución alternativa? Estoy enfrentando el mismo problema, y ​​es frustrante que no parezca poder interceptar el redireccionamiento y eliminar el encabezado de Autorización solo para esa solicitud de seguimiento / redireccionamiento (a Amazon en este caso) 🤔

@iyerusad ¿Encontraste alguna manera mejor que tu solución alternativa? Estoy enfrentando el mismo problema, y ​​es frustrante que no parezca poder interceptar el redireccionamiento y eliminar el encabezado de Autorización solo para esa solicitud de seguimiento / redireccionamiento (a Amazon en este caso) 🤔

Realmente no, usando la opción B. de abajo.

_Las opciones que evalué: _
A. Adopte un contenedor / cliente alternativo (por ejemplo, fetch api? Request? Request parecía funcionar pero aparentemente está en desuso). Esta podría ser la opción más limpia, pero significa cambiar a otra sintaxis de cliente http.

B. Envuelva mi solución alternativa en una función y use esa función para las solicitudes que sé que se encuentran con este problema; feo, aparentemente menos eficiente, pero usando esto en este momento.

C. Espero ser un idiota y usar axios incorrectamente y hay una solución más sensata con axios.

D. ¿ Axios obtiene reparación / parche?

@mikhoq @iyerusad ¿Le importaría abrir una nueva edición para rastrear su problema? Porque es diferente al actual, que puede haber sido arreglado en el # 2844.

No hay problema - Inaugurado # 2855.

@mikhoq , agregue un comentario allí si tiene un punto final de reproducción público.

Entonces, aparentemente transformRequest recibe una llamada para GET solicitudes? Intenté esto y funcionó, solo eliminó el encabezado de la solicitud actual.

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

Pero los doctores dicen

// transformRequest permite cambios en los datos de la solicitud antes de enviarlos al servidor
// Esto solo es aplicable para los métodos de solicitud 'PUT', 'POST', 'PATCH' y 'DELETE'

Lo que me hizo pensar que transformRequest no se llamaría para solicitudes GET , pero lo es. Entonces, ¿qué significa realmente esta línea?

"Esto solo se aplica a los métodos de solicitud 'PUT', 'POST', 'PATCH' y 'DELETE'"

¿Quizás, "Esto es potencialmente útil sólo para ...." ....? Es engañoso en mi opinión.

esto funciona:
encabezados: {
'content-type': 'aplicación / json',
'Autorización': nulo,
}

Intenté configurar { headers: { 'Content-Type' = null } } sin éxito,
así que para agregar al útil comentario de @axelgenus , tuve que ir un poco más allá:

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']
// ...

El caso de uso fue la implementación de la capa de solicitudes para el método de autenticación Bitstamp API V2 .

¿Fue útil esta página
0 / 5 - 0 calificaciones