Axios: Não envie cabeçalho padrão

Criado em 19 jul. 2016  ·  64Comentários  ·  Fonte: axios/axios

Se um cabeçalho foi definido como padrão, não parece haver nenhuma maneira de ignorá-lo em uma solicitação individual. Definir null ou undefined não faz nada.

headers

Comentários muito úteis

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

funciona para mim

Todos 64 comentários

Você poderia fornecer algum exemplo de código que mostre esse comportamento? Qual cabeçalho padrão você está tentando remover?

Se eu definir axios.defaults.headers.common['Content-Type'] = 'application/json' , não posso remover esse cabeçalho para uma solicitação individual, só posso defini-lo com outro valor.

Como você tentou remover o cabeçalho? Usando algo assim?

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

sim. Isso não funcionou

Desculpe, perdi method no meu exemplo. Poderia ter sido isso que fez com que não funcionasse?

Também tentei definir o método. Suspeito que tenha a ver com um Object.assign() algum lugar, simplesmente não prestando atenção ao undefined .

@tyrsius qual versão de axios você está usando? Acabei de escrever um teste para tentar reproduzir isso e passou. Estou me perguntando se isso pode ter sido corrigido em uma versão mais recente.

Para referência, aqui está o meu teste:

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

Eu tive esse problema também.
Estou tentando remover o cabeçalho 'Autorização' de 'comum', mas a única maneira que encontrei de fazê-lo funcionar é excluir a propriedade de axios.defaults.header, fazer a solicitação e adicionar a propriedade de volta novamente.
Isso será mais fácil quando este bug for corrigido

Isso também é um problema para mim (usando o axios v0.14.0), especialmente para endpoints que usam Access-Control-Allow-Headers , caso em que preciso ter certeza de que determinados cabeçalhos não sejam enviados com a solicitação.

estou usando a versão 15.2 e quando faço

headers: {
      'Content-Type': null
    }

ele define o valor do cabeçalho como nulo. mas eu realmente preciso que o nome do cabeçalho seja removido completamente.

por exemplo, ao usar s3 e gerar uma url predefinida para postar um arquivo em um depósito, você não pode ter um cabeçalho Authenticate. mas eu tenho um conjunto de autorização padrão porque a grande maioria das minhas solicitações exige isso para minha própria API.

a maneira que eu consegui resolver isso foi fazendo o seguinte

    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: isso não funciona conforme o esperado. o problema é que quando você limpa os cabeçalhos

instance.defaults.headers.common = {};

ele o remove em um nível global. isso vai me desconectar, pois eu uso um cabeçalho para Auth.

para contornar esse problema até que haja uma maneira melhor de lidar com a configuração global, estou passando os cabeçalhos necessários em todas as chamadas, o que não é o ideal.

545

Tive o mesmo problema mas resolvi com

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

Tenho a situação exata como @SepiaGroup
Tentei sobrescrever null e '' mas a AWS vê null como minha autorização e reclama.
Tentei excluí-lo da instância, mas minha autorização foi excluída globalmente, então recebo 403 em meu próprio servidor.

Acho que minha solução alternativa será usar um antigo XHR para isso, mas me deixa triste :(

+1 Também preso por não ser capaz de limpar o cabeçalho padrão de uma chamada específica.

+1

+1

Também estou vendo esse comportamento na versão mais recente (0.16.2). A tristeza segue :(

apenas exclua

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

função: logout () {
instância = axios.create ({opções})
}
`` `

@ lzp4ever isso funcionaria na maioria dos casos, eu espero. Mas nos casos em que alguém adicionou interceptores de solicitação e resposta ou fez mais configuração da instância além de simplesmente passar as opções de configuração, sua abordagem não exigiria que tudo isso fosse refeito?

Apenas me perguntando se talvez a solução de @axelgenus seja mais limpa e exija menos "reinicialização" de uma instância inteira do Axios da qual você está tentando remover um cabeçalho personalizado específico.

Seria bom poder NÃO enviar o cabeçalho padrão sem excluir propriedades :)

+1

+1

+1. Parece triste que você não possa remover os cabeçalhos de uma instância. Isso significa que todas as instâncias têm uma referência à variável global.

+1

+1

+1 Por favor, corrija este problema.

+1

+1

+1

Encontramos o mesmo problema. A maioria dos aplicativos front-end que construímos precisa consumir vários webservices Rest. Incapaz de cancelar o cabeçalho de segurança é um grande problema para nós.

+1

+1

Experimente esses caras no objeto de solicitação específico, junto com cabeçalhos, dados e método:
transformRequest(data, headers) { delete headers.common.Authorization; return data; }

Experimente isso, resolverá meu problema:

excluir axios.defaults.headers.common ["Autorização"]; // e crie seus próprios cabeçalhos

@mukeshyadav Essa solução foi mencionada várias vezes mais adiante neste tópico.

O que quero dizer é que essa não é necessariamente a solução ideal. Imaginando um cenário em que você adicionou seus próprios interceptores de solicitação / resposta personalizados a uma instância do Axios, mas deseja que uma solicitação específica não inclua cabeçalhos usados ​​em todos os outros lugares, você terá que excluir o (s) cabeçalho (s) e adicioná-lo novamente após a solicitação é concluída.

Por outro lado, perguntando-se se há uma maneira de, com relativa facilidade, simplesmente duplicar uma instância do Axios para usar nesses tipos de casos únicos.

+1

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

funciona para mim

@aaronatmycujoo Essa parece ser a solução mais sexy aqui. Porém, imaginar se excluir o cabeçalho dessa forma o removerá de uma instância do Axios mais acima na cadeia. Pode ser necessário criar uma cópia profunda de headers ou algo assim.

Vou ter que testar isso.

pelo que posso dizer, não. embora possa haver um caso extremo que eu não estou acionando

@SepiaGroup você não precisa adicionar cabeçalhos em todas as suas solicitações ... Faça isto:

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

E nos cabeçalhos da solicitação, você verá apenas 'application / json'

+1 obrigado @axelgenus sua solução funcionou

+1

@aaronatmycujoo FTW !!! Sua solução funcionou como um encanto ... ty!

Enfrentou o mesmo problema ao tentar fazer upload de arquivos para S3 (permitir apenas um mecanismo de autenticação).
Tentei a solução de @SepiaGroup, mas ela também remove o cabeçalho de autenticação globalmente para todas as seguintes instâncias :(
@aaronatmycujoo Esta solução funciona perfeitamente para mim! 🎉
Obrigado pessoal por salvar o meu dia!

+1

+1

+1

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

Funciona muito bem para mim !!!

Não tenho certeza se isso é de conhecimento comum, mas há um conjunto de "cabeçalhos proibidos" , que não podem ser excluídos.

  • 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

erro

TypeError: Não é possível converter indefinido ou nulo em objeto

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

Você cometeu um erro de digitação @ putu-eka-mulyana e também acho que este é o lugar errado para relatar esse problema.

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

+1, remova o conjunto de caracteres do tipo de conteúdo

+1, remova o cabeçalho Auth para apenas uma solicitação, obtenha o objeto de configuração da solicitação sem excluir explicitamente, apenas passando algum valor como indefinido ou nulo

+1, remova o cabeçalho Auth para apenas uma solicitação, obtenha o objeto de configuração da solicitação sem excluir explicitamente, apenas passando algum valor como indefinido ou nulo

Eu tenho uma solicitação OPTION antes da minha solicitação PUT, então a solução transformRequest de @aaronatmycujoo funcionou para a minha solicitação OPTION, mas o cabeçalho de autorização ainda foi aplicado à minha solicitação PUT.

No final das contas, acabei criando instâncias separadas para solicitações de autenticação vs públicas, então meu cabeçalho de autenticação foi aplicado apenas à instância de autenticação.

// 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 por @codeclown permitiria null . Isso resolveria o problema?

@rizen PR # 1845 por @codeclown permitiria null . Isso resolveria o problema?

sim

Que longa jornada. Hope # 1845 get's fundido o mais rápido possível.

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

Da documentação da axios:

> Isso só é aplicável para os métodos de solicitação 'PUT', 'POST', 'PATCH' e 'DELETE'

Estou passando por uma situação bastante semelhante, mas com uma solicitação GET:

  1. OBTER http://www.saasserviceprovider.com/notpublicapi com o cabeçalho Authorization: Bearer mytoken
  1. Redireciona para o endpoint AWS S3. O URL de redirecionamento tem uma string de consulta: X-Amz-Signature=blahblahblah anexada.

  2. O AWS S3 rejeita a chamada porque duas Autenticação:

    • Cabeçalho: Authorization bearer token
    • String de consulta: X-Amz-Signature=blahblahblah

Nem transformRequest , transformResponse , axios.interceptors.request , axios.interceptors.response parece ser capaz de permitir que eu me injete no processo e remova temporariamente o cabeçalho de autorização ao atingir o redirecionamento para AWS S3 - presumivelmente se eu pudesse entrar após um redirecionamento, poderia fazer algo para o efeito de delete headers.Authorization .

A mesma chamada funciona com api / postman / etc.

"Gambiarra":

Este é um POS fumegante feio e ineficaz ... mas "funciona ™". Recebo financiamento VC agora?

  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ério ... tem que ser a melhor maneira (dentro dos axios)

Estou passando por uma situação bastante semelhante, mas com uma solicitação GET:

  1. OBTER http://www.saasserviceprovider.com/notpublicapi com o cabeçalho de Authorization: Bearer mytoken
  2. Redireciona para o endpoint AWS S3. O URL de redirecionamento tem uma string de consulta: X-Amz-Signature=blahblahblah anexada.
  3. O AWS S3 rejeita a chamada porque duas Autenticação:
  • Cabeçalho: Authorization bearer token
  • String de consulta: X-Amz-Signature=blahblahblah

Nenhum transformRequest , transformResponse , axios.interceptors.request , axios.interceptors.response parece ser capaz de me permitir me inserir no processo e remover temporariamente o cabeçalho de autorização ao acessar o redirecionamento para AWS S3 - presumivelmente se eu pudesse entrar após um redirecionamento, poderia fazer algo para o efeito de delete headers.Authorization .

A mesma chamada funciona com api / postman / etc.

Sério ... tem que ser a melhor maneira (dentro dos axios)

@iyerusad Você encontrou uma maneira melhor do que a sua solução alternativa? Estou enfrentando o mesmo problema e é frustrante não conseguir interceptar o redirecionamento e excluir o cabeçalho de autorização apenas para esse pedido de acompanhamento / redirecionamento (para a Amazon, neste caso) 🤔

@iyerusad Você encontrou uma maneira melhor do que a sua solução alternativa? Estou enfrentando o mesmo problema e é frustrante não conseguir interceptar o redirecionamento e excluir o cabeçalho de autorização apenas para esse pedido de acompanhamento / redirecionamento (para a Amazon, neste caso) 🤔

Na verdade, não - usando a opção B. a partir de baixo.

_As opções que avaliei: _
A. Adote um wrapper / cliente alternativo (por exemplo, fetch api? Request? Request parece funcionar, mas aparentemente está obsoleto). Esta pode ser a opção mais limpa, mas significa mudar para outra sintaxe de cliente http.

B. Envolva minha solução alternativa em uma função e use essa função para solicitações que eu sei que se deparam com esse problema - feio, aparentemente menos eficiente, mas usando isso no momento.

C. Espero que eu seja um idiota e esteja usando axios errado e haja uma solução mais sã para os axios.

D. Axios obter correção / patch?

@mikhoq @iyerusad Você se importaria de abrir uma nova edição para rastrear seu problema? Porque é diferente do atual, que pode ter sido corrigido em # 2844.

Sem problemas - Aberto no número 2855.

@mikhoq adicione um comentário lá se você tiver um endpoint público de reprodução.

Então, aparentemente, transformRequest é chamado para solicitações de GET ? Tentei fazer isso e funcionou, apenas excluiu o cabeçalho da solicitação atual.

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

Mas os médicos dizem

// transformRequest permite alterações nos dados do pedido antes de serem enviados para o servidor
// Isso só é aplicável para os métodos de solicitação 'PUT', 'POST', 'PATCH' e 'DELETE'

O que me fez pensar que transformRequest não seria chamado para solicitações de GET , mas é. Então, o que essa linha realmente significa?

"Isso é aplicável apenas para os métodos de solicitação 'PUT', 'POST', 'PATCH' e 'DELETE'"

Talvez, "Isso é potencialmente útil apenas para ...." ....? Isso é enganoso.

isso funciona:
cabeçalhos: {
'content-type': 'application / json',
'Autorização': nulo,
}

Tentei configurar { headers: { 'Content-Type' = null } } sem sucesso,
então, para adicionar ao comentário útil do @axelgenus , eu tive que ir um pouco mais longe:

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

O caso de uso foi a implementação da camada de solicitações para o método de autenticação Bitstamp API V2 .

Esta página foi útil?
0 / 5 - 0 avaliações