Автор: Dflying Chen ( http://dflying.cnblogs.com/ )
В предыдущей статье (Вызов веб-службы в ASP.NET Atlas — создание гибридного приложения для вызова удаленного веб-сервиса (базовые знания и простой пример)) я представил некоторые базовые знания о гибридном веб-сервисе для удаленного веб-сервиса в Atlas и привел самый простой пример. это вообще бесполезно. Возвращаясь сегодня к этой теме, приведу более сложный, но в некоторой степени полезный пример — Yahoo! Weather.
Хватит чепухи, давайте сначала познакомимся с сервисом погоды Yahoo!: Yahoo! предоставляет сервис прогноза погоды на своем веб-сайте ( http://weather.yahoo.com/ ), а также предоставляет интерфейс веб-сервиса ( http :/). /developer.yahoo.com/weather/ )
Из двух вышеупомянутых веб-страниц мы можем узнать, что URL-адрес службы погоды, предоставляемой Yahoo!, — http://xml.weather.yahoo.com/forecastrss . Служба также имеет два параметра:
p: код местоположения, где находится. необходимо запросить погоду (вы можете проверить этот код в разных местах на http://weather.yahoo.com/ ).
u: единица измерения температуры в возвращаемом результате, f представляет градусы Фаренгейта, а c представляет собой градусы Цельсия.
Кажется, что этот сервис Yahoo! Weather довольно прост. Давайте проверим, хорошо ли он работает. Сначала зайдите на http://weather.yahoo.com/ и узнайте, что код города Шанхай — CHXX0116. Затем введите http://xml.weather.yahoo.com/forecastrss?p=CHXX0116&u=c в браузере. Возвращается следующий не очень сложный XML:
Yahoo Weather Service XML Result.
<?xml version="1.0"coding="UTF-8" Standalone="да" ?>
<rss version="2.0" xmlns:yweather=" http://xml.weather.yahoo.com/ns/rss/1.0 " xmlns:geo=" http://www.w3.org/2003/01/geo /wgs84_pos #">
<канал>
<title>Погода Yahoo! – Шанхай, Швейцария</title>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Shanghai__CH/*http://xml.weather.yahoo.com/forecast/CHXX0116_c.html</link>
<description>Yahoo Погода в Шанхае, Швейцария</description>
<language>ru</language>
<lastBuildDate>Четверг, 25 мая 2006 г., 11:00 по центральному стандартному времени</lastBuildDate>
<ttl>60</ttl>
<yweather:location city="Шанхай" регион="" страна="CH" />
<yweather:единицы температуры="C" расстояние="км" давление="мб" скорость="км/ч" />
<yweather:wind Chill="21" направление="260" скорость="14" />
<yweather:атмосфера влажность="78" видимость="299" давление="0" повышение="0" />
<yweather:astronomy восход="4:52 утра" закат="18:50" />
<изображение>
<title>Погода Yahoo!</title>
<ширина>142</ширина>
<высота>18</высота>
<ссылка>http://weather.yahoo.com/</link>
<url>/u/info_img/2009-06/30/main_142b.gif</url>
</изображение>
<предмет>
<title>Условия для Шанхая, Швейцария, в 11:00 по центральному поясному времени</title>
<geo:lat>31.17</geo:lat>
<geo:long>121,43</geo:long>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Shanghai__CH/*http://xml.weather.yahoo.com/forecast/CHXX0116_c.html</link>
<pubDate>Четверг, 25 мая 2006 г., 11:00 по центральному поясному времени</pubDate>
<yweather:condition text="Туман" code="20" temp="21" date="Чт, 25 мая 2006 г., 11:00 по центральному поясному времени" />
<описание>
<![CDATA[
<img src=" <b>Текущие условия:</b><br />
Туман, 21 С<BR /><BR />
<b>Прогноз:</b><BR />
Чт — рассеянные грозы Высокая: 25 Низкая: 20<br />
Пт – утро. Дожди: 26. Температура воздуха: 18.<br />
<br />
<a href=" http://us.rd.yahoo.com/dailynews/rss/weather/Shanghai__CH/*http://xml.weather.yahoo.com/forecast/CHXX0116_c.html"> Полный прогноз на Yahoo! Погода</a><BR/>
(предоставлено The Weather Channel)<br/>
]]>
</описание>
<yweather:forecast day="Чт" date="25 мая 2006" low="20" high="25" text="Разбросанные грозы" code="38" />
<yweather:forecast day="Пятница" date="26 мая 2006" low="18" high="26" text="Дожди утром" code="39" />
<guid isPermaLink="false">CHXX0116_2006_05_25_11_0_CST</guid>
</item>
</канал>
</rss>
<!-- p1.weather.scd.yahoo.com несжатый/разбитый на части Четверг, 25 мая 20:49:07 PDT 2006 -->
Мы видим, что информация, которую он предоставляет, очень полная (даже время восхода и захода солнца... ) , давайте напишем страницу asbx Bridge для создания мэшапа этой службы.
Во-первых, обратившись к оператору asbx в статье «Вызов веб-службы в ASP.NET Atlas — создание гибридного приложения для вызова удаленной веб-службы (базовые знания и простой пример»), мы можем написать следующий абзац:
<?xml version= «1.0» кодировка ="utf-8" ?>
<bridge namespace="Dflying" className="YahooWeatherService">
<proxy type="Microsoft.Web.Services.BridgeRestProxy"
serviceUrl=" http://xml.weather.yahoo.com/forecastrss " />
<имя метода="GetWeather">
<вход>
<имя параметра="p" />
<имя параметра="u" значение="c" />
</вход>
</метод>
</мост>
в:
Атрибуты namespace и className <bridge> и атрибут name <method> позволяют нам получить доступ к этому Mashup в клиентском JavaScript через сигнатуры методов, таких как Dflying.YahooWeatherService.GetWeather().
Атрибут serviceUrl <proxy> указывает URL-адрес службы погоды Yahoo!
Метод GetWeather определяет два параметра p и u, перечисленные выше. Мы указали значение параметра u по умолчанию как c (представляющее градусы Цельсия), и параметр p будет передан вызывающей стороной.
На самом деле этого шага достаточно. Клиент получит строку XML, показанную в браузере выше, и ее можно будет обработать и отобразить на клиенте. Но обработка XML клиентом не так уж проста и эффективна, а передача слишком большого количества ненужной информации по сети также является пустой тратой. Итак, здесь мы используем встроенный в asbx Transformer для обработки этого XML, извлечения интересующего нас контента и отправки его клиенту в виде JSON. Добавьте следующий абзац в раздел <method>:
<transforms>
<transform type="Microsoft.Web.Services.XPathBridgeTransformer">
<данные>
<attribute name="selector" value="channel" />
<dictionary name="namespaceMapping">
<item name="yweather" value=" http://xml.weather.yahoo.com/ns/rss/1.0 " />
</словарь>
<название словаря="selectedNodes">
<item name="Title" value="title" />
<item name="Description" value="item/description" />
<item name="CurrentCondition" value="item/yweather:condition/@text" />
</словарь>
</данные>
</трансформировать>
</трансформации>
Оператор <transforms> указывает, что возвращаемое значение этого метода Mashup будет изменено некоторыми преобразователями. Он объявляет преобразователь типа Microsoft.Web.Services.XPathBridgeTransformer, что означает, что для преобразования будут использоваться выражения XPath. В этом XPathBridgeTransformer должны быть объявлены следующие части:
name — это сегмент атрибута селектора, а указанный атрибут value — это выражение XPath, которое выберет сегмент данных, который будет использоваться всем XPathBridgeTransformer.
name — это сегмент словаря namespaceMapping, который определяет сопоставление пространства имен в этом XML-файле. Если мы используем определенное пространство имен в следующем процессе выбора узла, то его объявление должно быть здесь. Здесь мы добавляем маппинг для yweather, потому что он будет использоваться ниже.
name — это сегмент словаря selectedNodes, где атрибут value каждого элемента — это строка XPath, используемая для выбора соответствующего значения из XML, а атрибут name используется для указания соответствующего имени атрибута в JavaScript. В качестве примера я получил только три фрагмента контента. Вы можете видеть, что указанное выше отображение пространства имен используется в XPath CurrentCondition.
Я не буду вдаваться в подробности о XPath. Друзья, которые заинтересованы или не знакомы с ним, могут сами погуглить. В Интернете существует множество ресурсов. Я не очень знаком с другими типами Трансформеров. Я расскажу о них, если столкнусь с ними в будущем. Завершенный файл YahooWeatherBridge.asbx выглядит следующим образом:
<?xml version="1.0"coding="utf-8" ?>
<bridge namespace="Dflying" className="YahooWeatherService">
<proxy type="Microsoft.Web.Services.BridgeRestProxy"
serviceUrl=" http://xml.weather.yahoo.com/forecastrss " />
<имя метода="GetWeather">
<вход>
<имя параметра="p" />
<имя параметра="u" значение="c" />
</вход>
<трансформирует>
<transform type="Microsoft.Web.Services.XPathBridgeTransformer">
<данные>
<attribute name="selector" value="channel" />
<dictionary name="namespaceMapping">
<item name="yweather" value=" http://xml.weather.yahoo.com/ns/rss/1.0 " />
</словарь>
<название словаря="selectedNodes">
<item name="Title" value="title" />
<item name="Description" value="item/description" />
<item name="CurrentCondition" value="item/yweather:condition/@text" />
</словарь>
</данные>
</трансформировать>
</трансформации>
</метод>
</мост>
Теперь создайте страницу ASP.NET для тестирования. Во-первых, ScriptManager повторяется тысячу раз, а также ссылка на Bridge: <atlas:ScriptManager ID="sm" runat="server">.
<Услуги>
<atlas:ServiceReference Path="YahooWeatherBridge.asbx" />
</Услуги>
</atlas:ScriptManager>
Затем есть элемент HTML Select, в котором перечислены несколько городов и соответствующие им коды городов:
<!-- селектор места -->
<выбрать идентификатор="место">
<option selected="selected" value="CHXX0116">Шанхай, Китай</option>
<option value="USCA0746">Маунтин-Вью, Калифорния</option>
<option value="CHXX0008">Пекин, Китай</option>
</выбрать>
HTML-кнопка, используемая для запуска вызова службы:
<!-- вызвать службу -->
<input id="getWeather" type="button" value="Получить погоду" onclick="return getWeather_onclick()" />
Для отображения результата используется фрагмент HTML:
<!-- отобразить результат -->
<div id="result" style="display: none;">
<div style="background-color: Gray; Font-weight: Bold;">Заголовок</div>
<div id="title"></div>
<div style="background-color: Gray; Font-weight: Bold;">Описание</div>
<div id="description"></div>
</div>
Затем идет JavaScript. Вы можете видеть, что Mashup вызывается через Dflying.YahooWeatherService.GetWeather(), и преобразованное значение выводится на страницу после возврата метода: function getWeather_onclick() {.
// новый элемент управления «Выбрать» атласа
var место = новый Sys.UI.Select($('place'));
// вызываем метод моста
Dflying.YahooWeatherService.GetWeather({'p': Place.get_selectedValue()}, onGetComplete);
}
функция onGetComplete (результат) {
$('result').style.display = "блок";
$('title').innerHTML = результат[0].Title;
$('description').innerHTML = result[0].Description;
}