0

我正在尝试从另一个域内的服务器访问一些数据。

所以我有这个php代码:

header('Content-type: application/json');
$callback = $_GET[callback];
echo $callback . '(' . $CIPHERDATA . ')';

在客户端运行的 javascript 是这个

$.getJSON("http://mydomain.gr/zerobin-015/?24c3285?callback=?",function(jsondata){
    alert(jsondata.data);
    alert("hi");
});

警报不显示。唯一发生的事情是创建一个包含我需要的所有信息但我无法访问的脚本标签。

<script src="http://mydomain.gr/zerobin-015/?24c3285?callback=jsonp1335048265855&_=1335048265874">
({"data":"{\"iv\":\"smDkNQMt0MIbPABPbAb+xQ\",\"salt\":\"aoFfKV+jHhs\",\"ct\":\"Ns17UQZQN\/ktO2hUW+dPug\"}","meta":{"expire_date":1337635538,"postdate":1335043538}})
</script>

我的 json-p 格式有问题吗?这些数据的正确格式是什么,以便它们可以访问?

4

3 回答 3

2

你做得对。这只是 PHP 中的运行时错误。
在您的 PHP 脚本中,替换$GET[callback]$GET['callback']. 注意单引号。

编辑

查看您的网址,我会说您还需要替换它:

http://mydomain.gr/zerobin-015/?24c3285?callback=?

有了这个:

http://mydomain.gr/zerobin-015/?24c3285&callback=?

注意:第二个?被 & 取代。根据RFC3986,HTTP URL 的格式最多需要一个 ? 在任何网址中。这种情况可能会因为尾随 ? . $.getJSON()那个在运行时在调用中被 jQuery 取代。那场决赛?不会出现在最终到达网址中。所以最后你应该只有一个吗?.


编辑 2

我刚刚在您的 jsonp 端点上尝试了 HTTP GET。这是我使用的网址:

http://kasem.gr/vasilis-dev/zerobin-015/?xxxxxBigStringHerexxxx=&callback=foo

xxxxBigStringHerexxx替换为由 40 个明显随机字符和数字组成的字符串。我得到的结果:

jsonCallback({"data":"{\"iv\":\"smDkNQMt0MIbPABPbAb+xQ\",
                       \"salt\":\"aoFfKV+jHhs\",\"ct\":\"Ns17UQZQN\/ktO2hUW+dPug\"}",
              "meta":{"expire_date":1337635538,"postdate":1335043538}})

这告诉我你的 PHP 不正确。jsonCallback当我传递“foo”时,它用作回调函数名称。此外,由于某种原因,“数据”是一个序列化的 json 字符串。这似乎是一个不必要的步骤。但是功能不匹配是最重要的。

如果不清楚,我建议您阅读更多关于 JSONP 的内容

于 2012-04-22T00:36:01.837 回答
1

可能是服务器获取了错误的请求标头,因此未将 JSON 响应作为成功语句的一部分返回。我敢打赌,如果您为 AJAX 调用中的错误添加一个捕获,您将在那里看到 JSONP 响应。解决此问题的正确方法是确保将正确的 mimetype 标头发送到服务器,以便在正确的上下文中调用返回的 JSONP 回调。

于 2012-04-21T23:04:22.913 回答
0

问题出在数据格式上。应该由 php 提供的 json 字符串是:{"data":"{"iv":"smDkNQMt0MIbPABPbAb+xQ","salt":"aoFfKV+jHhs","ct": "Ns17UQZQNktO2hUW+dPug"}","meta":{"expire_date":1337635538​​,"postdate":1335043538}}

我在同一字符串上使用 json_encode 两次的 php 代码错误。

于 2012-04-23T23:31:44.823 回答