用 PHP 和 JS 建立 AJAX Web 应用程序,哪种 RPC 模型比较好?

3
我是一名新手编写AJAX应用程序。我计划在客户端使用jQuery,而在服务器端使用PHP。我想使用类似XML-RPC的东西来简化我的调用服务器端代码的工作。理想情况下,我不会关心传输层是否使用XML或JSON或更优化的格式。
如果我编写控制台应用程序,我会使用某些工具生成函数存根,然后在RPC服务器上实现这些存根,而客户端则会本地调用这些存根。这提供了一个清晰的分离。在AJAX世界中是否有类似的东西可用?
在这个话题上,我该如何处理会话管理?我希望它尽可能透明。例如,如果我试图访问需要有效会话的RPC终点,则如果客户端未传递有效的会话cookie,则应拒绝请求。
这将极大地简化我的应用程序开发。然后,我只需使用本机JS函数处理前端。在后端,我可以简单地实现RPC函数。
顺便说一下,我不想使用Google Web Toolkit。我的应用程序不会非常重视AJAX。
3个回答

2
这是我的典型解决方案,因此可能会有所不同。
对于PHP端,我将各种远程函数分解成单独的文件(例如'add_user.php','login.php','do_something.php'),每个文件都将响应数据设置到预定义的数组'response'中,并根据请求的操作动态地包含这些文件,例如:
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响应转换为对象,尽管我建议从json.org获取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请求方法,JavaScript应该不难理解。这种方法的一个好处是,如果您需要响应以其他格式(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是否有类似的东西可以使用现成的库来完成? - void_ptr

0

0

我不会使用XML-RPC。没有必要。发送HTTP查询参数(GET或POST)到服务器,可能是一个JSON对象,并获得JSON或HTML作为响应。PHP有编码和解码JSON的方法:json_encode()json_decode()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接