【问题标题】:Can't access data from json-p call无法从 json-p 调用访问数据
【发布时间】:2012-05-03 01:46:39
【问题描述】:

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

所以我有这个 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 格式有问题吗? 这些数据的正确格式是什么以便可以访问?

【问题讨论】:

  • 返回的jsonp数据是否应为上述格式:({"data":"{\"iv\":\"smDkNQMt0MIbPABPbAb+xQ\",\"salt\":\ "aoFfKV+jHhs\",\"ct\":\"Ns17UQZQN\/ktO2hUW+dPug\"}","meta":{"expire_date":1337635538​​,"postdate":1335043538}}) 还是应该像这:([{"数据":"{\"iv\":\"smDkNQMt0MIbPABPbAb+xQ\",\"salt\":\"aoFfKV+jHhs\",\"ct\":\"Ns17UQZQN\/ ktO2hUW+dPug\"}","meta":{"expire_date":1337635538​​,"postdate":1335043538,"remaining_time":2544592}}])
  • 也许吧。也许不吧。该示例中的数据是一个 jsonified 字符串。在我看来,双重 jsonification 是不必要的。
  • jsonified 字符串是什么意思?jquery 应该如何理解这些数据?

标签: javascript jquery cross-domain jsonp getjson


【解决方案1】:

你做得对。 这只是 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 不正确。当我传递“foo”时,它使用jsonCallback 作为回调函数名称。此外,由于某种原因,“数据”是一个序列化的 json 字符串。这似乎是一个不必要的步骤。但功能不匹配是最重要的。

如果不清楚,建议你read a little more about JSONP

【讨论】:

  • 我做了你所说的两个更改,但成功功能仍然不起作用,我无法使用 jsondata.data 或 jsondata.meta 访问 json 中的数据
  • 我已经用我的真实代码做了一个小提琴。你需要 firebug 才能在 iframe 的头部看到创建的
  • re: 出于一个奇怪的原因 ...它只适用于 jquery 的反向版本的原因是什么?你知道原因还是你的意思是暗示“出于某些未知原因”?
  • 1.“jsonCallback”在那里,因为在你尝试的时候我正在试验我的 php 代码。现在试试,你会发现没有“jsonCallback”。2.我没有知道为什么它只适用于 back-revs。我想他们改变了 json 格式的严格性。3.当请求最后带有 callback=foo 时,结果应该是什么?
【解决方案2】:

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

【讨论】:

  • 这使得脚本在 chrome 上创建一个带有 json 的脚本标签。但是警报命令仍然不起作用。我无法使用 jsondata.data 或 jsondata 访问 json 中的数据。元
  • 我所做的是将 php 标头更改为“header('content-type: application/json; charset=utf-8');”在 php 上。我想这就是你的意思。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2017-08-18
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多