Añadir cabecera en Solicitud AJAX con jQuery


Me gustaría agregar un encabezado personalizado a una solicitud POST de AJAX desde jQuery.

He intentado esto:

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

Cuando envío esta solicitud y miro con FireBug, veo este encabezado:

OPCIONES xxxx / yyyy HTTP / 1.1
Host: 127.0.0.1: 6666
Agente de usuario: Mozilla / 5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0
Aceptar: texto / html, aplicación / xhtml + xml, aplicación / xml; q=0.9,/;q = 0,8
Accept-Language: fr, fr-fr; q = 0.8,en-us;q=0.5, en;q=0.3
Accept-Encoding: gzip, deflate
Conexión: keep-alive
Origen: null
Método de solicitud de Control de Acceso: POST
Access-Control-Request-Headers: my-first-header, my-second-header
Pragma: no-cache
Cache-Control: no-cache

¿Por qué mis encabezados personalizados van a Access-Control-Request-Headers:

Access-Control-Request-Headers: my-first-header, my-second-header

Esperaba un encabezado con valores como este:

My-First-Header: primer valor
My-Second-Header: segundo valor

Es posible?

Author: wonea, 2012-04-10

5 answers

Lo que vio en Firefox no fue la solicitud real; tenga en cuenta que el método HTTP es OPTIONS, no POST. En realidad, fue la solicitud 'previa al vuelo' que el navegador hace para determinar si se debe permitir una solicitud AJAX entre dominios:

Http://www.w3.org/TR/cors /

El encabezado Access-Control-Request-Headers en la solicitud previa al vuelo incluye la lista de encabezados en la solicitud real. Se espera que el servidor informe si estas cabeceras son compatibles en este contexto o no, antes de que el navegador envíe la solicitud real.

 106
Author: karlgold,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-10 03:44:33

Aquí hay un ejemplo de cómo establecer un encabezado de solicitud en una llamada Ajax de jQuery:

$.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));
  }
});
 362
Author: milkovsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-27 12:28:08

Este código de abajo funciona para mí. Siempre uso solo corchetes individuales, y funciona bien. Sugiero que use solo corchetes simples O solo corchetes dobles, pero no mezclados.

$.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 esto responda a su pregunta...

 101
Author: G-raph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-14 12:45:18

Y es por eso que no puedes crear un bot con Javascript, porque tus opciones están limitadas a lo que el navegador te permite hacer. No se puede simplemente pedir un navegador que sigue la política CORS, que la mayoría de los navegadores siguen, para enviar solicitudes aleatorias a otros orígenes y le permiten obtener la respuesta que simplemente!

Además, si intentó editar algunos encabezados de solicitud manualmente como origin-header de las herramientas de desarrolladores que vienen con los navegadores, el navegador rechazará su edición y puede enviar una solicitud de comprobación previa OPTIONS.

 1
Author: the accountant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-25 14:42:00

Intenta usar la gema rack-cors. Y agregue el campo de encabezado en su llamada ajax.

 -8
Author: Jie Sun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-07 06:29:44