【问题标题】:JSON API (created in PHP) does not return results when requestedJSON API(在 PHP 中创建)在请求时不返回结果
【发布时间】:2016-06-01 11:47:06
【问题描述】:

我有一个用 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 上。

怎么了?我觉得缺少某些东西以便可以保持通信,但我不知道是什么以及在哪一侧(服务器或客户端)。

【问题讨论】:

  • 如果你说它在你的前端 JS 中不起作用,至少向我们展示它会很好。
  • @SergeyVidusov 我编辑了我的帖子并添加了 JS 代码。让我指出,我没有包含它的原因是,当我尝试请求不同的 JSON API(不是我创建的,而不是 PHP 中的)时,相同的代码可以正常工作。所以我坚信问题在于我的 API 而不是 JS 代码。感谢您的反馈。

标签: php json api callback jsonp


【解决方案1】:
$encoded_callback = '?' . '(' . $encoded . ')';

? 不是 JavaScript 中的有效函数名(它是 an operator)。您应该将回调参数中指定的函数名称放在那里(不是?? 告诉 jQuery 生成一个唯一名称)。

$encoded_callback = $_GET['callback'] . '(' . $encoded . ')';

更好的是:停止使用 JSONP。绕过同源策略是一种技巧,它在许多方面限制了你(包括只允许 GET 请求和公开你的 API,而不是能够将其限制在特定的来源)。

CORS 为跨域请求提供了一种非 hacky、完全标准的方法,您应该改用它。

【讨论】:

  • 感谢您的反馈。首先,我请求的链接总是有“?”作为回调参数,因为它在程序中是稳定的(如常量)。所以服务器知道它会一直使用'?'作为回调函数。其次,我尝试使用回调“?”请求不同的 API(不是我创建的)。它工作正常。所以我认为问题出在我的 API 上。最后,我也尝试过 CORS 而不是 JSONP,但问题仍然存在:/ 我会记住这是一个更好的做法,但是我首先想让整个事情正常工作......
  • 你的意思是我应该使用“$_GET['callback']”而不是“?”即使我知道回调将永远是“?” ?
  • @Marievi — “总会有 '?'作为回调参数,因为它在程序中是稳定的(就像一个常量)”——不,你不会。正如我在答案中解释的那样,jQuery 会生成一个唯一的名称来替换它。
  • @Marievi — “我尝试使用回调“?”请求不同的 API(不是我创建的),它工作正常。” — 这是因为 jQuery 将其替换为有效名称,并且服务器端代码您没有编写使用了 jQuery 提供的名称,而不是硬编码 ?,这不是一个有效的函数名称。
  • @Marievi — “你的意思是我应该使用 "$_GET['callback']" 而不是 "?" " — 是的,我什至编写了代码来在答案中证明这一点。
猜你喜欢
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 2022-09-24
相关资源
最近更新 更多