问题
I'm using FeedEk
plugin for jQuery which uses the YQL API, to try and display three RSS feeds.
Most of the time things are ok but every once in a while I will get a results: null
from one of the three feeds, but usually the second and third ones to be called, very rarely the first. I have checked the feeds themselves and they are not showing any issues, I have also tested it on the Yahoo Console and it doesn't show an issue. It's not a call limit issue as I'm barely hitting 300 calls a day from my IP while testing.
I enabled diagnostics and the only thing I can see that is different with the result: null
feed is it has the following message in the info
section Using encoding from response content-type header (UTF-8) as XML document does not specify encoding.
Here is call that I'm making
SELECT channel.item FROM feednormalizer WHERE output="rss_2.0" AND url ="http://feeds.arstechnica.com/arstechnica/index" LIMIT 8
Here is the plugin code
/*
* FeedEk jQuery RSS/ATOM Feed Plugin v3.0 with YQL API (Engin KIZIL http://www.enginkizil.com)
* http://jquery-plugins.net/FeedEk/FeedEk.html https://github.com/enginkizil/FeedEk
* Author : Engin KIZIL http://www.enginkizil.com
*/
(function ($) {
$.fn.FeedEk = function (opt) {
var def = $.extend({
MaxCount: 5,
ShowDesc: true,
ShowPubDate: true,
DescCharacterLimit: 0,
TitleLinkTarget: "_blank",
DateFormat: "",
DateFormatLang:"en"
}, opt);
var id = $(this).attr("id"), i, s = "", dt;
$("#" + id).empty();
if (def.FeedUrl == undefined) return;
$("#" + id).append('<div style="width:100%;text-align:center;color:#424242;"><div class="loader"></div></div>');
var YQLstr = 'SELECT channel.item FROM feednormalizer WHERE output="rss_2.0" AND url ="' + def.FeedUrl + '" LIMIT ' + def.MaxCount;
$.ajax({
url: "https://query.yahooapis.com/v1/public/yql?q=" + encodeURIComponent(YQLstr) + "&format=json&diagnostics=true&callback=?",
dataType: "json",
success: function (data) {
$("#" + id).empty();
if (!(data.query.results.rss instanceof Array)) {
data.query.results.rss = [data.query.results.rss];
}
$.each(data.query.results.rss, function (e, itm) {
s += '<li><div class="itemTitle">' + itm.channel.item.title + '</div>';
if (def.ShowPubDate){
dt = new Date(itm.channel.item.pubDate);
s += '<div class="itemDate">';
if ($.trim(def.DateFormat).length > 0) {
try {
moment.lang(def.DateFormatLang);
s += moment(dt).format(def.DateFormat);
}
catch (e){s += dt.toLocaleDateString();}
}
else {
s += dt.toLocaleDateString();
}
s += '</div>';
}
if (def.ShowDesc) {
s += '<div class="itemContent">';
if (def.DescCharacterLimit > 0 && itm.channel.item.description.length > def.DescCharacterLimit) {
s += itm.channel.item.description.substring(0, def.DescCharacterLimit) + '...';
}
else {
s += itm.channel.item.description;
}
s += '</div>';
}
});
$("#" + id).append('<ul class="feedEkList">' + s + '</ul>');
}
});
};
})(jQuery);
And finally the XML returned from YQL for the failed result
/**/
jQuery112204319277675822377_1459586267516({
"query": {
"count": 0,
"created": "2016-04-02T08:37:48Z",
"lang": "en-US",
"diagnostics": {
"publiclyCallable": "true",
"url": {
"execution-start-time": "1",
"execution-stop-time": "59",
"execution-time": "58",
"content": "http://feeds.arstechnica.com/arstechnica/index"
},
"info": "Using encoding from response content-type header (UTF-8) as XML document does not specify encoding.",
"user-time": "60",
"service-time": "58",
"build-version": "0.2.430"
},
"meta": {
"url": {
"id": "http://feeds.arstechnica.com/arstechnica/index",
"status": "200",
"headers": {
"header": [{
"name": "Content-Type",
"value": "text/xml; charset=UTF-8"
}, {
"name": "ETag",
"value": "m+oG6+UhrscSbLRLhGlL3lvlwNo"
}, {
"name": "Last-Modified",
"value": "Sat, 02 Apr 2016 07:32:51 GMT"
}, {
"name": "Content-Encoding",
"value": "gzip"
}, {
"name": "Expires",
"value": "Sat, 02 Apr 2016 07:40:36 GMT"
}, {
"name": "Cache-Control",
"value": "private, max-age=0"
}, {
"name": "X-Content-Type-Options",
"value": "nosniff"
}, {
"name": "X-XSS-Protection",
"value": "1; mode=block"
}, {
"name": "Server",
"value": "ATS"
}, {
"name": "Date",
"value": "Sat, 02 Apr 2016 08:37:48 GMT"
}, {
"name": "Age",
"value": "0"
}, {
"name": "Connection",
"value": "close"
}, {
"name": "Via",
"value": "http/1.1 ec2.ycs.bf1.yahoo.net (ApacheTrafficServer [cSsNfU])"
}
]
}
}
},
"results": null
}
});
回答1:
After doing some more experimentation that only solution I can come up with is that the YQL doesn't like feeds that take longer to be served. Slower and high demand feeds are the ones that seem to present this issue.
I have a feeling it might be because the API code has a timeout where the code the powers the Console doesn't and happily waits, hence why it works with one and not the other.
Unfortunately it would seem the only solution is to be careful with the feeds you use.
来源:https://stackoverflow.com/questions/36371105/jquery-with-yql-rss-feeds-randomly-returning-null