【问题标题】:What is a good RPC model for building a AJAX web app using PHP & JS?使用 PHP 和 JS 构建 AJAX Web 应用程序的良好 RPC 模型是什么?
【发布时间】:2010-06-14 09:06:35
【问题描述】:

我是编写 AJAX 应用程序的新手。我计划在客户端使用 jQuery,而在服务器端使用 PHP。我想使用 XML-RPC 之类的东西来简化调用服务器端代码的工作。理想情况下,我不会在意传输层是使用 XML 还是 JSON,还是针对线路更优化的格式。

如果我正在编写一个控制台应用程序,我会使用一些工具来生成函数存根,然后我将在 RPC 服务器上实现这些存根,而客户端会本机调用这些存根。这提供了干净的分离。 AJAX 世界中是否有类似的东西可用?

关于这个主题,我将如何进行会话管理?我希望它尽可能透明。例如,如果我尝试访问需要有效会话的 RPC 端点,如果客户端没有传递有效的会话 cookie,它应该拒绝该请求。

这将真正简化我的应用程序开发。然后我必须使用本机 JS 函数简单地处理前端。在后端,我可以简单地实现 RPC 函数。

顺便说一句,我不想​​使用 Google Web Toolkit。我的应用在 AJAX 上不会非常繁重。

【问题讨论】:

    标签: php ajax javascript


    【解决方案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 响应转换为对象,但我建议从 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 请求方法,JS 应该不难理解。这种方法的一个好处是,如果您需要其他格式的响应(XML、URLEncoded 等),这很容易;就个人而言,我在请求中添加了一个“格式”参数并像这样解析它:

    // 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;
    }
    

    希望这会有所帮助,如有任何问题,请在 cmets 中回复,我希望能进一步了解情况。

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      例如phpxmlrpc 连同标准的session stuff

      【讨论】:

        猜你喜欢
        • 2012-09-30
        • 2021-03-16
        • 1970-01-01
        • 1970-01-01
        • 2020-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-14
        相关资源
        最近更新 更多