PHP、jQuery Ajax 和 json 跨域返回

Posted

技术标签:

【中文标题】PHP、jQuery Ajax 和 json 跨域返回【英文标题】:PHP, jQuery Ajax and json return over a cross domain 【发布时间】:2012-04-05 01:53:12 【问题描述】:

我在一台返回 json 结果的服务器上有我的 php 编码页面。 php文件名为:getInfoData.php,返回如下。

  echo json_encode($v);

不,我可以使用 $.getJSON(??) 读取 json 并在同一服务器上运行它,但我需要 php 页面与调用它的 js 页面位于不同的服务器上。

但是当我这样做时,我得到了跨域问题。

所以我更改了代码以使用以下(jsonp):

  $.ajax(
    url: 'FILE_LOCATION_ON_ANOTHER_SERVER',
    type: 'GET',
    crossDomain: true,
    dataType: 'jsonp',
    success: function()  console.log("Success"); ,
    error: function() console.log('Failed!'); 
);

但我没有看到任何东西,我只是通过控制台得到以下信息:

  http://www.THEURL.com/FOLDER/FILENAME.php?callback=jQuery171013088115444406867_1332256223342&_=1332256223343

还有一条消息说失败了!。

我做错了什么,如果可以解决这个问题,我该如何解决?

谢谢

【问题讨论】:

【参考方案1】:

我经常使用这个,但也许有更好的方法

<?php header('content-type: application/javascript; charset=utf-8');

$data = array(1, 2, 3, 4, 5, 6, 7, 8, 9);

echo htmlspecialchars($_GET['callback']) . '('.json_encode($data).')';

因为我看到你提供了一个回调参数,所以一切都应该没问题

【讨论】:

JSONP 实际上不是 JSON,它是被添加到脚本标签的 JavaScript 文件。您应该改用application/javascript MIME。 @Rocket 谢谢你的建议 :)【参考方案2】:

JSONP 实际上并不是 JSON。这有点“黑客”。 JSONP 实际上是一个 JavaScript 文件,可以下载并运行。

在您的 PHP 页面中,您应该被传递一个 callback 参数。您需要在其中“包装”您的 JSON。它应该是这样的:

func(json: data)

所以,你的 PHP 应该是这样的:

echo $_GET['callback'] . '(' . json_encode($v) . ')';

【讨论】:

以上是关于PHP、jQuery Ajax 和 json 跨域返回的主要内容,如果未能解决你的问题,请参考以下文章

如何在php中检测ajax跨域请求

带有 jquery 的仪表板跨域 AJAX

jquery中ajax跨域设置http header

使用 jQuery 和 AJAX 的跨域 PHP 调用

jquery的ajax和getJson跨域获取json数据

jquery下的ajax和jsonp实现与区别