這是我的典型解決方案,所以YMMV。對於PHP端來說,我將各種遠程函數分解爲單獨的文件(例如'add_user.php','login.php','do_something.php'),每個文件都將響應數據設置爲預定義陣列名爲「迴應」,並動態包含的文件基礎上所要求的動作,如:
switch ($_POST['action']) {
case 'addUser':
require 'add_user.php';
break;
case 'login':
require 'login.php';
break;
// ... snip ...
default:
$response['result'] = 'badaction';
break;
}
echo json_encode($response);
各個文件旨在解析HTTP POST請求,用它做什麼,並返回一個JSON響應(這給雙方一個相當簡單的時間解析結果,因爲PHP會爲你自動準備POST值,而jQuery可以自動將JSON響應轉換爲對象,儘管我建議從開始拾取JSON2庫所以你不必擔心eval()
問題),他們是這個樣子:
<?php
if (basename(__FILE__) == basename($_SERVER['SCRIPT_FILENAME'])) {
die; // prevent the file from being accessed directly
}
// the do {} while(0); block allows us to set the response and then short-circuit
// execution without using a big ugly nest of if/else statements or a function
do {
if (!isset($_POST['something'],$_POST['parameter'],$_POST['whatever'])) {
$response['result'] = 'badinfo';
continue;
}
// ... snip ...
} while(0);
鑑於jQuery的非常簡單的AJAX請求方法時,JS不應該太難搞清楚。這種方法的一個好處是,如果您需要響應以其他格式(XML,URLEncoded等)進行響應,那很簡單;就個人而言,我添加了一個「format」參數請求並解析它,像這樣:
// EXPLICIT FORMAT
$format = strtolower(isset($_REQUEST['format']) ? $_REQUEST['format'] : null);
// IMPLICIT FORMAT
if (!$format) {
if (isset($_SERVER) && is_array($_SERVER) && array_key_exists('HTTP_ACCEPT',$_SERVER)) {
$accept = $_SERVER['HTTP_ACCEPT'];
if (stripos($accept, 'application/json') !== false || stripos($accept, 'text/javascript') !== false) {
$format = 'json';
}
}
if (!$format) {
$format = 'url';
}
}
switch ($format) {
case 'json':
echo json_encode($response);
break;
case 'url':
default:
echo http_build_query($response);
break;
}
希望這有助於在註釋中有任何疑問,回覆,我會希望灑在一些情況較爲清淡。
cletus,Redflag:謝謝你的迴應。 Dereleased:您的解釋非常有用。你用過GWT嗎?看看這個:http://code.google.com/webtoolkit/doc/latest/DevGuideServerCommunication。html#DevGuidePlumbingDiagram 有沒有類似的東西,我可以使用現成的庫? – 2010-06-14 18:02:33