2012-01-31 34 views
4

我必须发送(并接收)某些数据到使用JQuery和JSON的服务器。 目前为止工作,但不跨域,它必须是跨域。差异jsonp和简单的获取请求(跨域)

我看着如何解决这个问题,并找到JSONP。据我所见,使用JSONP我必须使用GET发送回调和数据(JQuery允许使用“POST”作为方法,但是当我检查Web流量时,我发现它实际上发送GET和everyting作为参数)。

JSONP还需要在服务器中进行更改,因为他们期待带有JSON数据的POST请求,并且他们必须实现某些内容来处理JSONP GET请求。

所以我想知道这和发送数据作为GET请求中的键值参数有什么区别?

使用回调的可能性有所不同吗?或者究竟是什么?

对不起有点丢失...提前致谢

回答

5

JSONP不是表单提交。这是一种通过GET请求告诉服务器如何为脚本标记生成内容的方式。返回的数据是JavaScript(不仅仅是JSON!)的一个有效载荷,它带有一个函数调用,您可以按照约定在GET请求中引用该函数。

JSONP的工作原理是因为它是一种不使用AJAX的黑客。这不是AJAX,你不应该为此而混淆,因为它在任何时候都使用XMLHttpRequest来发送数据,因为它不是而是。这是它如何绕过同源政策。

根据您必须支持的浏览器,您可以在服务器端实现跨源资源共享标头,这样您就可以在可信域中使用正常的AJAX调用。大多数浏览器(IE8,Firefox3.5 +等)都支持CORS。

如果您不想使用CORS或JSONP,您可以使用的另一种解决方案是编写一个PHP脚本或Java servlet,它将充当代理。这与从脚本打开新连接一样简单,将所有来自AJAX代码的传入参数复制到请求中,然后在脚本结尾处将响应转储回去。

+0

如果在服务器上添加标题很简单,为什么每个人都用JSONP困扰?据我了解与JSONP也有必要在服务器进行更改 – Ixx 2012-01-31 13:05:38

+0

代理解决方案不适用于我的情况,因为我需要该脚本可以在本地主机测试,并不是每个人在本地主机测试我的脚本是想安装代理... – Ixx 2012-01-31 13:08:32

+0

好的,我在这里http://www.json-p.org/找到了关于JSONP和CORS之间差异的解释。看起来CORS不是“那么简单” – Ixx 2012-01-31 13:19:45

2

我找到了一个解决跨域问题和JSON(而不是JSONP)的解决方案。 我只是用:

header('Access-Control-Allow-Origin: *'); 

我的JSON文件中(file.php),并把它称为是这样的:

var serviceURL = 'http://your-domain.com/your/json/location.php' 
$.getJSON(serviceURL,function (data) { 
    var entries = data; 
    //do your stuff here using your entries in json 
}); 

BTW:这是一个接收过程中,不发送。

+0

我认为这是CORS。这不完全是我要问的,但非常感谢你回答。 – Ixx 2012-02-01 15:51:17

+0

我已经使用jQuery Mobile将此解决方案实施到我的原生移动应用程序,并且它是由苹果公司推出的。我所有的数据都是由存储在服务器上的数据库中的php文件生成的JSON格式。我一直在努力寻找一种适用于跨域脚本的解决方案,而不是将所有的JSON请求都改为JSONP。 – aki 2012-02-02 08:23:15

+0

将标题脚本插入到我的php文件中就像魅力一样,现在我可以通过互联网请求我的json数据,甚至是移动本地应用程序。从我的角度来看,这是最好的解决方案,因为我可以修改de php.json数据生成器不受SQL注入或其他攻击的影响。如果你愿意,我可以发布一个php的例子来说明如何通过SQL回调保持安全性,并返回一个非常好的结构化JSON数据,你可以在任何地方使用(调用)! – aki 2012-02-02 08:24:06