今天看到 Detecting Ajax Events on the Server 這篇文章中提到一個有趣的好方法,當jQuery送出AJAX請求時會附上 X-Requested-With 請求檔頭,其值為「XMLHttpRequest」。

依據該文的描述在PHP中我們可以透過判斷 X-Requested-With 請求檔頭來分辨現在的請求是不是AJAX請求而給予不同的回應。

但這樣的判斷似乎不夠完整,在某些時候我們可能需要更進一步的判斷,jQuery所提供的AJAX方法不僅可以指定回傳的格式,它在送出AJAX請求時也會根據指定回傳格式的不同而傳出不同的Accept請求檔頭,因此在相同的概念下進一步聯想,其實我們還可以透過「Accept」請求檔頭來分辨現在的請求是什麼樣的類型。

以下依據該文的描述透過判斷 $_SERVER[ 'HTTP_X_REQUESTED_WITH' ] 來分辨現在的請求是不是AJAX請求而給予不同的回應。
例如:

if('XMLHttpRequest' === $_SERVER[ 'HTTP_X_REQUESTED_WITH' ]){
	// 回應 AJAX 請求,例如JSON格式
	echo json_encode(array('message' => 'hello'));
} else {
	// 回應一般請求,例如HTML格式
	echo 'hello';
}

當需要更進一步區分請求類型的不同時,將可以透過「Accept」請求檔頭來分辨現在的請求是什麼樣的類型。

以下我整理出jQuery中各種不同的AJAX方法所傳出的「Accept」請求檔頭:

jQuery code Accept header
$.getJSON(URL);

$.ajax({url:URL, dataType :’json’});

application/json, text/javascript, */*
$.getScript(URL);

$.ajax({url:URL, dataType :’script’}) ;

$.ajax({url:URL, dataType :’jsonp’}) ;

text/javascript, application/javascript, */*
$.get(URL); */*
$(‘#result’).load(URL);

$.ajax({url:URL, dataType :’html’});

text/html, */*
$.ajax({url:URL, dataType :’xml’}) application/xml, text/xml, */*

現在有了這個對照表,我們就可以根據Accept header來回應不同格式的結果:

switch ($_SERVER['HTTP_ACCEPT']){
	case 'application/json, text/javascript, */*':
		// 回應 JSON 格式
		break;
	case 'text/javascript, application/javascript, */*':
		// 回應 javascript 或 JSONP 格式
		break;
	case 'text/html, */*':
		// 回應 HTML 格式
		break;
	case 'application/xml, text/xml, */*':
		// 回應 XML 格式
		break;
}

參考文章:Detecting Ajax Events on the Serve

Tagged : , ,

你可能會感興趣

留下迴響





*