我相信很多人都尝试实现类似的方法,但可能会遇到很多困难,因为无法通过正常的 AJAX 请求来访问远程服务器并接收响应,这是因为浏览器的安全限制。下面我们将告诉你如何解决这个问题。
今天我们通过一个简单的例子来讲述如何创建支持跨域调用的 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 + '
'); - });
我们传递了三个参数,包括两个数字和一个函数引用,我们将在这个函数中接收到服务器的回应信息,然后可将它们显示出来。 结论 希望这个例子足够简单清晰,试试吧?
|