AJAX中的304狀態(tài)碼代表著“未修改”(Not Modified)。當(dāng)AJAX請(qǐng)求中添加了緩存控制的頭信息,并且請(qǐng)求的資源在服務(wù)器端沒(méi)有被改變時(shí),服務(wù)器將返回304狀態(tài)碼,告訴瀏覽器直接使用緩存中的響應(yīng)結(jié)果。這樣可以減少不必要的帶寬消耗和網(wǎng)絡(luò)延遲,提高頁(yè)面加載的速度。
舉個(gè)例子,假設(shè)一個(gè)網(wǎng)站的主頁(yè)包含了一個(gè)AJAX請(qǐng)求來(lái)獲取最新的用戶(hù)消息。用戶(hù)每次打開(kāi)網(wǎng)站時(shí),這個(gè)AJAX請(qǐng)求將會(huì)被發(fā)送到服務(wù)器,并獲取到最新的用戶(hù)消息。然而,在某一天,由于服務(wù)器的負(fù)載增大,同時(shí)用戶(hù)的消息也沒(méi)有發(fā)生變化,服務(wù)器決定返回304狀態(tài)碼。這樣一來(lái),用戶(hù)的瀏覽器會(huì)直接使用緩存的用戶(hù)消息,而不是再次請(qǐng)求服務(wù)器,從而提高了頁(yè)面加載速度。
在實(shí)際開(kāi)發(fā)中,為了實(shí)現(xiàn)緩存控制,可以使用一些HTTP頭字段,比如If-None-Match和If-Modified-Since。當(dāng)瀏覽器第一次請(qǐng)求一個(gè)資源時(shí),服務(wù)器會(huì)生成該資源的唯一標(biāo)識(shí)符(通常使用ETag)和最后修改時(shí)間(Last-Modified)。瀏覽器會(huì)將這些信息存儲(chǔ)在緩存中,并在下次請(qǐng)求時(shí)帶上這些信息。
GET /api/messages HTTP/1.1 Host: example.com If-None-Match: "abc123" If-Modified-Since: Tue, 28 Sep 2021 10:00:00 GMT
服務(wù)器在收到請(qǐng)求后,根據(jù)If-None-Match和If-Modified-Since的值判斷資源是否發(fā)生了改變。如果沒(méi)有改變,則返回304狀態(tài)碼,否則返回最新的資源。
除了緩存控制,304狀態(tài)碼還可以用于實(shí)現(xiàn)條件GET。從字面意義上理解,條件GET就是在滿(mǎn)足某種條件的情況下才執(zhí)行GET請(qǐng)求。例如,一個(gè)網(wǎng)站的新聞頁(yè)面有一個(gè)AJAX請(qǐng)求,返回最新的新聞數(shù)據(jù)。為了提高性能,網(wǎng)站只允許在上一次請(qǐng)求之后有新的新聞時(shí)才返回最新的數(shù)據(jù)。即只有當(dāng)服務(wù)器端的新聞數(shù)據(jù)發(fā)生變化時(shí),才會(huì)返回非304狀態(tài)碼。
綜上所述,304狀態(tài)碼在AJAX中代表著“未修改”,用于緩存控制和條件GET。通過(guò)合理地使用304狀態(tài)碼,可以減少不必要的網(wǎng)絡(luò)請(qǐng)求,提高頁(yè)面加載速度和服務(wù)器性能。