我正在尝试/尝试学习如何与 API 交互,但陷入了第一步。我正在尝试从 Fever Public API 提取数据以获取订阅的 RSS 源列表。 API 看起来非常简单 - http://feedafever.com/api .
我可以使用那里提供的小部件获取数据,但是当我尝试编写自己的代码来使用 Javascript 存储数据时,一切都崩溃了 - 我似乎无法从服务器获得响应.
我用我的代码启动了一个 JSFiddle http://jsfiddle.net/WZHKA/ 。我现在只想返回 JSON 对象,然后我就可以从那里开始。为了方便起见,该功能也在下面。
(它有临时登录详细信息,因为我认为需要它们 - RSS 无论如何都不是那么私密)
任何帮助都会很棒!我被困住了,这似乎是所有教程所说的要做的事情。
谢谢!
function buildAPI() {
// FEVER INSTALLATION CONFIG
var url = 'fever.tommaitland.net/fever';
var email = '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="02766d6f6f636b766e636c66426f672c616d6f" rel="noreferrer noopener nofollow">[email protected]</a>';
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();
});
最佳答案
不幸的是,我认为 feedafever 的 api 服务器设置有问题。我悲观地认为与 api 交互的唯一方法是使用 iframe,测试小部件就是这样做的。让我解释一下原因。
首先,api服务器没有设置其响应头来接受跨域访问。他们应该做类似的事情
response.set_header("Access-Control-Allow-Origin","*")
在服务器端接受跨域访问。由于他们没有这样做,因此您必须使用 jsonp 来避免 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 将在 url 中添加 callback=JSONP
作为参数,并自动执行 JSONP
作为 ajax 回调。注意:由于 JSONP 作为 javascript 函数提供,因此它仅适用于 http GET
。
在您的情况下,feedafever 将其内容类型设置为 text/json
,而 Chrome 需要脚本,因此您收到 Uncaught SyntaxError: Unexpected token :
错误。
简而言之,这不是你的错。可以正确使用此 api 的唯一选项是 iframe。
关于javascript - 无法正确获取 JSON/JSONP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14168374/