这是我的典型解决方案,所以 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 中回复,我希望能进一步了解情况。