第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

Ajax 發(fā)送請(qǐng)求

交互過程中,發(fā)送請(qǐng)求是第一步。那么,我們將如何構(gòu)造一個(gè)請(qǐng)求呢?

這一章節(jié),我們將一步一步來構(gòu)建一個(gè) Ajax 請(qǐng)求。學(xué)習(xí)本節(jié),你將學(xué)會(huì):

  • 如何通過 XMLHttpRequest 和 ActiveXObject 來構(gòu)造一個(gè)通用的 xhr 對(duì)象。

  • 如何通過 xhr 對(duì)象來發(fā)送 GET、 POST 等請(qǐng)求。

  • Content-type 在 Ajax 數(shù)據(jù)發(fā)送中的作用。

那么,接下來讓我們進(jìn)入本節(jié)的學(xué)習(xí)吧。

1. 構(gòu)造 xhr 對(duì)象

首先,我們需要構(gòu)造一個(gè) xhr 對(duì)象。具體方法就是通過 new 來實(shí)例化一個(gè) XMLHttpRequest 實(shí)例。

const xhr = new XMLHttpRequest();

問題來了,我們知道早期瀏覽器如 IE5、IE6 并沒有直接支持 XMLHttpRequest,如果我們直接使用 XMLHttpRequest 構(gòu)造函數(shù),很大可能在早期瀏覽器我們會(huì)得到一個(gè)未定義的報(bào)錯(cuò)。因此,我們需要通過一定兼容性的寫法來解決這個(gè)問題。

var xhr;
if (window.XMLHttpRequest) {
    // 如果存在 XMLHttpRequest,就直接使用 XMLHttpRequest
    xhr = new XMLHttpRequest();
} else if (window.ActiveXObject) {
    // IE
    // 如果不存在 XMLHttpRequest,但存在 ActiveXObject,則考慮 ActiveXObject 的情況
    
    // XMLHttp 版本
    var versions = [
        "Msxml2.XMLHttp.5.0",
        "Msxml2.XMLHttp.4.0",
        "Msxml2.XMLHttp.3.0",
        "Msxml2.XMLHttp",
        "Microsoft.XMLHttp"
    ];
    
    // 通過 for 循環(huán)嘗試生成某個(gè) XMLHttp 版本的 ActiveXObject 實(shí)例
    // try...catch.. 捕獲并消化掉 ActiveXObject 實(shí)例化失敗的錯(cuò)誤
    try {
        for (var i = 0; i < versions.length; i++) {
            xhr = new ActiveXObject(versions[i]);
            break;
        }
    } catch (error) {}
}

if (!xhr) {
    alert("當(dāng)前環(huán)境不支持初始化Ajax對(duì)象");
}

ActiveXObject 屬于微軟的私有拓展對(duì)象,只有在 IE 上才會(huì)有支持。該對(duì)象只能用于實(shí)例化自動(dòng)化對(duì)象。 在我們上面的代碼實(shí)現(xiàn)中,實(shí)例化一個(gè) ActiveXObject 我們會(huì)傳入?yún)?shù) Msxml2.XMLHTTP 或者 Microsoft.XMLHTTP 等,該參數(shù)代表著提供對(duì)象的應(yīng)用程序的名稱。

其中,Msxml2.XMLHttp.5.0Msxml2.XMLHttp.4.0、Msxml2.XMLHttp.3.0Msxml2.XMLHttpMicrosoft.XMLHttp分別代表著 XMLHttp高低版本。我們通過 for 循環(huán),在采用正常有效版本的時(shí)候跳出循環(huán)。同時(shí),使用 try…catch… 來捕獲消化不支持情況下的報(bào)錯(cuò)。

當(dāng)然,我們也可以包裝我們的 xhr 對(duì)象,比如,我們可以通過執(zhí)行匿名函數(shù):

var xhr = (function() {
    var hr; // 定義一個(gè)局部 xhr 對(duì)象, 這里命名 hr
    if (window.XMLHttpRequest) {
        hr = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        // IE
        var versions = [
            "Msxml2.XMLHttp.5.0",
            "Msxml2.XMLHttp.4.0",
            "Msxml2.XMLHttp.3.0",
            "Msxml2.XMLHttp",
            "Microsoft.XMLHttp"
        ];
        try {
            for (var i = 0; i < versions.length; i++) {
                hr = new ActiveXObject(versions[i]);
                break;
            }
        } catch (error) {}
    }
    return hr; // 返回我們最后的 xhr 對(duì)象,如果宿主環(huán)境不提供 XMLHttpRequest 及 ActiveXObject, 返回 undefined
})();

2. 發(fā)送一個(gè)請(qǐng)求

構(gòu)建了 xhr 對(duì)象之后,我們可以通過方法的調(diào)用來進(jìn)行請(qǐng)求的發(fā)送。

xhr.open('GET', 'http://www.example.com');
xhr.send();

這是最簡(jiǎn)單最典型的發(fā)送請(qǐng)求的做法。只需要短短 2 行代碼,我們就可以執(zhí)行一個(gè)請(qǐng)求發(fā)送動(dòng)作。

實(shí)際上 XMLHttpRequest.open 這個(gè)方法的參數(shù)不止兩個(gè)這么少,一共有 5 個(gè)參數(shù):

xhrReq.open(method, url, async, user, password);

這些參數(shù)分別代表著:

  • method: 代表HTTP請(qǐng)求的方法名,比如 GETPOST、 PUTDELETE。
  • url: 一個(gè)DomString,代表著要想向其發(fā)送請(qǐng)求的 url。
  • async: 表示是否異步。
  • user:用戶名,用于認(rèn)證用途。
  • password:密碼,用于認(rèn)證用途。

其中,user 和 password 都是用于認(rèn)證用途。而前 3 個(gè)參數(shù)是我們經(jīng)常都會(huì)使用到的。這里著重說的是參數(shù) async。默認(rèn)情況下,asynctrue,代表著請(qǐng)求將是異步的。當(dāng)然我們也可以設(shè)置為 false,這樣我們就可以同步請(qǐng)求了。然而,事實(shí)上我們應(yīng)該盡量不這么做,因?yàn)橥降恼?qǐng)求會(huì)阻塞我們的UI和一切用戶活動(dòng),造成的體驗(yàn)非常不好。

到目前為止,如果你也跟著做的話應(yīng)該能看到已經(jīng)可以發(fā)送一個(gè) Ajax 請(qǐng)求了,雖然它是失敗的,因?yàn)槟悴]有正確的服務(wù)能夠處理這個(gè)請(qǐng)求。如果你在瀏覽器上運(yùn)行,打開控制臺(tái),你應(yīng)該會(huì)得到這樣的一個(gè)效果:

圖片描述

3. GET 請(qǐng)求

在數(shù)據(jù)交互中,我們經(jīng)常會(huì)使用 GET 請(qǐng)求來查詢數(shù)據(jù),現(xiàn)在假設(shè)我們有一個(gè)簡(jiǎn)單的GET請(qǐng)求,查詢接口 http://localhost:8080/simple/get,附帶 query參數(shù)mk=慕課網(wǎng),那么我們可以構(gòu)建代碼塊:

xhr.open("GET", "http://localhost:8080/simple/get?mk=慕課網(wǎng)");

xhr.send();

查看效果圖

圖片描述

從上圖可以看到,瀏覽器控制臺(tái)面板上顯示,我們進(jìn)行 GET 發(fā)送請(qǐng)求的過程中,在 Headers 上,可以看到 Query String Parameters 附帶的信息完全正確,我們的 GET 請(qǐng)求構(gòu)造成功。

4. POST 請(qǐng)求

事實(shí)上我們除了要查詢數(shù)據(jù),提交數(shù)據(jù)也是非常重要。在 Ajax 中,我們通常使用 POST 方法來進(jìn)行數(shù)據(jù)創(chuàng)建工作。

4.1 POST 發(fā)送請(qǐng)求

話不多說,上代碼:

xhr.open("POST", "http://localhost:8080/simple/post");

xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

xhr.send("mk=慕課網(wǎng)&class=ajax");

查看效果圖

圖片描述

基本和上面 GET 請(qǐng)求類似,這里我們構(gòu)造了一個(gè) POST 請(qǐng)求,請(qǐng)求的 urlhttp://localhost:8080/simple/post,發(fā)送請(qǐng)求的參數(shù)有兩個(gè),分別為 mk=慕課網(wǎng)class=ajax。從瀏覽器的控制臺(tái)面板上可以看到,在 Headers 上,Form Data 部分正是我們要發(fā)送的數(shù)據(jù),數(shù)據(jù)發(fā)送正常。這里兩個(gè)地方需要注意:

  • send 方法接受可選參數(shù)作為請(qǐng)求主體,即發(fā)送到服務(wù)器的內(nèi)容。
  • Content-type 需要設(shè)置為請(qǐng)求主體類型, 這是因?yàn)槿绻辉O(shè)置的話會(huì)采取默認(rèn)值,在很多時(shí)候服務(wù)端可能無法解析參數(shù)。

XMLHttpRequest.setRequestHeader() 是請(qǐng)求HTTP 請(qǐng)求頭部的方法,因此設(shè)置 Content-type 自然也是通過調(diào)用這個(gè)方法來實(shí)現(xiàn)。該方法需要在 open()send() 之間使用。

4.2 Content-type

這一小節(jié)也可以當(dāng)做附錄來看,主要羅列一些常見的 Content-type 類型,給出一個(gè)參照,我們?cè)诹私庵?,在?shí)際使用 Ajax 的過程中,也可以隨時(shí)回來翻看:

Content-Type(Mime-Type) 備注
text/html Html 文本格式類型
text/xml Xml 文本格式類型
text/plain 純文本格式類型
image/jpeg Jpeg 圖片格式類型
image/png Png 圖片格式類型
image/gif Gif 圖片格式類型
application/json Json 數(shù)據(jù)格式類型
application/xml Xml 數(shù)據(jù)格式類型
application/xhtml+xml HXTML 數(shù)據(jù)格式類型
application/atom+xml Atom Xml 聚合格式類型
application/msword Word 文檔格式類型
application/pdf Pdf 文檔格式類型
application/octet-stream 二進(jìn)制數(shù)據(jù)格式類型
application/x-www-form-urlencoded Form表單數(shù)據(jù)被編碼成以 ‘&’ 分隔的鍵-值對(duì),發(fā)送到服務(wù)端
multipart/form-data 表單文件上傳使用的格式類型

5. 小結(jié)

  • Ajax 主要通過 XMLHttpRequest 來發(fā)送請(qǐng)求,必要的時(shí)候?yàn)榱思嫒莸桶姹?IE 瀏覽器, 我們可以啟用 ActiveXObject。
  • XMLHttpRequest 提供 open 方法,我們可以借助它來實(shí)現(xiàn) GET、POST、PUT、DELETE 等請(qǐng)求。
  • Ajax 在向服務(wù)端發(fā)送數(shù)據(jù)時(shí),比如 POST 、PUT , 需要通過 XMLHttpRequest.setRequestHeader() 設(shè)置 Content-type 的類型,服務(wù)端根據(jù)指定 Content-type進(jìn)行請(qǐng)求主體的解析。