【问题标题】:$.getJSON parsererror trying to call API$.getJSON parsererror 试图调用 API
【发布时间】:2013-03-27 21:41:42
【问题描述】:

我正在尝试使用返回 JSON 但遇到一些麻烦的 Clipped API (http://clipped.me/api.html)。我正在使用 getJSON,在 Chrome 的 JS 控制台中我收到以下错误消息:

资源被解释为脚本,但使用 MIME 类型 text/html 传输:“http://clipped.me/algorithm/clippedapi.php?url=callback=jQuery1910859611126...emo-day-2013-still-looking-for-the-next-airbnb-or-dropbox/&_=1364420105379”。

未捕获的语法错误:意外的标识符

请求失败:解析器错误,错误:jQuery19108596111265942454_1364420105378 未被调用

这是我的 JS:

var clippedAPI = "http://clipped.me/algorithm/clippedapi.php?url=[URL]callback=?";
    $.getJSON(clippedAPI, "http://pandodaily.com/2013/03/26/y-combinator-demo-day-2013-still-looking-for-the-next-airbnb-or-dropbox/" ).done(function(json) {
            console.log("JSON Data: " + json.title );
    }).fail(function(jqxhr, textStatus, error){
            var err = textStatus + ', ' + error;
            console.log("Request Failed: " + err);
    });

这是我第一次尝试使用 API 或 JSON 制作东西,所以我真的不知道该怎么做。我试过谷歌搜索,但找不到任何东西。我实际发送的数据被我添加 callback=? 时出现的这个 jQuery 通知截断了?

【问题讨论】:

  • 跨域请求需要使用JSONP。我建议使用$.ajax() 而不是像$.getJSON 这样的快捷方法,因为您将对您正在尝试做的事情有更深入的了解。文档:api.jquery.com/jQuery.ajax
  • @Jasper: 如果callback 在 URL 中,$.getJSON 会发出 JSONP 请求。
  • 如果您尝试使用 JSONP 进行跨域请求,并且端点不支持 JSONP(或 CORS),那么您就不走运了。
  • @FelixKling 嗯,很高兴知道,我仍然建议不要使用快捷方式。但是,嘿,有时你会学到一些东西:)。
  • 谢谢,我试试看。

标签: javascript json api getjson


【解决方案1】:

您的参数不会简单地“猜测” [URL] 参数是什么。试试这个:

var clippedAPI = "http://clipped.me/algorithm/clippedapi.php";
$.ajax({
url: clippedAPI,
type: "GET",
dataType: "JSONP",
data: {
url: "http://pandodaily.com/2013/03/26/y-combinator-demo-day-2013-still-looking-for- the-next-airbnb-or-dropbox/"}
}).done(function(json) {
        console.log("JSON Data: " + json.title );
}).fail(function(jqxhr, textStatus, error){
        var err = textStatus + ', ' + error;
        console.log("Request Failed: " + err);
});

但是,即使这样也失败了,因为您的 API 端点似乎不理解/支持 JSONP 并且不提供 Access-Control-Allow-Origin 标头。因此,您有两个选择:

  • 您可以在本地反向代理 API 以解决跨域问题并通过标准 JSON
  • 您可以...嗯...获得更好的 API?向开发人员提交一张票以进行分类。

【讨论】:

  • 本地托管的代理通常很容易实现。让您的 JS 调用本地托管的服务器端脚本,并让该脚本进行 API 调用并将 API 的响应返回给您的 JS。
  • 谢谢,我就是这么想的。
  • 如果你使用的是 apache,mod_proxy 允许你反向代理它。如果您使用的是 nginx,那就更好了,proxy_pass 可以开箱即用!假设模块可用,两者都非常容易实现。
  • 我已经设置了一个 Apache 服务器并将站点放在正确的位置,但我完全不知道如何使用 mod_proxy 设置反向代理。我想我必须阅读更多关于这个主题的内容......
  • 这很简单:使用ProxyPass [source] [dest] 定义一个代理(你可以使用htaccess 的东西来防止它被本地主机以外的任何东西访问)。使用ProxyPassReverse 除了自动跟随重定向并相应地重写标头中的URI。记住跨域限制:同域,SAME PORT.
猜你喜欢
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多