ฉันจะเพิ่มส่วนหัว HTTP แบบกำหนดเองลงในคำขอ ajax ด้วย js หรือ jQuery ได้อย่างไร


คำตอบ:


585

มีหลายวิธีขึ้นอยู่กับสิ่งที่คุณต้องการ ...

หากคุณต้องการเพิ่มส่วนหัวที่กำหนดเอง (หรือชุดของส่วนหัว) ลงในคำขอส่วนบุคคลเพียงแค่เพิ่มheadersคุณสมบัติ:

// Request with custom header
$.ajax({
    url: 'foo/bar',
    headers: { 'x-my-custom-header': 'some value' }
});

หากคุณต้องการเพิ่มส่วนหัวเริ่มต้น (หรือชุดส่วนหัว) ให้กับทุกคำขอให้ใช้$.ajaxSetup():

$.ajaxSetup({
    headers: { 'x-my-custom-header': 'some value' }
});

// Sends your custom header
$.ajax({ url: 'foo/bar' });

// Overwrites the default header with a new header
$.ajax({ url: 'foo/bar', headers: { 'x-some-other-header': 'some value' } });

หากคุณต้องการเพิ่มส่วนหัว (หรือชุดส่วนหัว) ให้กับทุกคำขอให้ ใช้beforeSendhook ด้วย$.ajaxSetup():

$.ajaxSetup({
    beforeSend: function(xhr) {
        xhr.setRequestHeader('x-my-custom-header', 'some value');
    }
});

// Sends your custom header
$.ajax({ url: 'foo/bar' });

// Sends both custom headers
$.ajax({ url: 'foo/bar', headers: { 'x-some-other-header': 'some value' } });

แก้ไข (ข้อมูลเพิ่มเติม):สิ่งหนึ่งที่จะต้องตระหนักถึงคือมีคุณเท่านั้นที่สามารถกำหนดหนึ่งชุดของส่วนหัวเริ่มต้นและคุณสามารถกำหนดหนึ่งajaxSetup beforeSendหากคุณโทรajaxSetupหลายครั้งเฉพาะชุดส่วนหัวสุดท้ายเท่านั้นที่จะถูกส่งและเฉพาะการโทรกลับครั้งสุดท้ายก่อนส่งจะดำเนินการ


จะเกิดอะไรขึ้นถ้าฉันกำหนดใหม่beforeSendเมื่อทำ$.ajaxอะไร
Kostas

3
คุณสามารถกำหนดbeforeSendโทรกลับได้หนึ่งรายการเท่านั้น หากคุณโทร$.ajaxSetup({ beforeSend: func... })ซ้ำสองครั้งการโทรกลับครั้งที่สองจะเป็นครั้งเดียวที่ไฟไหม้
Prestaul

1
ajaxSetupปรับปรุงคำตอบของฉันที่จะเพิ่มรายละเอียดเพิ่มเติมเกี่ยวกับ
Prestaul

2
ดูเหมือนว่าจะไม่ทำงานกับ CORS Request (ทุกเบราว์เซอร์) มีวิธีแก้ไขไหม?
svassr

1
@ Si8 ดูเหมือนว่าเป็นปัญหาข้ามโดเมนสำหรับฉัน คุณไม่สามารถขอจากโดเมนหนึ่งไปยังอีก ลองค้นหา CORS และดูว่ามีประโยชน์หรือไม่
Prestaul

54

หรือถ้าคุณต้องการส่งหัวข้อที่กำหนดเองสำหรับทุกคำขอในอนาคตคุณสามารถใช้สิ่งต่อไปนี้:

$.ajaxSetup({
    headers: { "CustomHeader": "myValue" }
});

วิธีนี้ทุกคำขอ ajax ในอนาคตจะมีส่วนหัวที่กำหนดเองเว้นแต่จะถูกแทนที่อย่างชัดเจนโดยตัวเลือกของคำขอ คุณสามารถหาข้อมูลเพิ่มเติมได้ajaxSetup ที่นี่


1
ที่ฉันต้องการทำสิ่งนี้จริง ๆ ดูเหมือนจะไม่ได้ผลจริง
เดินทาง

1
คุณควรตรวจสอบให้แน่ใจว่ามีการเรียก ajaxSetup ก่อนการโทร ajax จริง ผมไม่ทราบสาเหตุอื่น ๆ ทำไมนี้จะไม่ทำงาน :)
Szilard Muzsi

20

สมมติว่า JQuery ajax คุณสามารถเพิ่มส่วนหัวที่กำหนดเองเช่น -

$.ajax({
  url: url,
  beforeSend: function(xhr) {
    xhr.setRequestHeader("custom_header", "value");
  },
  success: function(data) {
  }
});

19

นี่คือตัวอย่างการใช้ XHR2:

function xhrToSend(){
    // Attempt to creat the XHR2 object
    var xhr;
    try{
        xhr = new XMLHttpRequest();
    }catch (e){
        try{
            xhr = new XDomainRequest();
        } catch (e){
            try{
                xhr = new ActiveXObject('Msxml2.XMLHTTP');
            }catch (e){
                try{
                    xhr = new ActiveXObject('Microsoft.XMLHTTP');
                }catch (e){
                    statusField('\nYour browser is not' + 
                        ' compatible with XHR2');                           
                }
            }
        }
    }
    xhr.open('POST', 'startStopResume.aspx', true);
    xhr.setRequestHeader("chunk", numberOfBLObsSent + 1);
    xhr.onreadystatechange = function (e) {
        if (xhr.readyState == 4 && xhr.status == 200) {
            receivedChunks++;
        }
    };
    xhr.send(chunk);
    numberOfBLObsSent++;
}; 

หวังว่าจะช่วย

หากคุณสร้างวัตถุของคุณคุณสามารถใช้ฟังก์ชัน setRequestHeader เพื่อกำหนดชื่อและค่าก่อนที่คุณจะส่งคำขอ


2
แม้ว่านี่อาจจะถูกต้องในปี 2011 แต่โดยทั่วไปแล้วก็เป็นความคิดที่ดีที่จะไม่พลิกโฉมวงล้อและใช้ห้องสมุด AJAX อย่าง Zepto หรือ jQuery แทน
Dan Dascalescu

4
ยกเว้นว่าคุณกำลังพยายามเพิ่มส่วนหัวในการโทร XHR2 ที่มีอยู่และไม่ต้องการเริ่มเขียนมันใหม่ทั้งหมดเพื่อใช้ jQuery เพียงแค่นั้น ... ณ จุดนี้ @gryzzly มีคำตอบที่ใช้ได้จริงเท่านั้น
roryhewitt

@AliGajani ปัญหาคือแอปพลิเคชันหรือไลบรารีบางอย่าง (เช่น THREE.js) ไม่ใช้$.ajax*ฟังก์ชัน b / c พวกเขาไม่ได้ขึ้นอยู่กับ jQuery และใช้ XHR แทนดังนั้นนี่เป็นตัวเลือกที่ถูกต้องเท่านั้นในกรณีเหล่านั้น
เบิร์น

1
@AliGajani นอกจากนี้ไม่ได้เป็นเพียงความเร็วในการโหลดเครือข่าย แต่เป็นเวลาในการแยกวิเคราะห์ของห้องสมุด นอกจากนี้หากคุณไม่ระวังสิ่งที่คุณเพิ่มคุณสามารถได้รับโครงการที่มีการพึ่งพามากเกินไป
Oztaco - Reinstate Monica C.

19

คุณสามารถทำได้โดยไม่ต้องใช้ jQuery แทนที่เมธอดการส่งของ XMLHttpRequest และเพิ่มส่วนหัวที่นั่น:

XMLHttpRequest.prototype.realSend = XMLHttpRequest.prototype.send;
var newSend = function(vData) {
    this.setRequestHeader('x-my-custom-header', 'some value');
    this.realSend(vData);
};
XMLHttpRequest.prototype.send = newSend;

12

คุณควรหลีกเลี่ยงการใช้ของ$.ajaxSetup()ที่อธิบายไว้ในเอกสาร ใช้สิ่งต่อไปนี้แทน:

$(document).ajaxSend(function(event, jqXHR, ajaxOptions) {
    jqXHR.setRequestHeader('my-custom-header', 'my-value');
});

6

สมมติว่าคุณหมายถึง "เมื่อใช้ ajax" และ " ส่วนหัวคำขอ HTTP " จากนั้นใช้headersคุณสมบัติในวัตถุที่คุณส่งผ่านไปยังajax()

ส่วนหัว (เพิ่ม 1.5)

ค่าเริ่มต้น: {}

แผนที่ของคู่คีย์ / ค่าเพิ่มเติมที่จะส่งไปพร้อมกับคำขอ การตั้งค่านี้ถูกตั้งค่าก่อนที่จะเรียกใช้ฟังก์ชัน beforeSend ดังนั้นค่าใด ๆ ในการตั้งค่าส่วนหัวสามารถเขียนทับได้จากภายในฟังก์ชั่น beforeSend

- http://api.jquery.com/jQuery.ajax/



1

คุณสามารถใช้การดึง js

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.