无法正确获取JSON / JSONP

时间:2013-01-05 03:49:46

标签: javascript jquery ajax json api

我正在尝试/尝试学习如何与API进行交互,而我正陷入原点。我正在尝试从Fever Public API中提取数据以获取订阅的RSS源列表。 API似乎很简单 - http://feedafever.com/api

我可以使用那里提供的小部件来获取数据,但是当我尝试编写自己的代码,让我用Javascript存储数据时,一切都崩溃了 - 我似乎无法从服务器获得响应

我在http://jsfiddle.net/WZHKA/使用我的代码启动了一个JSFiddle。我只想暂时返回JSON对象,我可以从那里开始。为方便起见,下面的功能如下。

(它有临时登录详细信息,因为我认为他们是需要的 - 无论如何RSS都不是私有的)

任何帮助都会很棒!我被卡住了,这似乎是所有教程所说的。

谢谢!

function buildAPI() {

// FEVER INSTALLATION CONFIG
var url     = 'fever.tommaitland.net/fever';
var email   = 'tommaitland@me.com';
var pass    = 'testpassword';
var args    = 'groups&feeds';
var pargs   = '';
var format = '';

if (!url.match(/^https?:\/\//)) url = 'http://' + url;
if (!url.match(/\/$/)) url += '/';

//var format = $$('format').checked ? '=xml' : '';

var api_key = MD5(email+':'+pass);
pargs = 'api_key=' + api_key + '&' + pargs;

url += '?api' + format +'&' + args;

$.ajax({
    type: 'POST',
    url: url,
    data: pargs,
    success: function(data) {
        document.write(data);
    },
    dataType:'jsonp'
});

return false; 

};

$(document).ready( function() {
buildAPI();
});

1 个答案:

答案 0 :(得分:2)

不幸的是,我认为feedafever的api服务器设置有问题。我悲观地认为你可以与api交互的唯一方法是使用iframe,测试小部件就是这样做的。让我解释原因。

首先,api服务器没有设置它的响应头来接受跨域访问。他们应该做点什么

response.set_header("Access-Control-Allow-Origin","*")

在服务器端接受跨域访问。由于他们没有这样做,你必须使用jsonp来避免not allowed by Access-Control-Allow-Origin问题。

但是,当请求将jsonp作为响应数据类型时,api服务器应响应“真正的”jsonp,这意味着它们应该在服务器端执行某些操作,如

response.set_header("Content-Type", "text/javascript")

用javascript标签包装json(假设它是{"foo":"bar"}

JSONP({"foo":"bar"}) // the name JSONP is not fixed, you can name it whatever you like

jQuery会在网址中添加callback=JSONP作为参数,并自动执行JSONP作为ajax回调。注意:由于JSONP是作为javascript函数提供的,因此它仅适用于http GET

在您的情况下,feedafever将其内容类型设置为text/json,而Chrome需要脚本,因此您遇到Uncaught SyntaxError: Unexpected token :错误。

简而言之,这不是你的错。正确使用此api的唯一选择是iframe。