Gostaria de adicionar um cabeçalho personalizado a uma solicitação AJAX POST do jQuery.
Eu tentei isso:
$.ajax({
type: 'POST',
url: url,
headers: {
"My-First-Header":"first value",
"My-Second-Header":"second value"
}
//OR
//beforeSend: function(xhr) {
// xhr.setRequestHeader("My-First-Header", "first value");
// xhr.setRequestHeader("My-Second-Header", "second value");
//}
}).done(function(data) {
alert(data);
});
Quando envio esta solicitação e assisto ao FireBug, vejo este cabeçalho:
OPÇÕES xxxx / aaaa
Host HTTP / 1.1 : 127.0.0.1:6666
Agente do usuário: Mozilla / 5.0 (Windows NT 6.1; WOW64; rv: 11.0) Gecko / 20100101 Firefox / 11.0
Accept: text / html, application / xhtml + xml, application / xml; q = 0,9, / ; q = 0,8
Accept-Language: fr, fr-fr; q = 0,8, pt-br; q = 0,5, pt; q = 0,3
Accept-Encoding: gzip, deflate
Conexão: mantenha -alive
Origem: null
Método de solicitação de controle de
acesso : POST Controle de acesso-solicitação-cabeçalhos: meu-primeiro-cabeçalho, meu-segundo-cabeçalho
Pragma: sem cache
Controle de cache: sem cache
Por que meus cabeçalhos personalizados vão para Access-Control-Request-Headers
:
Cabeçalhos de solicitação de controle de acesso: meu primeiro cabeçalho, meu segundo cabeçalho
Eu estava esperando um valor de cabeçalho como este:
Meu primeiro cabeçalho: primeiro valor
Meu segundo cabeçalho: segundo valor
É possível?
fonte
Respostas:
O que você viu no Firefox não foi a solicitação real; observe que o método HTTP é OPTIONS, não POST. Na verdade, foi a solicitação 'pré-vôo' que o navegador faz para determinar se uma solicitação AJAX entre domínios deve ser permitida:
http://www.w3.org/TR/cors/
O cabeçalho de controle de acesso-solicitação-cabeçalho na solicitação de pré-voo inclui a lista de cabeçalhos na solicitação real. Espera-se que o servidor informe novamente se esses cabeçalhos são suportados neste contexto ou não, antes que o navegador envie a solicitação real.
fonte
Aqui está um exemplo de como definir um cabeçalho de solicitação em uma chamada do jQuery Ajax:
fonte
Este código abaixo funciona para mim. Eu sempre uso apenas aspas simples e funciona bem. Sugiro que você use apenas aspas simples ou duplas, mas não misturadas.
fonte
Como você envia cabeçalhos personalizados para que sua solicitação CORS não seja uma solicitação simples , o navegador envia primeiro uma solicitação OPTIONS de comprovação para verificar se o servidor permite sua solicitação.
Se você ativar o CORS no servidor, seu código funcionará. Você também pode usar a busca por JavaScript ( aqui )
Mostrar snippet de código
Aqui está um exemplo de configuração que ativa o CORS no nginx (arquivo nginx.conf):
Mostrar snippet de código
Aqui está um exemplo de configuração que ativa o CORS no Apache (arquivo .htaccess)
Mostrar snippet de código
fonte
E é por isso que você não pode criar um bot com JavaScript, porque suas opções são limitadas ao que o navegador permite. Você não pode simplesmente solicitar um navegador que siga a política do CORS , seguida pela maioria dos navegadores, para enviar solicitações aleatórias para outras origens e permitir que você obtenha a resposta com simplicidade!
Além disso, se você tentou editar alguns cabeçalhos de solicitação manualmente, como
origin-header
nas ferramentas de desenvolvedores que acompanham os navegadores, o navegador recusará sua edição e poderá enviar umaOPTIONS
solicitação de comprovação .fonte
Tente usar a gema rack-cors . E adicione o campo de cabeçalho na sua chamada Ajax.
fonte