今天我们通过一个简单的例子来讲述如何创建支持跨域调用的 JavaScript API。我相信很多人都尝试实现类似的方法,但可能会遇到很多困难,因为无法通过正常的 AJAX 请求来访问远程服务器并接收响应,这是因为浏览器的安全限制。下面我们将告诉你如何解决这个问题。
完整的示例代码下载:source.zip
一. PHP
首先我们编写一个简单的服务端程序:
<?php
// set possibility to send response to any domain
header('Access-Control-Allow-Origin: *');
if (version_compare(phpversion(), '5.3.0', '>=') == 1)
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
else
error_reporting(E_ALL & ~E_NOTICE);
// accept POST params
$sAction = $_POST['action'];
$iParam1 = (int)$_POST['param1'];
$iParam2 = (int)$_POST['param2'];
// perform calculation
$iResult = 0;
switch ($sAction) {
case 'sum':
$iResult = $iParam1 + $iParam2;
break;
case 'sub':
$iResult = $iParam1 - $iParam2;
break;
case 'mul':
$iResult = $iParam1 * $iParam2;
break;
case 'div':
$iResult = $iParam1 / $iParam2;
break;
}
// prepare results array
$aResult = array(
'result' => $iResult
);
// generate result
header('Content-type: application/json');
echo json_encode($aResult);
值得你关注的是第一行 PHP 代码中的自定义 HEAD ‘Access-Control-Allow-Origin’. 它允许发送回应到任意的服务器,甚至是不同域的。如果你要限制指定域名才能访问,也是在这里设置。接下来是简单的应用逻辑,接受参数并处理请求,这里我们实现的是最简单的加减乘除操作,返回的结果用 JSON 格式。
二. JavaScript
api.js
function do_sum(param1, param2, cfunction) {
// send ajax response to server
$.ajax({
type: 'POST',
url: 'http://www.script-tutorials.com/demos/301/api.php',
crossDomain: true,
dataType: 'json',
data: 'action=sum¶m1=' + param1 + '¶m2=' + param2,
success: function(json) {
// and evoke client's function
cfunction(json);
}
});
}
function do_sub(param1, param2, cfunction) {
// send ajax response to server
$.ajax({
type: 'POST',
url: 'http://www.script-tutorials.com/demos/301/api.php',
crossDomain: true,
dataType: 'json',
data: 'action=sub¶m1=' + param1 + '¶m2=' + param2,
success: function(json) {
// and evoke client's function
cfunction(json);
}
});
}
function do_mul(param1, param2, cfunction) {
// send ajax response to server
$.ajax({
type: 'POST',
url: 'http://www.script-tutorials.com/demos/301/api.php',
crossDomain: true,
dataType: 'json',
data: 'action=mul¶m1=' + param1 + '¶m2=' + param2,
success: function(json) {
// and evoke client's function
cfunction(json);
}
});
}
function do_div(param1, param2, cfunction) {
// send ajax response to server
$.ajax({
type: 'POST',
url: 'http://www.script-tutorials.com/demos/301/api.php',
crossDomain: true,
dataType: 'json',
data: 'action=div¶m1=' + param1 + '¶m2=' + param2,
success: function(json) {
// and evoke client's function
cfunction(json);
}
});
}
这是对服务器端方法的 JS 封装,我准备了 4 个 JavaScript 方法,分别是 do_sum, do_sub, do_mul 和 do_div. 每个方法对应一个服务器的函数。一般来说,首先我们需要设置服务器 API 的 URL,这里是 http://www.script-tutorials.com/demos/301/api.php ,然后需要设置 crossDomain 为 true,最后设置数据格式为 json。请注意第三个参数是 cfunction,这是一个客户端可定制的任意函数用来处理服务器端返回的数据。
三. 使用方法 (客户端)
现在服务器端已经准备好了,接下来看看客户端如何使用这个远程接口。
<script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
<script src="http://www.script-tutorials.com/demos/301/api.js"></script>
<script type="text/javascript">
$(document).ready(function() {
// execute method 1 (sum) by server
var param1 = 5;
var param2 = 10;
do_sum(param1, param2, function(data) {
$('#results').append(param1 + ' + ' + param2 + ' = ' + data.result + '
');
// execute method 2 (sub) by server
param1 = 25;
param2 = 15;
do_sub(param1, param2, function(data) {
$('#results').append(param1 + ' - ' + param2 + ' = ' + data.result + '
');
// execute method 3 (mul) by server
param1 = 8;
param2 = 5;
do_mul(param1, param2, function(data) {
$('#results').append(param1 + ' * ' + param2 + ' = ' + data.result + '
');
// execute method 4 (sub) by server
param1 = 33;
param2 = 11;
do_sub(param1, param2, function(data) {
$('#results').append(param1 + ' / ' + param2 + ' = ' + data.result + '
');
});
});
});
});
});
</script>
<div id="results"></div>
在这个例子中,我们使用的是服务器端的 JavaScript 函数,我们将上面的代码简化后的结果就是:
var param1 = 5;
var param2 = 10;
do_sum(param1, param2, function(data) {
$('#results').append(param1 + ' * ' + param2 + ' = ' + data.result + '
');
});
我们传递了三个参数,包括两个数字和一个函数引用,我们将在这个函数中接收到服务器的回应信息,然后可将它们显示出来。
结论
希望这个例子足够简单清晰,试试吧?
