AS3 + HTTP GET не работает
У меня есть проект во Flash, и я использую веб-сервер с некоторыми данными. Я прочитал эту информацию (JSON) с:
var url:String = "URL REQUEST";
var request:URLRequest = new URLRequest(url);
var loader:URLLoader = new URLLoader();
loader.load(request);
и я использую эту информацию в TextField. Это отлично работает и показывает мои данные правильно. Но когда я публикую свою работу или открываю файл.swf не показывает данные.
Внутри Adobe Flash работает отлично. Снаружи не работает.
У меня Raspberry Pi с сервисом в nodeJS работает. Дверь в роутере открыта.
Мой узел JS
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:true}));
const port = process.env.PORT || 3001;
const SERVER_ROOT = "http://localhost:" + port;
var messages = {};
messages["a1"] = blablabla;
--
messages["n"] = blablabla;
function buildMessage(newID, text, user){
const now = new Date();
return {
};
};
app.route("/message")
.get(function(req, res) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.json(messages);
});
app.param('messageID', function(req, res, next, messageID){
req.messageID = messageID;
return next();
})
app.listen(port, function() {
console.log("Listening on " + port);
});
2 ответа
Это классическая ошибка безопасности, которая генерируется, когда SWF-файл пытается загрузить контент в другой домен, отличный от его собственного, и у него нет на это полномочий. Поэтому, чтобы избежать такого типа ошибки безопасности, вы должны создать crossdomain.xml
файл в корне сервера, откуда вы хотите загрузить данные. Чтобы лучше понять, взгляните на эту схему (взято и отредактировано из Adobe Cross Domain Policy File):
Таким образом, в этом случае, чтобы разрешить файл SWF в a.com
загрузить данные из b.com
, мы должны добавить crossdomain.xml
файл в корне b.com
так что мы можем получить к нему доступ, используя b.com/crossdomain.com
, Содержимое этого файла и более подробную информацию о нем вы можете найти по ссылке выше спецификации междомена. Это может быть так:
<?xml version="1.0"?>
<cross-domain-policy>
<!-- if used alone, allow only all a.com requests but not its sub-domains -->
<allow-access-from domain="a.com"/>
<!-- if used alone, allow all a.com sub-domains and a.com requests -->
<allow-access-from domain="*.a.com"/>
<!-- if used alone, allow only b.a.com sub-domain requests -->
<allow-access-from domain="b.a.com"/>
</cross-domain-policy>
Я надеюсь, что все это может помочь вам решить вашу проблему.
Скорее всего, вы получаете ошибку безопасности. Вот несколько шагов, которые вы можете предпринять:
Убедитесь, что вы добавили соответствующих слушателей в ваши загрузчики, чтобы вы могли правильно обрабатывать ошибки.
loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandlerFunction); loader.addEventListener(IOErrorEvent.NETWORK_ERROR, ioErrorHandlerFunction); loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandlerFunction);
Убедитесь, что вы публикуете с правильной настройкой изолированной программной среды безопасности.
Перейдите в ваш файл настроек публикации -> опубликовать настройки.
Вы увидите раскрывающийся список с надписью Локальная безопасность воспроизведения. Убедитесь, что он настроен на доступ только к сети, а не на локальный доступ по умолчанию.
Если вы справитесь со своими ошибками, вы хотя бы узнаете, в чем проблема. Если это не решит вашу проблему, добавьте глобальный обработчик ошибок и поделитесь тем, что выдается (если что-нибудь).
Вы можете сделать это с помощью следующего в вашей основной временной шкале или классе документа:
loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);
function uncaughtErrorHandler(event:UncaughtErrorEvent):void {
if (event.error is Error) {
var error:Error = event.error as Error;
trace(error);
}
else if (event.error is ErrorEvent){
var errorEvent:ErrorEvent = event.error as ErrorEvent;
trace(errorEvent);
}
}
РЕДАКТИРОВАТЬ
Читая ваши обновления, похоже, что вы легко можете решить эту проблему, отключив свой SWF-файл от сервера JS Pi Node в браузере. (Опубликуйте с помощью html, затем скопируйте на сервер, затем откройте его в своем веб-браузере).