Adobe Air, как проверить, если URL-адрес в сети \ дает какой-либо ответ существует? - PullRequest
2 голосов
/ 23 мая 2010

У меня есть URL, который я хочу проверить, если он живой. Я хочу получить значение bool. Как это сделать?

Ответы [ 2 ]

3 голосов
/ 01 сентября 2011

Важным моментом, который не учитывает ответ Джорджа, является URLRequestMethod . Если кто-то пытается проверить существование довольно больших файлов (например, медиа-файлов), а не только веб-страницы, вы должны убедиться, что для свойства method для URLRequest установлено * 1006. * URLRequestMethod.HEAD .

Как указано в протоколе HTTP1.1 :

Метод HEAD идентичен GET, за исключением того, что сервер НЕ ДОЛЖЕН возвращать тело сообщения в ответе.

Следовательно, если вы действительно хотите проверить существование URL-адреса, это путь.

Для тех, кому нужен прописанный код:

var _request:URLRequest = URLRequest(url);
_request.method = URLRequestMethod.HEAD; // bandwidth :)

В противном случае ответ Джорджа является хорошим ориентиром.

Примечание: Этот конкретный URLRequestMethod доступен только в AIR.

3 голосов
/ 03 июля 2010

Вы можете использовать URLLoader и прослушивать события, чтобы проверить, загружается ли он, и если нет, в чем может быть проблема. Было бы удобно сначала использовать AIRMonitor, чтобы убедиться, что компьютер клиента в первую очередь подключен.

Вот класс, который я начал писать, чтобы проиллюстрировать идею:

package  
{
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.HTTPStatusEvent;
    import flash.events.IEventDispatcher;
    import flash.events.IOErrorEvent;
    import flash.events.SecurityErrorEvent;
    import flash.net.URLLoader;
    import flash.net.URLRequest;

    /**
     * ...
     * @author George Profenza
     */
    public class URLChecker extends EventDispatcher
    {
        private var _url:String;
        private var _request:URLRequest;
        private var _loader:URLLoader;
        private var _isLive:Boolean;
        private var _liveStatuses:Array;
        private var _completeEvent:Event;
        private var _dispatched:Boolean;
        private var _log:String = '';

        public function URLChecker(target:IEventDispatcher = null) 
        {
            super(target);
            init();
        }

        private function init():void
        {
            _loader = new URLLoader();
            _loader.addEventListener(Event.COMPLETE, _completeHandler);
            _loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, _httpStatusHandler);
            _loader.addEventListener(IOErrorEvent.IO_ERROR, _ioErrorEventHandler);
            _loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, _securityErrorHandler);

            _completeEvent = new Event(Event.COMPLETE, false, true);

            _liveStatuses = [];//add other acceptable http statuses here
        }

        public function check(url:String = 'http://stackoverflow.com'):void {
            _dispatched = false;
            _url = url;
            _request = new URLRequest(url);
            _loader.load(_request);
            _log += 'load for ' + _url + ' started : ' + new Date() + '\n';
        }

        private function _completeHandler(e:Event):void 
        {
            _log += e.toString() + ' at ' + new Date();
            _isLive = true;
            if (!_dispatched) {
                dispatchEvent(_completeEvent);
                _dispatched = true;
            }
        }

        private function _httpStatusHandler(e:HTTPStatusEvent):void 
        {
            /* comment this in when you're sure what statuses you're after
            var statusesLen:int = _liveStatuses.length;
            for (var i:int = statusesLen; i > 0; i--) {
                if (e.status == _liveStatuses[i]) {
                    _isLive = true;
                    dispatchEvent(_completeEvent);
                }
            }
            */
            //200 range
            _log += e.toString() + ' at ' + new Date();
            if (e.status >= 200 && e.status < 300) _isLive = true;
            else                                   _isLive = false;
            if (!_dispatched) {
                dispatchEvent(_completeEvent);
                _dispatched = true;
            }
        }

        private function _ioErrorEventHandler(e:IOErrorEvent):void 
        {
            _log += e.toString() + ' at ' + new Date();
            _isLive = false;
            if (!_dispatched) {
                dispatchEvent(_completeEvent);
                _dispatched = true;
            }
        }

        private function _securityErrorHandler(e:SecurityErrorEvent):void 
        {
            _log += e.toString() + ' at ' + new Date();
            _isLive = false;
            if (!_dispatched) {
                dispatchEvent(_completeEvent);
                _dispatched = true;
            }
        }

        public function get isLive():Boolean { return _isLive; }

        public function get log():String { return _log; }

    }

}

и вот основной пример использования:

var urlChecker:URLChecker = new URLChecker();
urlChecker.addEventListener(Event.COMPLETE, urlChecked);
urlChecker.check('wrong_place.url');

function urlChecked(event:Event):void {
    trace('is Live: ' + event.target.isLive);
    trace('log: ' + event.target.log);
}

Идея проста: 1. Вы создаете проверенный 2. Прослушивание события COMPLETE (срабатывает, когда оно имеет результат 3. В обработчике проверьте, работает ли он и что он записал.

В HTTP-спецификации область 200 выглядит нормально, но в зависимости от того, что вы загружаете, вам может понадобиться настроить класс. Также вам нужно лучше справляться с проблемами безопасности / междоменных доменов, но, по крайней мере, это только начало.

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...