Загрузка внешних данных

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

ActionScript 3.0 предусматривает механизмы для загрузки данных из внешних источников. Эти источники могут предоставлять статическое содержимое, например текстовые файлы, или динамическое содержимое, созданное веб-сценарием. Данные могут иметь различный формат, и среда выполнения предоставляет функции для декодирования данных и получения доступа к ним. Можно также выполнять передачу данных на внешний сервер как часть процесса получения данных.

Использование класса URLRequest

Во многих API-интерфейсах, загружающих внешние данные, класс URLRequest используется для определения свойств необходимого сетевого запроса.

Свойства URLRequest

В изолированной программной среде можно задать следующие свойства объекта URLRequest:

Свойство

Описание

contentType

MIME-тип содержимого, передаваемого с запросом URL. Если объект contentType не задан, значения отправляются в виде application/x-www-form-urlencoded .

data

Объект, содержащий данные, которые должны быть переданы с запросом URL.

digest

Строка, уникальным образом идентифицирующая подписанный компонент платформы Adobe, который должен быть сохранен (или извлечен) в кэш-памяти проигрывателя Adobe® Flash® Player.

method

Метод запроса HTTP, например GET или POST. (Содержимое, выполняющееся в домене безопасности приложения AIR, может указывать строки, отличные от "GET" или "POST" , в качестве свойства method . Допускается использование любого глагола HTTP, а по умолчанию используется метод "GET" . См. раздел Безопасность AIR .)

requestHeaders

Массив заголовков запроса HTTP, который должен быть добавлен к запросу HTTP. Обратите внимание, что права на задание некоторых заголовков ограничены в проигрывателе Flash Player, а также в содержимом AIR, выполняемом за пределами изолированной программной среды приложения.

url

Задает запрашиваемый URL-адрес.

В среде AIR можно задать дополнительные свойства класса URLRequest, которые доступны только для содержимого AIR, выполняемого в изолированной программной среде приложения. Содержимое в изолированной программной среде приложения может также определять URL-адреса при помощи новых схем URL-адресов (в дополнение к таким стандартным схемам, как file и http ).

Свойство

Описание

followRedirects

Указывает, выполнять переход по указанному перенаправлению ( true , значение по умолчанию) или нет ( false ). Эта возможность поддерживается только в изолированной программной среде AIR.

manageCookies

Указывает, должен стек протокола HTTP управлять файлами cookie этого запроса ( true , значение по умолчанию) или нет ( false ). Настройка этого свойства поддерживается только в изолированной программной среде AIR.

authenticate

Указывает, должны ли обрабатываться запросы на проверку подлинности ( true ) данного запроса. Настройка этого свойства поддерживается только в изолированной программной среде AIR. По умолчанию проверка подлинности запросов выполняется — при этом может открыться диалоговое окно проверки подлинности, если для сервера необходимо указать учетные данные. Можно также задать имя пользователя и пароль с использованием класса URLRequestDefaults (см. раздел « Настройка значений по умолчанию для объекта URLRequest (только в среде AIR) »).

cacheResponse

Указывает, должны ли сохраняться в кэше данные ответа на этот запрос. Настройка этого свойства поддерживается только в изолированной программной среде AIR. По умолчанию ответ кэшируется ( true ).

useCache

Указывает, следует ли обращаться к локальному кэшу перед выборкой данных этим URLRequest. Настройка этого свойства поддерживается только в изолированной программной среде AIR. По умолчанию (значение true ) используется локальная кэшированная версия, если таковая имеется.

userAgent

Указывает строку агента пользователя, используемую в запросе HTTP.

Примечание. Класс HTMLLoader имеет связанные свойства для настроек, относящихся к содержимому, загружаемому объектом HTMLLoader. Дополнительные сведения см. в разделе « О классе HTMLLoader ».

Настройка значений по умолчанию для объекта URLRequest (только в среде AIR)

Класс URLRequestDefaults позволяет задать программные настройки по умолчанию для объектов URLRequest. Например, следующий код задает значения по умолчанию для свойств manageCookies и useCache . Во всех новых объектах URLRequest для этих свойств будут использоваться указанные значения вместо значений по умолчанию:

URLRequestDefaults.manageCookies = false; 
URLRequestDefaults.useCache = false;
Примечание. Класс URLRequestDefaults определяется для содержимого, выполняемого только в среде Adobe AIR. Он не поддерживается в приложении Flash Player.

Класс URLRequestDefaults содержит метод setLoginCredentialsForHost() , позволяющий задать имя пользователя и пароль, используемые по умолчанию для определенного узла. Узел, заданный параметром hostname этого метода, может представлять собой домен, например "www.example.com" , или домен и номер порта, например "www.example.com:80" . Обратите внимание на то, что "example.com" , "www.example.com" и "sales.example.com" считаются уникальными узлами.

Эти учетные данные используются только по требованию сервера. Если пользователь уже прошел проверку подлинности (например, с помощью диалогового окна проверки подлинности), то при вызове метода setLoginCredentialsForHost() этот пользователь не изменяется.

Следующий код позволяет задать имя пользователя и пароль по умолчанию, используемые для отправки запросов на веб-сайт www.example.com:

URLRequestDefaults.setLoginCredentialsForHost("www.example.com", "Ada", "love1816$X"); 

Параметры URLRequestDefaults применяются только к текущему домену приложения, но с одним исключением. Учетные данные, переданные в метод setLoginCredentialsForHost() , используются для запросов, выполняемых в любом программном домене в приложении AIR.

Дополнительные сведения о классе URLRequestDefaults см. в cправочнике ActionScript® 3.0 для платформы Adobe® Flash® Platform .

Схемы URI

Стандартные схемы URI, например описанную ниже, можно использовать в запросах, выполняемых из любой изолированной программной среды:

http: и https:

Используйте их для стандартных URL-адресов Интернета (так же, как они используются в веб-браузере).

file:

Используйте схему file: для указания URL-адреса файла, находящегося в локальной файловой системе. Например:

file:///c:/AIR Test/test.txt 

В среде AIR можно также использовать следующие схемы при определении URL-адреса для содержимого, выполняющегося в изолированной программной среде приложения:

app:

Используйте схему app: , чтобы указать путь относительно корневого каталога установленного приложения. Например, следующий путь указывает на каталог ресурсов, вложенный в каталог установленного приложения.

app:/resources 

Когда приложение AIR запускается с использованием средства AIR Debug Launcher (ADL), каталогом приложения является каталог, содержащий файл дескриптора приложения.

В URL-адресе (и в свойстве url ) объекта File, созданного при помощи File.applicationDirectory , используется схема URI app , как показано ниже:

var dir:File = File.applicationDirectory; 
dir = dir.resolvePath("assets"); 
trace(dir.url); // app:/assets 

app-storage:

Используйте схему app-storage: , чтобы указать путь относительно каталога системы хранения данных приложения. Для каждого установленного приложения (и пользователя) среда AIR создает уникальный каталог хранилища приложения, в котором сохраняются все данные, относящиеся к этому приложению. Например, следующий путь указывает на файл prefs.xml в подкаталоге параметров каталога хранилища приложения:

app-storage:/settings/prefs.xml 

В URL-адресе (и в свойстве url ) объекта File, созданного при помощи File.applicationStorageDirectory , используется схема URI app-storage , как показано ниже:

var prefsFile:File = File.applicationStorageDirectory; 
prefsFile = prefsFile.resolvePath("prefs.xml"); 
trace(dir.prefsFile); // app-storage:/prefs.xml 

Адрес получателя mailto:

Можно использовать схему mailto с указанием адреса получателя в объектах URLRequest, переданных функции navigateToURL() . См. раздел « Открытие URL-адреса в другом приложении ».

При помощи объекта URLRequest, использующего любую из этих схем URI, можно определить запрос URL для различных объектов, например объекта FileStream или Sound. Эти схемы можно также использовать для содержимого HTML, выполняющегося в AIR, например в атрибуте src тега img .

Однако эти схемы URI для среды AIR ( app: и app-storage: ) можно использовать только для содержимого в изолированной программной среде приложения. Дополнительные сведения см. в разделе « Безопасность AIR ».

Задание переменных URL-адреса

И хотя переменные можно добавить в строку URL-адреса напрямую, проще использовать класс URLVariables для задания любых необходимых в запросе переменных.

Существует три способа добавления параметров в объект URLVariables:

  • В конструкторе URLVariables

  • С использованием метода URLVariables.decode()

  • В качестве динамических свойств самого объекта URLVariables

В следующем примере показаны все три метода, а также способ назначения переменных объекту URLRequest:

var urlVar:URLVariables = new URLVariables( "one=1&two=2" ); 
urlVar.decode("amp=" + encodeURIComponent( "&" ) ); 
urlVar.three = 3; 
urlVar.amp2 = "&&"; 
trace(urlVar.toString()); //amp=%26&amp2=%26%26&one=1&two=2&three=3 
 
var urlRequest:URLRequest = new URLRequest( "http://www.example.com/test.cfm" ); 
urlRequest.data = urlVar;

При определении переменных в конструкторе URLVariables или методе URLVariables.decode() убедитесь, что выполнено URL-кодирование символов, имеющих специальное значением в строке URI. Например, при использовании амперсанда в имени или значении параметра необходимо закодировать амперсанд, заменив его символ с & на %26 , поскольку амперсанд используется в качестве разделителя для параметров. Для этого можно использовать функцию encodeURIComponent() верхнего уровня.

Использование класса URLLoader

Класс URLLoader позволяет отправлять запрос на сервер и получать доступ к возвращенной информации. Класс URLLoader можно также использовать для доступа к файлам в локальной файловой системе в контекстах, в которых доступ к локальным файлам разрешен (например, в локальной изолированной программной среде с файловой системой Flash Player и изолированной программной среде приложения AIR). Класс URLLoader загружает данные с URL-адреса в виде текста, двоичных данных или переменных в кодировке URL. Класс URLLoader отправляет такие события, как complete , httpStatus , ioError , open , progress и securityError .

Модель обработки событий ActionScript 3.0 значительно отличается от модели ActionScript 2.0, в которой использовались обработчики событий LoadVars.onData , LoadVars.onHTTPStatus и LoadVars.onLoad . Дополнительные сведения об обработке событий в среде ActionScript 3.0 см. в разделе « Обработка событий »

Загруженные данные доступны только после завершения загрузки. Можно отслеживать ход выполнения загрузки (количество загруженных байтов и общее количество байтов) путем прослушивания отправляемого события progress . Однако, если файл загружается достаточно быстро, событие progress может не отправляться. При успешной загрузке файла отправляется событие complete . Путем задания свойства dataFormat объекта URLLoader можно получать данные в виде текста, двоичных данных без сжатия или объекта URLVariables.

Метод URLLoader.load() (и дополнительно конструктор класса URLLoader) имеет один параметр, request , который является объектом URLRequest. Объект URLRequest содержит всю информацию для одного HTTP-запроса, такую как целевой URL-адрес, метод запроса ( GET или POST ), дополнительную информацию заголовка и тип MIME.

Например, для выгрузки пакета XML в серверный сценарий можно использовать такой код:

var secondsUTC:Number = new Date().time; 
var dataXML:XML =  
    <clock> 
        <time>{secondsUTC}</time> 
    </clock>; 
var request:URLRequest = new URLRequest("http://www.yourdomain.com/time.cfm"); 
request.contentType = "text/xml"; 
request.data = dataXML.toXMLString(); 
request.method = URLRequestMethod.POST; 
var loader:URLLoader = new URLLoader(); 
loader.load(request); 

Предыдущий фрагмент кода создает документ XML с именем dataXML , который содержит пакет XML для отправки на сервер. В примере свойству contentType объекта URLRequest задается значение text/xml , а документ XML назначается свойству data объекта URLRequest. Наконец, в примере создается объект URLLoader и осуществляется отправка запроса в удаленный сценарий с использованием метода load() .

Использование класса URLStream

Класс URLStream предоставляет доступ к загружаемым данным по мере их получения. Класс URLStream также позволяет закрыть поток до завершения загрузки. Загруженные данные доступны в виде двоичных данных без сжатия.

Перед чтением данных из объекта URLStream используйте свойство bytesAvailable для определения наличия достаточного объема данных. Исключение EOFError создается при попытке чтения данных, объем которых превышает доступный объем.

Событие httpResponseStatus (AIR)

В среде Adobe AIR класс URLStream отправляет событие httpResponseStatus в добавление к событию httpStatus . Событие httpResponseStatus доставляется перед какими-либо данными ответа. Событие httpResponseStatus (представленное классом HTTPStatusEvent) содержит свойство responseURL , которое является URL-адресом, с которого был возвращен ответ, и свойство responseHeaders , которое является массивом объектов URLRequestHeader, представляющих собой возвращенные заголовки ответов.

Загрузка данных из внешних документов

При создании динамических приложений может потребоваться загрузка данных из внешних файлов или серверных сценариев. Это позволяет разрабатывать динамические приложения без редактирования и повторной компиляции приложения. Например, чтобы создать приложение типа «совет дня», можно создать сценарий, выполняемый на стороне сервера, который получает случайно выбранный совет и сохраняет его в текстовом файле раз в день. Затем приложение может загружать содержимое статического текстового файла, чтобы каждый раз не отправлять запрос в базу данных.

Следующий код создает экземпляр URLRequest и объект URLLoader, загружающий содержимое внешнего текстового файла params.txt:

var request:URLRequest = new URLRequest("params.txt"); 
var loader:URLLoader = new URLLoader(); 
loader.load(request);
Если не определить метод запроса, Flash Player и Adobe AIR по умолчанию загружают содержимое с помощью метода HTTP GET . Чтобы отправить запрос с помощью метода POST , задайте для свойства request.method значение POST с использованием статической константы URLRequestMethod.POST , как показано в следующем коде:
var request:URLRequest = new URLRequest("sendfeedback.cfm"); 
request.method = URLRequestMethod.POST;

Внешний документ, params.txt, загружаемый во время выполнения, содержит следующие данные:

monthNames=January,February,March,April,May,June,July,August,September,October,November,December&dayNames=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday

Файл содержит два параметра: monthNames и dayNames . Каждый параметр содержит список значений, разделенных запятыми, который анализируется как строки. Можно разбить список на массивы при помощи метода String.split() .

Старайтесь не использовать зарезервированные слова или языковые конструкции в качестве имен переменных в файлах внешних данных, так как это усложняет чтение и отладку кода.
После загрузки данных отправляется событие complete , и содержимое внешнего документа становится доступным для использования в свойстве data объекта URLLoader, как показано в следующем коде:
function completeHandler(event) 
{ 
    var loader2 = event.target; 
    air.trace(loader2.data); 
}

Если удаленный документ содержит пары «имя-значение», разбор данных можно выполнить при помощи класса URLVariables, передав ему содержимое загруженного файла, как показано ниже:

private function completeHandler(event:Event):void 
{ 
    var loader2:URLLoader = URLLoader(event.target); 
    var variables:URLVariables = new URLVariables(loader2.data); 
    trace(variables.dayNames); 
}

Каждая пара «имя-значение» во внешнем файле воссоздается в виде свойства в объекте URLVariables. Каждое свойство в объекте переменных в предыдущем примере кода рассматривается как строка. Если пара «имя-значение» представляет собой список элементов, можно преобразовать строку в массив при помощи метода String.split() , как показано ниже:

var dayNameArray:Array = variables.dayNames.split(",");
Если загружаются числовые данные из внешних текстовых файлов, значения необходимо преобразовать в числовые с помощью функции верхнего уровня, такой как int() , uint() или Number() .

Вместо того, чтобы загружать содержимое удаленного файла в виде строки и создавать новый объект URLVariables, можно задать в качестве значения свойства URLLoader.dataFormat одно из статических свойств класса URLLoaderDataFormat. Свойство URLLoader.dataFormat может иметь одно из трех значений.

  • URLLoaderDataFormat.BINARY — свойство URLLoader.data будет содержать бинарные данные, сохраненные в объекте ByteArray;

  • URLLoaderDataFormat.TEXT — свойство URLLoader.data будет содержать текст в объекте String;

  • URLLoaderDataFormat.VARIABLES — свойство URLLoader.data будет содержать переменные в кодировке URL, сохраненные в объекте URLVariables.

На примере следующего кода показано, как свойство URLLoader.dataFormat в значении URLLoaderDataFormat.VARIABLES позволяет автоматически разбирать загруженные данные и передавать их в объект URLVariables.

package 
{ 
    import flash.display.Sprite; 
    import flash.events.*; 
    import flash.net.URLLoader; 
    import flash.net.URLLoaderDataFormat; 
    import flash.net.URLRequest; 
 
    public class URLLoaderDataFormatExample extends Sprite 
    { 
        public function URLLoaderDataFormatExample() 
        { 
            var request:URLRequest = new URLRequest("http://www.[yourdomain].com/params.txt"); 
            var variables:URLLoader = new URLLoader(); 
            variables.dataFormat = URLLoaderDataFormat.VARIABLES; 
            variables.addEventListener(Event.COMPLETE, completeHandler); 
            try 
            { 
                variables.load(request); 
            }  
            catch (error:Error) 
            { 
                trace("Unable to load URL: " + error); 
            } 
        } 
        private function completeHandler(event:Event):void 
        { 
        var loader:URLLoader = URLLoader(event.target); 
        trace(loader.data.dayNames); 
        } 
    } 
}
Примечание. По умолчанию свойство URLLoader.dataFormat имеет значение URLLoaderDataFormat.TEXT .

Как показано в следующем примере, загрузка XML из внешнего файла не отличается от загрузки URLVariables. Можно создать экземпляр URLRequest и экземпляр URLLoader и использовать их для загрузки удаленного документа XML. После завершения загрузки файла, отправляется событие Event.COMPLETE , и содержимое внешнего файла преобразуется в экземпляр XML, который можно разобрать с помощью методов и свойств XML.

package 
{ 
    import flash.display.Sprite; 
    import flash.errors.*; 
    import flash.events.*; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 
 
    public class ExternalDocs extends Sprite 
    { 
        public function ExternalDocs() 
        { 
            var request:URLRequest = new URLRequest("http://www.[yourdomain].com/data.xml"); 
            var loader:URLLoader = new URLLoader(); 
            loader.addEventListener(Event.COMPLETE, completeHandler); 
            try 
            { 
                loader.load(request); 
            } 
            catch (error:ArgumentError) 
            { 
                trace("An ArgumentError has occurred."); 
            } 
            catch (error:SecurityError) 
            { 
                trace("A SecurityError has occurred."); 
            } 
        } 
        private function completeHandler(event:Event):void 
        { 
            var dataXML:XML = XML(event.target.data); 
            trace(dataXML.toXMLString()); 
        } 
    } 
}

Связь с внешними сценариями

Класс URLVariables можно использовать не только для загрузки внешних файлов данных, но и для отправки переменных сценарию, выполняемому на стороне сервера, и обработки ответа сервера. Это используется, например, при программировании какой-либо игры, когда необходимо отправить количество набранных пользователем очков серверу, чтобы определить, нужно ли включать это количество в список лучших результатов, или когда нужно отправить серверу данные пользователя для входа в систему с целью проверки. Сценарий со стороны сервера может обработать имя пользователя и пароль, проверить их по базе данных и возвратить подтверждение подлинности предоставленных пользователем учетных данных.

Следующий код создает объект URLVariables с именем variables, который создает новую переменную с именем name . Затем создается объект URLRequest, задающий URL-адрес серверного сценария, которому нужно отправить переменные. После этого задается свойство method объекта URLRequest для отправки переменных в качестве запроса HTTP POST . Чтобы добавить объект URLVariables в запрос URL, свойству data объекта URLRequest присваивается созданный ранее объект URLVariables. Наконец, создается экземпляр URLLoader и вызывается метод URLLoader.load() , который инициирует запрос.

var variables:URLVariables = new URLVariables("name=Franklin"); 
var request:URLRequest = new URLRequest(); 
request.url = "http://www.[yourdomain].com/greeting.cfm"; 
request.method = URLRequestMethod.POST; 
request.data = variables; 
var loader:URLLoader = new URLLoader(); 
loader.dataFormat = URLLoaderDataFormat.VARIABLES; 
loader.addEventListener(Event.COMPLETE, completeHandler); 
try 
{ 
    loader.load(request); 
} 
catch (error:Error) 
{ 
    trace("Unable to load URL"); 
} 
 
function completeHandler(event:Event):void 
{ 
    trace(event.target.data.welcomeMessage); 
}

Следующий код включает содержимое документа Adobe ColdFusion® greeting.cfm, использованное в предыдущем примере.

<cfif NOT IsDefined("Form.name") OR Len(Trim(Form.Name)) EQ 0> 
    <cfset Form.Name = "Stranger" /> 
</cfif> 
<cfoutput>welcomeMessage=#UrlEncodedFormat("Welcome, " & Form.name)# 
</cfoutput>