Adicionar cabeçalho no pedido AJAX com o jQuery
gostaria de adicionar um cabeçalho personalizado a um pedido AJAX POST de jQuery.
já tentei isto:
$.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 este pedido e vejo com FireBug, vejo este cabeçalho:
Porque é que os meus cabeçalhos personalizados vão paraopções xxxx/yyyy HTTP / 1, 1
Máquina:127. 0. 0. 1: 6666
Agente do utilizador: 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, en-us; q = 0.5, en; q=0.3
Codificação de aceitação: gzip, deflate
Ligação: manter-se vivo
Origem: null
Access-Control-Request-Method: POST
Access-Control-Request-Headers: my-first-header, my-second-header
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Headers
:
Access-Control-Request-Headers: o meu-primeiro-cabeçalho, o meu-segundo-cabeçalho
estava à espera de um cabeçalho como este:
É possível?O Meu Primeiro cabeçalho: primeiro valor
O meu-segundo-cabeçalho: segundo valor
5 answers
O que você viu no Firefox não foi o pedido real; note que o método HTTP é opções, não POST. Foi na verdade o pedido de "pré-voo" que o navegador faz para determinar se um pedido AJAX cross-domain deve ser permitido:
O cabeçalho Access-Control-Request-Headers no pedido de pré-voo inclui a lista de cabeçalhos no pedido actual. Espera-se então que o servidor relate se estes cabeçalhos são suportado neste contexto ou não, antes de o navegador enviar o pedido real.
Aqui está um exemplo de como definir um cabeçalho de pedido em uma chamada jQuery Ajax:
$.ajax({
type: "POST",
beforeSend: function(request) {
request.setRequestHeader("Authority", authorizationToken);
},
url: "entities",
data: "json=" + escape(JSON.stringify(createRequestObject)),
processData: false,
success: function(msg) {
$("#results").append("The result =" + StringifyPretty(msg));
}
});
$.ajax({
url: 'YourRestEndPoint',
headers: {
'Authorization':'Basic xxxxxxxxxxxxx',
'X_CSRF_TOKEN':'xxxxxxxxxxxxxxxxxxxx',
'Content-Type':'application/json'
},
method: 'POST',
dataType: 'json',
data: YourData,
success: function(data){
console.log('succes: '+data);
}
});
Espero que isto responda à tua pergunta...
E é por isso que não pode criar um bot com Javascript, porque as suas opções estão limitadas ao que o navegador lhe permite fazer. Você não pode simplesmente pedir um navegador que segue a Política CORS
, que a maioria dos navegadores seguem, para enviar pedidos aleatórios para outras origens e permitir que você obtenha a resposta que simplesmente!
Adicionalmente, se tentou editar manualmente alguns cabeçalhos de pedidos como origin-header
das ferramentas de desenvolvimento que vêm com os navegadores, o navegador irá recusar a sua edição, e pode enviar um pedido de pré-voo OPTIONS
.