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.
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.
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
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:
Estou passando por uma situação bastante semelhante, mas com uma solicitação GET:
Authorization: Bearer mytoken
Redireciona para o endpoint AWS S3. O URL de redirecionamento tem uma string de consulta: X-Amz-Signature=blahblahblah
anexada.
O AWS S3 rejeita a chamada porque duas Autenticação:
Authorization bearer token
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.
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:
- OBTER http://www.saasserviceprovider.com/notpublicapi com o cabeçalho de
Authorization: Bearer mytoken
- Redireciona para o endpoint AWS S3. O URL de redirecionamento tem uma string de consulta:
X-Amz-Signature=blahblahblah
anexada.- 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 dedelete 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 .
Comentários muito úteis
funciona para mim