我需要在服务器端做些什么来允许其他人通过JSONP获取数据。同时,我在用户端需要做些什么呢?我希望使用JSONP作为XMLHttpRequest的替代方法。
由于同源策略的限制,这种方法在Firefox扩展程序中无法正常工作。因此,有人建议我使用JSON,但在网上搜索教程和指南后,我感到有些迷茫。
谢谢您的帮助!
由于同源策略的限制,这种方法在Firefox扩展程序中无法正常工作。因此,有人建议我使用JSON,但在网上搜索教程和指南后,我感到有些迷茫。
谢谢您的帮助!
<?php header('content-type: application/json; charset=utf-8');
$data = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
echo $_GET['callback'] . '('.json_encode($data).')';
而在客户端(使用jQuery):
$.ajax({url: 'http://site.com/data.php', dataType:'jsonp'});
上面的 PHP 代码只是演示用的,请不要忘记 过滤 $_GET['callback']。
话虽如此,如果你的问题只涉及同源策略,你可能只需要从服务器端允许跨域请求,那么一切都应该能正常工作。
GET
请求并使用JSON-P约定返回数据即可。JSON-P约定如下:callback({"data": "here"});
......其中函数名(在该示例中为“callback”)通常取自查询字符串参数之一(按照惯例,参数为“callback”),数据是JSON文本(尽管技术上可以是任何在JavaScript对象文字中有效的内容,但使用JSON -P的惯例是限制您自己使用JSON中有效的内容)。例如,假设请求如下:
http://example.com/foo.php?callback=bar
这将调用页面foo.php
(不必是PHP,可以是 任何动态服务器端系统),告诉它我们要调用的函数是“bar”。我们的响应将是:
bar({"data": "here"});
JSONP 是带有包装器的 JSON,因此您可以通过动态插入新的 <script>
标签并将其指向另一个服务器的 src,来模拟对另一个服务器的 Ajax 请求。包装器本质上使 jsonp 返回的内容成为一个有效的 JavaScript 函数调用,从而可以执行提取其中的标准 JSON 数据。
通常,在不安全的“仅供演示”的版本中,您会有以下内容:
function unwrap_jsonp(data) {
eval(data);
}
unwrap_json("{'this':'is','sparta':'!'}");
http://example.com/getjsonp.php?callback=unwrap_json