>我有一个用PHP创建的JSON API,它返回
?({"a":"b"})
当我输入时
"http://mylink.php?callback=?"
在浏览器中。但是当我从桌面应用程序(使用 $.ajax)提供相同的链接时,不会返回结果。创建 JSON API 的 PHP 代码是
<?php
header('Content-Type: application/javascript'); // Also tried application/json
$results = array();
$results['a'] = 'b';
$encoded = json_encode($results);
$encoded_callback = '?' . '(' . $encoded . ')';
echo $encoded_callback;
return $encoded_callback;
?>
javascript 代码只包含
$.ajax({
url:url,
dataType:"jsonp",
success:function(data){
... some printing ...
}
});
到目前为止,当我使用另一个 JSON API(不是由我创建的)尝试它时,它工作正常。所以我假设问题出在我的 API 上。
怎么了?我觉得缺少一些东西,以便可以进行通信,但我不知道是什么以及在哪一端(服务器或客户端)。
$encoded_callback = '?' . '(' . $encoded . ')';
?
在 JavaScript 中不是有效的函数名称(它是一个运算符)。你应该把回调参数中指定的函数名放在那里(这不是?
,?
告诉jQuery生成一个唯一的名称)。
$encoded_callback = $_GET['callback'] . '(' . $encoded . ')';
更好的是:停止使用JSONP。绕过同一源策略是一种黑客攻击,该策略在许多方面限制了您(包括仅允许GET请求和公开您的API,而不是能够将其限制为特定来源)。
CORS 为跨源请求提供了一种非黑客的、完全标准的方法,您应该改用这种方法。