Javascript 如何设置JSONP?

Javascript 如何设置JSONP?,javascript,json,firefox-addon,jsonp,Javascript,Json,Firefox Addon,Jsonp,我需要在服务器端做些什么来允许某人使用JSONP从该服务器获取数据。在用户端我还需要做什么?我想使用JSONP作为XMLHttpRequest的替代方案 由于同源策略,我的Firefox扩展无法实现。所以,人们推荐JSON,但在互联网上搜索教程和指南后,我很迷茫 谢谢你的帮助 在服务器端,您只需设置一个web资源(例如页面),它接受GET请求并使用JSON-p约定返回数据,即: callback({"data": "here"}); …其中函数名(“该示例中的回调”)通常取自其中一个查询字符串

我需要在服务器端做些什么来允许某人使用JSONP从该服务器获取数据。在用户端我还需要做什么?我想使用JSONP作为XMLHttpRequest的替代方案

由于同源策略,我的Firefox扩展无法实现。所以,人们推荐JSON,但在互联网上搜索教程和指南后,我很迷茫


谢谢你的帮助

在服务器端,您只需设置一个web资源(例如页面),它接受
GET
请求并使用JSON-p约定返回数据,即:

callback({"data": "here"});
…其中函数名(“该示例中的回调”)通常取自其中一个查询字符串参数(按照约定,参数“回调”),数据是文本(虽然从技术上讲,它可以是JavaScript对象文本中有效的任何内容,但JSON-p的约定是将自己限制为JSON中有效的内容)。例如,假设请求如下所示:

http://example.com/foo.php?callback=bar
function unwrap_jsonp(data) {
    eval(data);
}
在客户端,您必须向页面动态添加
script
元素,还必须添加由JSON-p响应触发的回调函数。通常,您希望为该函数指定一些随机名称,并在完成后将其删除


作为对这里关于堆栈溢出的另一个问题的回答。您可能需要稍微调整它以用于Firefox附加组件,但概念是相同的。

jsonp是带包装的json,因此您可以通过动态插入新的
标记来伪造对另一台服务器的ajax请求,src指向另一台服务器。包装器本质上使jsonp返回内容成为一个有效的javascript函数调用,可以执行该调用来提取其中的标准json数据

通常,在一个不安全的“只需演示”版本中,您会遇到如下情况:

http://example.com/foo.php?callback=bar
function unwrap_jsonp(data) {
    eval(data);
}
远程服务器将返回以下文本:

unwrap_json("{'this':'is','sparta':'!'}");
请注意,这是文本Javascript明文代码,执行该代码并将嵌入的JSON字符串“展开”回本机Javascript数据结构

大多数JSONP服务都允许通过查询字符串指定一个额外的参数来命名要封装响应的处理函数,例如

http://example.com/getjsonp.php?callback=unwrap_json

假设您的服务器正在运行PHP,您只需要添加“回调”GET请求

<?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).')';
上面的PHP代码只是为了演示,别忘了$\u GET['callback']


也就是说,如果您的问题只是相同来源的策略,您可能只需要从服务器端开始,一切都应该正常。

非常感谢!CORS解决方案解决了我的问题。这个答案假设为php,因此我更喜欢下面T.J.Crowder的答案。@Steven2163712如果你阅读标题以外的内容,OP问题实际上是CORS,而不管语言是什么。虽然TJ的答案更通用(IMO php已经足够通用),但它并不能解决OPs问题。