我正在尝试从另一个域中的服务器访问一些数据。
所以我有这个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 格式有问题吗?此数据的正确格式是什么,以便可以访问它们?
你做对了。这只是 PHP.
中的运行时错误在 PHP 脚本中,将 $GET[callback]
替换为 $GET['callback']
。 请注意单引号。
编辑
看看你的URL,我会说你还需要替换这个:
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 字符串。这似乎是一个不必要的步骤。 但功能不匹配是最重要的。
如果不清楚,我建议您多阅读一些有关JSONP的信息。
可能是服务器获得了错误的请求标头,因此没有返回 JSON 响应作为成功语句的一部分。我敢打赌,如果您在 AJAX 调用中为错误添加捕获,您会在那里看到 JSONP 响应。解决此问题的正确方法是确保将正确的 mimetype 标头发送到服务器,以便在正确的上下文中调用返回的 JSONP 回调。
问题出在数据格式上。php 应该提供的 json 字符串是: {"data":"{"iv":"smDkNQMt0MIbPABPbAb+xQ","salt":"aoFfKV+jHhs","ct":"Ns17UQZQNktO2hUW+dPug"}","meta":{"expire_date":1337635538,"postdate":1335043538}}
我使用的 php 代码的错误json_encode同一个字符串上两次。