Т.к. не охота искать левых хостингов для изображений, будем пользоваться ресурсами програмиллы.
Мой первый рисунок откомпиленного локально флекс-приложения
Так сказать, долго над окшком алерта мну не думал, на фотках, которые выложил Кирилл есть достаточно подсказок. Больше в ступор ввело генерация ошибки, потому как простое изменение адреса погодного сайта ни к чему не приводило. Но, помогло, как обычно, делание на основе этого примера более расширенного варианта. Ошибка назрела сама собой:
Попутно столкнулся с проблемой в билдере с тем, что если при компиляции проекта выскакивает ошибка, то даже если от нее избавишься в синтаксисе, билдер неустанно ее показывает и не компилит проект. Помогает переоткрытие проекта заново. Я думаю, что это все из-за плохоработающего билдера под мою линуху.
Да, я все-таки сделал так, как хотел, осталось добиться работы этой флешины на хостинге:
В общем, та часть работы из двух первых заданий у меня выглядит так:
<?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 свернуть / развернутьdegtyarchuk
yuginboy
cyril
<allow-http-request-headers-from domain="*" headers="*" secure=«false» />
Ты эту ошибку не исправишь дядюшко Мну )
cyril
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>
вроде все разрешают. Но если то, что не указано переходит в значение по умолчанию, то тогда выход это грабить каким-нить скриптом на серваке и создавать локально XML-файл, а этой флешиной тогда уже обращаться непосредственно к данным, к которым политики безопасности пропишем в своем кроссдомене.
yuginboy
yuginboy
cyril
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.