Фигачем Флексовские задачи.

Т.к. не охота искать левых хостингов для изображений, будем пользоваться ресурсами програмиллы.
Мой первый рисунок откомпиленного локально флекс-приложения


Так сказать, долго над окшком алерта мну не думал, на фотках, которые выложил Кирилл есть достаточно подсказок. Больше в ступор ввело генерация ошибки, потому как простое изменение адреса погодного сайта ни к чему не приводило. Но, помогло, как обычно, делание на основе этого примера более расширенного варианта. Ошибка назрела сама собой:

Попутно столкнулся с проблемой в билдере с тем, что если при компиляции проекта выскакивает ошибка, то даже если от нее избавишься в синтаксисе, билдер неустанно ее показывает и не компилит проект. Помогает переоткрытие проекта заново. Я думаю, что это все из-за плохоработающего билдера под мою линуху.
Да, я все-таки сделал так, как хотел, осталось добиться работы этой флешины на хостинге:

В общем, та часть работы из двух первых заданий у меня выглядит так:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                                layout="absolute">
        <mx:Script>
                <![CDATA[
                        import mx.collections.ArrayCollection;
                        import mx.rpc.events.FaultEvent;
                        import mx.rpc.events.ResultEvent;
			import mx.controls.Alert;

                        [Bindable]
                        private var weather:XML

                        [Bindable]
                        private var cities:ArrayCollection=new ArrayCollection([
{label: "Варшава", data: "Warszawa", country: "Poland"},
{label: "Киев", data: "Kyiv", country: "Ukraine"},
{label: "Львов", data: "L'viv", country: "Ukraine"},
{label: "Харьков", data: "Kharkiv", country: "Ukraine"}]);

                        private function clickHandler():void
                        {
                               <!--  weatherService.GetWeather.send(targetCity.selectedItem.data, "Ukraine"); -->
									weatherService.GetWeather.send(targetCity.selectedItem.data, targetCity.selectedItem.country);
                        }

                        private function resultHandler(e:ResultEvent):void
                        {
                                weather=new XML(e.result);
                                weatherResult.visible=true;
                        }

                        private function faultHandler(e:FaultEvent):void
                        {
<!-- Alert.show(e.fault.message.toString()); -->
Alert.show(e.fault.message.toString(), 'Error!',  mx.controls.Alert.OK); 
                        }
                ]]>
        </mx:Script>

        <mx:WebService id="weatherService"
                                   wsdl="http://www.webservicex.com/globalweather.asmx?WSDL"
                                   showBusyCursor="true">
                <mx:operation name="GetWeather"
                                          resultFormat="object"
                                          result="resultHandler(event);"
                                          fault="faultHandler(event);"/>
        </mx:WebService>

        <mx:Panel title="Пример">
                <mx:TabNavigator width="450"
                                                 height="250">

                        <mx:VBox label="Погода">
                                <mx:HBox>
                                        <mx:Label text="Выберите город: "/>
                                        <mx:ComboBox dataProvider="{cities}"
                                                                 id="targetCity"/>
                                        <mx:Button label="Показать погоду"
                                                           click="{clickHandler()}"/>
                                </mx:HBox>
                                <mx:HRule width="100%"/>
                                <mx:Grid visible="false"
                                                 id="weatherResult">
                                        <mx:GridRow>
                                                <mx:GridItem>
                                                        <mx:Label text="Местоположение: "/>
                                                </mx:GridItem>
                                                <mx:GridItem>
                                                        <mx:Label text="{weather.Location}"/>
                                                </mx:GridItem>
                                        </mx:GridRow>
                                        <mx:GridRow>
                                                <mx:GridItem>
                                                        <mx:Label text="Текущее время: "/>
                                                </mx:GridItem>
                                                <mx:GridItem>
                                                        <mx:Label text="{weather.Time}"/>
                                                </mx:GridItem>
                                        </mx:GridRow>
                                        <mx:GridRow>
                                                <mx:GridItem>
                                                        <mx:Label text="Ветер: "/>
                                                </mx:GridItem>
                                                <mx:GridItem>
                                                        <mx:Label text="{weather.Wind}"/>
                                                </mx:GridItem>
                                        </mx:GridRow>
                                        <mx:GridRow>
                                                <mx:GridItem>
                                                        <mx:Label text="Видимость: "/>
                                                </mx:GridItem>
                                                <mx:GridItem>
                                                        <mx:Label text="{weather.Visibility}"/>
                                                </mx:GridItem>
                                        </mx:GridRow>
                                        <mx:GridRow>
                                                <mx:GridItem>
                                                        <mx:Label text="Температура: "/>
                                                </mx:GridItem>
                                                <mx:GridItem>
                                                        <mx:Label text="{weather.Temperature}"/>
                                                </mx:GridItem>
                                        </mx:GridRow>
                                        <mx:GridRow>
                                                <mx:GridItem>
                                                        <mx:Label text="Влажность: "/>
                                                </mx:GridItem>
                                                <mx:GridItem>
                                                        <mx:Label text="{weather.RelativeHumidity}"/>
                                                </mx:GridItem>
                                        </mx:GridRow>
                                        <mx:GridRow>
                                                <mx:GridItem>
                                                        <mx:Label text="Давление: "/>
                                                </mx:GridItem>
                                                <mx:GridItem>
                                                        <mx:Label text="{weather.Pressure}"/>
                                                </mx:GridItem>
                                        </mx:GridRow>
                                </mx:Grid>
                        </mx:VBox>
                        <mx:VBox label="Биржа">
                        </mx:VBox>
                        <mx:VBox label="Новости">
                        </mx:VBox>
                </mx:TabNavigator>
        </mx:Panel>
</mx:Application>

Добавилось тут только:
import mx.controls.Alert;
Alert.show(e.fault.message.toString(), 'Error!',  mx.controls.Alert.OK);

а также переписал немного код, чтобы погоду можно было смотреть в городах из разных стран:
private var cities:ArrayCollection=new ArrayCollection([
{label: "Варшава", data: "Warszawa", country: "Poland"},
{label: "Киев", data: "Kyiv", country: "Ukraine"},
{label: "Львов", data: "L'viv", country: "Ukraine"},
{label: "Харьков", data: "Kharkiv", country: "Ukraine"}]);

                        private function clickHandler():void
                        {
                               <!--  weatherService.GetWeather.send(targetCity.selectedItem.data, "Ukraine"); -->
									weatherService.GetWeather.send(targetCity.selectedItem.data, targetCity.selectedItem.country);
                        }

Если бы сделал массив таким:
{label: "Варшава", data: "Warszawa Poland"},

а отсылку результата таким:
weatherService.GetWeather.send(targetCity.selectedItem.data);

то на выходе имели бы ошибку даже локально:
faultCode:DecodingError faultString:'SOAP Response cannot be decoded. Raw response: ' faultDetail:'null'

Но даже с рабочим вариантом, при полном разрешении всех прав в crossdomain.xml
<cross-domain-policy xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFile.xsd">
<site-control permitted-cross-domain-policies="all"/>
<allow-http-request-headers-from domain="*" headers="*"/>
<allow-access-from domain="*" to-ports="*"/>
</cross-domain-policy>

мне не удалось завести эту флешину в рабочее состояние на хостинге, всегда вываливалась ошибка:
Error: Request for resource at http://www.webservicex.com/globalweather.asmx by requestor from http://127.0.0.1/bin-debug/main.swf is denied due to lack of policy file permissions.

Комментарии (7)

RSS свернуть / развернуть
+
0
борт-журнал?
avatar

degtyarchuk

  • 27 июля 2010, 07:53
+
0
Он самый. Не охота вечно искать в коментах, пусть будет в личном блоге.
avatar

yuginboy

  • 27 июля 2010, 12:22
+
0
Этот файл лежит у ребят ) Он разрешает обращаться с локал хоста, но все остальное режет.
avatar

cyril

  • 27 июля 2010, 15:02
+
0
Там у них не хватает

<allow-http-request-headers-from domain="*" headers="*" secure=«false» />

Ты эту ошибку не исправишь дядюшко Мну )
avatar

cyril

  • 27 июля 2010, 15:26
+
0
Я там, пока еще не до конца вкурил, но мне казалось, что их политики:
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>
вроде все разрешают. Но если то, что не указано переходит в значение по умолчанию, то тогда выход это грабить каким-нить скриптом на серваке и создавать локально XML-файл, а этой флешиной тогда уже обращаться непосредственно к данным, к которым политики безопасности пропишем в своем кроссдомене.
avatar

yuginboy

  • 27 июля 2010, 16:30
+
0
или такого рода вещи сделать никак нельзя?
avatar

yuginboy

  • 27 июля 2010, 16:34
+
0
))) Нет. Такого рода вещи сделать никак нельзя.
avatar

cyril

  • 27 июля 2010, 17:17

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
Не забываем смотреть статистику:

Яндекс цитирования