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>

Я надеюсь, что все это может помочь вам решить вашу проблему.

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

  1. Убедитесь, что вы добавили соответствующих слушателей в ваши загрузчики, чтобы вы могли правильно обрабатывать ошибки.

    loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandlerFunction);
    loader.addEventListener(IOErrorEvent.NETWORK_ERROR, ioErrorHandlerFunction);
    loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandlerFunction);
    
  2. Убедитесь, что вы публикуете с правильной настройкой изолированной программной среды безопасности.

    Перейдите в ваш файл настроек публикации -> опубликовать настройки.

    Вы увидите раскрывающийся список с надписью Локальная безопасность воспроизведения. Убедитесь, что он настроен на доступ только к сети, а не на локальный доступ по умолчанию.

Если вы справитесь со своими ошибками, вы хотя бы узнаете, в чем проблема. Если это не решит вашу проблему, добавьте глобальный обработчик ошибок и поделитесь тем, что выдается (если что-нибудь).

Вы можете сделать это с помощью следующего в вашей основной временной шкале или классе документа:

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, затем скопируйте на сервер, затем откройте его в своем веб-браузере).

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