ActionScript 3
Отправка и получение данных с серверов
Поиск…
Выполнение запроса от Flash
Классы URLRequest
и URLLoader
работают вместе, чтобы запросы от Flash к внешним ресурсам. URLRequest
определяет информацию о запросе, например, тело запроса и тип метода запроса, и URLLoader
ссылается на это для выполнения фактического запроса и предоставляет средство для уведомления, когда ответ получен от ресурса.
Пример:
var request:URLRequest = new URLRequest('http://stackoverflow.com');
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, responseReceived);
loader.load(request);
function responseReceived(event:Event):void {
trace(event.target.data); // or loader.data if you have reference to it in
// this scope.
}
Добавление переменных в ваш запрос
Класс URLVariables
позволяет вам определять данные для отправки вместе с URLRequest
.
Пример:
var variables:URLVariables = new URLVariables();
variables.prop = "hello";
variables.anotherProp = 10;
var request:URLRequest = new URLRequest('http://someservice.com');
request.data = variables;
Вы можете отправить запрос через URLLoader
или открыть URL-адрес запроса с переменными, указанными в querystring, используя navigateToURL
.
Изменение метода HTTP (GET, POST, PUT и т. Д.)
Класс URLRequestMethod
содержит константы для различных типов запросов, которые вы можете сделать. Эти константы должны быть выделены для свойства method
URLRequest
:
var request:URLRequest = new URLRequest('http://someservice.com');
request.method = URLRequestMethod.POST;
Обратите внимание, что только
GET
иPOST
доступны вне среды выполнения AIR.
Мои данные ответа всегда равны нулю, что означает «асинхронный»?
Когда Flash запрашивает данные из внешнего источника, эта операция является асинхронной . Самое основное объяснение того, что это означает, заключается в том, что данные загружаются «в фоновом режиме» и запускают обработчик событий, который вы назначаете Event.COMPLETE
когда он получен. Это может произойти в любой момент вашего приложения.
Ваши данные НЕ будут доступны сразу после вызова load()
на вашем URLLoader
. Вы должны подключить прослушиватель событий для Event.COMPLETE
и взаимодействовать с ответом там.
var request:URLRequest = new URLRequest('http://someservice.com');
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, responseReceived);
loader.load(request);
trace(loader.data); // Will be null.
function responseReceived(event:Event):void {
trace(loader.data); // Will be populated with the server response.
}
trace(loader.data); // Will still be null.
Вы не можете обойти это с помощью любых небольших трюков, например, с помощью setTimeout
или аналогичного:
setTimeout(function() {
trace(loader.data); // Will be null if the data hasn't finished loading
// after 1000ms (which you can't guarantee).
}, 1000);
Междоменные запросы
Flash не будет загружать данные из домена, отличного от того, на котором работает ваше приложение, если только этот домен не имеет политики crossdomain XML в корне домена (например, http://somedomain.com/crossdomain.xml
) или где-то, может быть нацелена на Security.loadPolicyFile()
. Файл crossdomain.xml - это то, где вы можете указать домены, которые могут запрашивать ваш сервер для данных из приложения Flash.
Пример наиболее разрешающего crossdomain.xml:
<?xml version="1.0" ?>
<cross-domain-policy>
<allow-access-from domain="*"/>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
Обратите внимание, что этот пример не должен использоваться в производственных средах , используйте более ограничительный экземпляр.
Более ограничительный конкретный crossdomain.xml будет выглядеть так:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="master-only" />
<allow-access-from domain="*.domain.com" to-ports="80,843,8011" />
<allow-access-from domain="123.123.123.123" to-ports="80,843,8011" />
</cross-domain-policy>
Ресурсы: