JQuery с YQL RSS-лентами случайным образом возвращает ноль

Я использую FeedEk плагин для jQuery, который использует YQL API, чтобы попытаться отобразить три RSS-канала.

В большинстве случаев все в порядке, но время от времени я получаю results: null от одного из трех каналов, но обычно называют второй и третий, очень редко первый. Я проверил сами каналы, и они не показывают никаких проблем, я также проверил это на Консоли Yahoo, и это не показывает проблему. Это не проблема ограничения звонков, так как я едва выполняю 300 звонков в день с моего IP во время тестирования.

Я включил диагностику, и единственное, что я вижу, отличается от result: null канал имеет следующее сообщение в info раздел Using encoding from response content-type header (UTF-8) as XML document does not specify encoding.

Вот позвони что я делаю

SELECT channel.item FROM feednormalizer WHERE output="rss_2.0" AND url ="http://feeds.arstechnica.com/arstechnica/index" LIMIT 8

Вот код плагина

/*
* 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);

И, наконец, XML возвращается из YQL для неудачного результата

/**/
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 ответ

Решение

После еще нескольких экспериментов, единственное решение, которое я могу придумать, заключается в том, что YQL не нравятся фиды, которые обслуживаются дольше. Ленты с более медленным и высоким спросом, кажется, представляют эту проблему.

У меня такое ощущение, что это может быть из-за того, что у кода API есть тайм-аут, когда код, которого не поддерживает консоль, и которого он с нетерпением ждет, следовательно, работает с одним, а не с другим.

К сожалению, казалось бы, единственное решение - быть осторожным с фидами, которые вы используете.

Другие вопросы по тегам