簡體   English   中英

為什么我們將 null 傳遞給 XMLHttpRequest.send?

[英]Why do we pass null to XMLHttpRequest.send?

為什么send經常被稱為

xhr.send(null)

代替

xhr.send()

?

W3MDNMSDN都聲明它是可選的。 此外,ActiveX 控件似乎不需要參數

hr=pIXMLHTTPRequest.CreateInstance("Msxml2.XMLHTTP.6.0");
SUCCEEDED(hr) ? 0 : throw hr;

hr=pIXMLHTTPRequest->open("GET", "http://localhost/books.xml ", false);
SUCCEEDED(hr) ? 0 : throw hr;

hr=pIXMLHTTPRequest->send(); // <-- this line
SUCCEEDED(hr) ? 0 : throw hr;

send(null)的做法至少可以追溯到2005 年的 Google Maps ,但是被縮小了,沒有解釋:

Y.asynchronousTransform = function (qc, vb, kc, Nc, Ba) {
    if (m.type == 3) return;
    var cc = Y.getCached(kc);
    if (cc) {
        cc.transformToHTML(qc, vb);
        if (Nc) Nc();
        return
    }
    var yc = qa.create(Ba);
    var sa = Xd.create();
    nd('<a href="' + kc.xmlEscape() + '">' + kc.xmlEscape() + "</a>", 0);
    sa.open("GET", kc, true);
    sa.onreadystatechange = function () {
        if (sa.readyState == 4) {
            if (yc.isValid()) {
                try {
                    var Db = sa.responseXML;
                    var cc = Y.create(Db);
                    Y.cache(kc, cc);
                    cc.transformToHTML(qc, vb);
                    if (Nc) Nc()
                } catch (b) {}
            }
        }
    };
    sa.send(null)
}

如果您看一下 XMLHttpRequest 的舊規范,似乎 W3C 似乎並不要求該參數在某一點是可選的,這可能導致人們“以防萬一”提供顯式空值。

(搜索“應該支持發送”) http://web.archive.org/web/20060409155734/http://www.w3.org/TR/XMLHttpRequest/

我遇到的另一個可能的原因來自俄語頁面的翻譯,可在此處查看: 長谷歌翻譯鏈接(搜索“GET-Request for Version without ActiveX”)

當你發送一個沒有 ActiveX 的版本的 GET 請求時,你必須指定 null,否則你不能指定任何參數。 如果始終將 GET 指定為 null,則不會失敗:

我不知道這是否屬實,但如果 GET 參數包含在正文中,那么如果數據值為“未定義”,則正文可能不會生成,這似乎是合理的。

不幸的是,我在搜索中找不到任何更確定的信息。

不添加null會在舊版本的 Firefox 中引發異常。

這種行為早在 2002 年就存在,並且通過 Firefox 3 (2008) 存在

因此,如果您的 HTTP 請求方法是GET ,那么 HTTP 客戶端只需將數據附加到請求 URL(作為所謂的查詢字符串)就可以將數據發送到服務器,這意味着請求的正文將是空的,這就是為什么需要將該參數的值設置為null

但是,如果您的 HTTP 請求方法是POST ,那么您的請求數據將被放入請求正文中,最終將通過send函數發送到服務器。

干杯!

XMLHttpRequest.send() 方法發送請求。 如果請求是異步的(這是默認值),則該方法會在請求發送后立即返回。 如果請求是同步的,則此方法在響應到達之前不會返回。 send() 接受請求正文的可選參數。 如果請求方法是 GET 或 HEAD,則忽略該參數並將請求正文設置為 null。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM