【问题标题】:Having problems requesting JSONP from a remote server. $.ajax() silently failing, what am I doing wrong?从远程服务器请求 JSONP 时遇到问题。 $.ajax() 默默地失败了,我做错了什么?
【发布时间】:2015-11-11 18:30:12
【问题描述】:

我正在尝试使用 jQuery AJAX 方法通过 Web API 访问远程服务器。 API 是私有的,所以我不能给你我正在使用的 URL,但这里是一个例子:

https://api.somecompany.com/v2/search?oauth_token=OAUTH_TOKEN&keyword=KEYWORD&limit=LIMIT

API 支持 JSONP 并通知用户使用 JSONP 时 URL 格式应为:

https://api.somecompany.com/v2/search?oauth_token=OAUTH-TOKEN&keyword=KEYWORD&limit=LIMIT&callback=callbackFunction

我知道我的 Oauth 令牌是有效的,因为当我在浏览器中运行 URL 时,它会显示所需的 JSON,并且我知道 JSON 是有效的,因为我已经使用 JSONLint 进行了检查。使用第二个 URL 的浏览器中的数据格式如下所示:

callbackFunction({
"meta":{...}
"items":[...]
})

我正在尝试使用 jQuery 从 API 中以 JSONP 形式获取这些数据,但它似乎无法正常工作,我终生无法弄清楚。我使用的代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta content="text/html;charset=utf-8" http-equiv="Content-Type">
    <meta content="utf-8" http-equiv="encoding">
    <title>Template</title>
    <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
    <script type="text/javascript" src="http://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
    <script type="text/javascript">
    $(function()
    {
        $.ajax({
            type: 'GET',
            url: 'https://api.somecompany.com/v2/search?oauth_token=OAUTH-TOKEN&keyword=KEYWORD&limit=10',
            dataType: 'jsonp',
            success: function(data)
                     {
                         alert('Success!');
                     },
            error: function (data, textStatus, errorThrown){
                         alert(textStatus);
                   },
           complete: function(data, textSearch){
                        alert(data.resonseText);
                        alert(textStatus);
                     }
           });

    });     
    </script>
</head>
<body>
</body>
<html>

除了 (callback=?) 之外,该 URL 与第二个示例相同。我知道在 HTML 代码中编写一个完整的脚本很麻烦,但我只是想开始这个,它简化了我的工作。运行此代码时,我绝对不会收到任何警报。它甚至不会在控制台上返回错误。我用另一个不需要回调函数的 API 尝试了这个,我收到了成功警报。我的猜测是它与包装器有关,但我不太确定具体出了什么问题。我究竟做错了什么?你建议我尝试什么?我对 JavaScript/jQuery 很陌生,所以如果我犯了非常愚蠢的错误,请尽量放轻松。我也试过用 $.getJSON() 来做这个并且遇到了同样的问题。我已经尝试在函数中使用 console.log() 并且没有收到任何反馈。帮助!

编辑:我在 HTML 文档中使用的 url 已更新。如下:

https://api.somecompany.com/v2/search?oauth_token=OAUTH-TOKEN&keyword=KEYWORD&limit=10

我也尝试过使用网址:

https://api.somecompany.com/v2/search?oauth_token=OAUTH-TOKEN&keyword=KEYWORD&limit=10&callback=?

这似乎也不起作用。只显示控制台:

GET http://code.jquery.com/jquery-latest.min.js [HTTP/1.1 304 Not Modified 34ms]

GET http://code.jquery.com/ui/1.11.4/jquery-ui.js [HTTP/1.1 304 Not Modified 35ms]

如果我应该添加更多更新,请告诉我。

【问题讨论】:

  • url 变量的内容是什么样的?问题中的代码,如果按字面意思使用(因为它看起来像一个完整的测试页),将会失败,因为 url 完全未定义。但我认为你只是为了这个问题把事情剪得太多了......
  • 您在开发者控制台中看到了什么?
  • API 是否真的返回 JSONP?我们无法判断,因为您隐藏了 URL 并且没有显示它返回的内容(您应该能够使用开发人员工具中的 Net 选项卡来提取)。
  • 您是否查看过网络选项卡中请求的响应选项卡?您的控制台没有显示错误的事实有点令人惊讶。它应该调用成功,或者在 jsonp 请求的情况下在控制台中打印语法错误。 (那个或网络错误,但你已经排除了)
  • Quentin:很遗憾,api 是专有信息,我无法提供 url。即使我这样做了,文档也是私有的。 API JSONP 支持的文档非常小,我在 HTML 代码上方用我自己的话给出了所有这些。

标签: javascript jquery json ajax jsonp


【解决方案1】:

我的猜测是您实际上已经在 URL 中包含了 &amp;callback=callbackFunction 部分,因为这是他们的文档所说的。

你不用 jQuery 来做这件事,你让 jQuery 为你管理它。它将附加一个带有自动生成函数名称的callback 参数,自动生成函数,并为您处理所有管道。

所以你的url 应该是https://api.somecompany.com/v2/search?oauth_token=OAUTH-TOKEN&amp;keyword=KEYWORD&amp;limit=LIMIT(没有&amp;callback=callbackFunction),因为你告诉jQuery你正在使用JSONP,它会为你做其他的工作。

【讨论】:

  • 我认为我的解释不是很清楚,所以我很抱歉,但我实际上已经尝试过你之前提到的方式,我得到了同样的回应。您还有其他建议吗?
猜你喜欢
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-04-05
相关资源
最近更新 更多