2010-06-14 62 views
3

我是新來編寫AJAX應用程序。我計劃在客戶端使用jQuery,而在服務器端使用PHP。我想使用XML-RPC之類的東西來簡化我在調用服務器端代碼時的工作。理想情況下,我不關心傳輸層是使用XML還是JSON,還是使用更爲優化的格式。使用PHP和JS構建AJAX Web應用程序的良好RPC模型是什麼?

如果我正在編寫一個控制檯應用程序,我會使用一些工具來生成函數存根,然後我將在RPC服務器上實現,而客戶端將本機地調用這些存根。這提供了一個乾淨的分離。 AJAX世界中是否有類似的東西?

雖然在這個話題上,我將如何進行會話管理?我希望它儘可能透明。例如,如果我嘗試擊中需要有效會話的RPC端點,則應該在客戶端未傳遞有效會話cookie時拒絕該請求。

這會真正緩解我的應用程序開發。然後,我不得不使用原生JS函數來處理前端。在後端時,我可以簡單地實現RPC功能。

順便說一句我不希望使用Google Web Toolkit。我的應用程序不會在AJAX上非常沉重。

回答

0

我不會用XML-RPC。沒有必要。發送HTTP查詢參數(GET或POST)到服務器或可能的JSON對象,並得到JSON或HTML作爲響應。 PHP有編碼和解碼JSON的方法:json_encode()json_decode()

1

這是我的典型解決方案,所以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; 
} 

希望這有助於在註釋中有任何疑問,回覆,我會希望灑在一些情況較爲清淡。

+0

cletus,Redflag:謝謝你的迴應。 Dereleased:您的解釋非常有用。你用過GWT嗎?看看這個:http://code.google.com/webtoolkit/doc/latest/DevGuideServerCommunication。html#DevGuidePlumbingDiagram 有沒有類似的東西,我可以使用現成的庫? – 2010-06-14 18:02:33

相關問題