Autor: Dflying Chen ( http://dflying.cnblogs.com/ )
En el artículo anterior (Llamar a un servicio web en ASP.NET Atlas: crear un mashup para llamar a un servicio web remoto (conocimientos básicos y ejemplos simples)), presenté algunos conocimientos básicos de Mashup para un servicio web remoto en Atlas y di un ejemplo muy básico. eso no sirve para nada. Volviendo a este tema hoy, daré un ejemplo más complejo, pero algo útil: Yahoo!
Basta de tonterías, primero familiaricémonos con el servicio meteorológico de Yahoo!: Yahoo! proporciona un servicio de pronóstico del tiempo en su sitio web ( http://weather.yahoo.com/ ) y también proporciona una interfaz de servicio web ( http :/ /developer.yahoo.com/weather/ )
De las dos páginas web anteriores, podemos saber que la URL del servicio meteorológico proporcionado por Yahoo! es http://xml.weather.yahoo.com/forecastrss . El servicio también tiene dos parámetros:
p: el código de ubicación donde se encuentra. Se debe consultar el clima (puede consultar este código en diferentes lugares en http://weather.yahoo.com/ ).
u: la unidad de temperatura en el resultado devuelto, f representa Fahrenheit y c representa Celsius.
Parece que este servicio meteorológico de Yahoo! es bastante sencillo. Probemos si funciona bien. Primero vaya a http://weather.yahoo.com/ y descubra que el código de ubicación de Shanghai es CHXX0116. Luego ingrese http://xml.weather.yahoo.com/forecastrss?p=CHXX0116&u=c en el navegador. Bueno, se devuelve el siguiente XML no muy complicado:
Resultado XML del servicio meteorológico de Yahoo.
<?xml versión="1.0" codificación="UTF-8" standalone="yes" ?>
<rss versión="2.0" xmlns:yweather=" http://xml.weather.yahoo.com/ns/rss/1.0 " xmlns:geo=" http://www.w3.org/2003/01/geo /wgs84_pos #">
<canal>
<title>Tiempo de Yahoo! - Shanghái, CH</title>
<enlace>http://us.rd.yahoo.com/dailynews/rss/weather/Shanghai__CH/*http://xml.weather.yahoo.com/forecast/CHXX0116_c.html</enlace>
<description>Tiempo de Yahoo! para Shangai, CH</description>
<language>es-es</language>
<lastBuildDate>Jueves, 25 de mayo de 2006 11:00 am CST</lastBuildDate>
<ttl>60</ttl>
<yweather:ubicación ciudad="Shanghai" región="" país="CH" />
<yweather:unidades temperatura="C" distancia="km" presión="mb" velocidad="kph" />
<yweather: sensación térmica="21" dirección="260" velocidad="14" />
<yweather:humedad atmosférica="78" visibilidad="299" presión="0" rise="0" />
<yweather:astronomía amanecer="4:52 am" atardecer="6:50 pm" />
<imagen>
<título>Yahoo! El tiempo</título>
<ancho>142</ancho>
<altura>18</altura>
<enlace>http://weather.yahoo.com/</enlace>
<url>/u/info_img/2009-06/30/main_142b.gif</url>
</image>
<elemento>
<title>Condiciones para Shanghai, CH a las 11:00 am CST</title>
<geo:lat>31.17</geo:lat>
<geo:long>121,43</geo:long>
<enlace>http://us.rd.yahoo.com/dailynews/rss/weather/Shanghai__CH/*http://xml.weather.yahoo.com/forecast/CHXX0116_c.html</enlace>
<pubDate>Jueves, 25 de mayo de 2006 11:00 am CST</pubDate>
<yweather:condition text="Fog" code="20" temp="21" date="Jueves, 25 de mayo de 2006 11:00 am CST" />
<descripción>
<![CDATA[
<img src=" <b>Condiciones actuales:</b><br />
Niebla, 21 C<BR /><BR />
<b>Previsión:</b><BR />
Jueves - Tormentas dispersas Alta: 25 Baja: 20<br />
Vie - AM Lluvias Alta: 26 Baja: 18<br />
<br />
<a href=" http://us.rd.yahoo.com/dailynews/rss/weather/Shanghai__CH/*http://xml.weather.yahoo.com/forecast/CHXX0116_c.html"> Pronóstico completo en Yahoo! El tiempo</a><BR/>
(proporcionado por The Weather Channel)<br/>
]]>
</descripción>
<yweather:forecast day="jueves" fecha="25 de mayo de 2006" low="20" high="25" text="Tormentas dispersas" code="38" />
<yweather:día de previsión="viernes" fecha="26 de mayo de 2006" low="18" high="26" text="lluvias por la mañana" code="39" />
<guid isPermaLink="false">CHXX0116_2006_05_25_11_0_CST</guid>
</elemento>
</canal>
</rss>
<!-- p1.weather.scd.yahoo.com sin comprimir/fragmentado jueves 25 de mayo 20:49:07 PDT 2006 -->
Podemos ver que la información que proporciona es muy completa (incluso las horas de salida y puesta del sol... ), escribamos la página asbx Bridge para combinar este servicio.
Primero, haciendo referencia a la declaración asbx en el artículo Llamada a un servicio web en ASP.NET Atlas: creación de un mashup para llamar a un servicio web remoto (conocimientos básicos y ejemplo simple), podemos escribir el siguiente párrafo:
<?xml version= codificación "1.0" ="utf-8" ?>
<bridge namespace="Dflying" className="YahooWeatherService">
<tipo de proxy="Microsoft.Web.Services.BridgeRestProxy"
serviceUrl=" http://xml.weather.yahoo.com/forecastrss " />
<nombre del método="GetWeather">
<entrada>
<nombre del parámetro="p" />
<parámetro nombre="u" valor="c" />
</entrada>
</método>
</puente>
en:
Los atributos de espacio de nombres y className de <bridge> y el atributo de nombre de <method> nos permiten acceder a este Mashup en el cliente JavaScript a través de firmas de métodos como Dflying.YahooWeatherService.GetWeather().
El atributo serviceUrl de <proxy> especifica la URL del servicio meteorológico de Yahoo!
El método GetWeather define los dos parámetros p y u enumerados anteriormente. Hemos especificado el valor predeterminado del parámetro u como c (que representa grados Celsius), y la persona que llama pasará el parámetro p.
En realidad, este paso es suficiente. El cliente recibirá la cadena XML que se ve en el navegador de arriba y podrá procesarla y mostrarla en el cliente. Pero el procesamiento de XML por parte del cliente no es tan fácil ni tan eficiente, y transmitir demasiada información innecesaria a través de la red también es un desperdicio. Entonces aquí usamos el Transformer integrado en asbx para procesar este XML, extraer el contenido que nos interesa y enviarlo al cliente en forma de JSON. Agregue el siguiente párrafo a la sección <método>:
<transforma>
<tipo de transformación="Microsoft.Web.Services.XPathBridgeTransformer">
<datos>
<atributo nombre="selector" valor="canal" />
<diccionario nombre="asignación de espacio de nombres">
<nombre del elemento="yweather" valor=" http://xml.weather.yahoo.com/ns/rss/1.0 " />
</diccionario>
<nombre del diccionario="Nodos seleccionados">
<nombre del elemento="Título" valor="título" />
<nombre del artículo="Descripción" valor="artículo/descripción" />
<item nombre="Condición actual" valor="item/yweather:condición/@texto" />
</diccionario>
</datos>
</transformar>
</transforma>
La declaración <transforms> indica que algunos transformadores cambiarán el valor de retorno de este método Mashup. Declara un transformador de tipo Microsoft.Web.Services.XPathBridgeTransformer, lo que significa que se utilizarán expresiones XPath para la conversión. Las siguientes partes deben declararse en este XPathBridgeTransformer:
El nombre es un segmento de atributo del selector y el atributo de valor especificado es una expresión XPath, que seleccionará el segmento de datos que utilizará todo el XPathBridgeTransformer.
name es un segmento de diccionario de namespaceMapping, que especifica la asignación de espacio de nombres en este archivo XML. Si utilizamos un determinado espacio de nombres en el siguiente proceso de selección de nodos, entonces su declaración debe estar aquí. Aquí agregamos un mapeo a yweather, porque se usará a continuación.
El nombre es un segmento de diccionario de Nodos seleccionados, donde el atributo de valor de cada elemento es una cadena XPath, que se usa para seleccionar el valor correspondiente de XML, y el atributo de nombre se usa para especificar el nombre del atributo correspondiente en JavaScript. Como ejemplo aquí, solo obtuve tres piezas de contenido. Puede ver que el mapeo de espacio de nombres especificado anteriormente se usa en XPath de CurrentCondition.
No entraré en detalles sobre XPath. Los amigos que estén interesados o no estén familiarizados con él pueden buscarlo por sí mismos. Hay muchos recursos en línea. No estoy muy familiarizado con otros tipos de Transformers. Hablaré de ellos si los encuentro en el futuro. El archivo YahooWeatherBridge.asbx completo es el siguiente:
<?xml version="1.0" encoding="utf-8" ?>
<bridge namespace="Dflying" className="YahooWeatherService">
<tipo de proxy="Microsoft.Web.Services.BridgeRestProxy"
serviceUrl=" http://xml.weather.yahoo.com/forecastrss " />
<nombre del método="GetWeather">
<entrada>
<nombre del parámetro="p" />
<parámetro nombre="u" valor="c" />
</entrada>
<transforma>
<tipo de transformación="Microsoft.Web.Services.XPathBridgeTransformer">
<datos>
<atributo nombre="selector" valor="canal" />
<diccionario nombre="asignación de espacio de nombres">
<nombre del elemento="yweather" valor=" http://xml.weather.yahoo.com/ns/rss/1.0 " />
</diccionario>
<nombre del diccionario="Nodos seleccionados">
<nombre del elemento="Título" valor="título" />
<nombre del artículo="Descripción" valor="artículo/descripción" />
<item nombre="Condición actual" valor="item/yweather:condición/@texto" />
</diccionario>
</datos>
</transformar>
</transforma>
</método>
</puente>
Ahora cree una página ASP.NET para probar. Primero, todavía está el ScriptManager repetido mil veces y una referencia a Bridge: <atlas:ScriptManager ID="sm" runat="server">.
<Servicios>
<atlas:ServiceReference Path="YahooWeatherBridge.asbx" />
</Servicios>
</atlas:ScriptManager>
Luego hay un elemento HTML Select, que enumera varias ciudades y sus códigos de ciudad correspondientes:
<!-- selector de lugar -->
<seleccione id="lugar">
<option selected="selected" value="CHXX0116">Shanghái, CH</option>
<option value="USCA0746">Mountain View, California</option>
<option value="CHXX0008">Pekín, CH</option>
</seleccionar>
Un botón HTML utilizado para activar la llamada al Servicio:
<!-- invocar el servicio -->
<input id="getWeather" tipo="botón" valor="Obtener tiempo" onclick="return getWeather_onclick()" />
Se utiliza un fragmento de HTML para mostrar el resultado:
<!-- mostrar resultado -->
<div id="resultado" estilo="pantalla: ninguna;">
<div style="fondo-color: Gris; peso de fuente: negrita;">Título</div>
<div id="título"></div>
<div style="fondo-color: Gris; font-weight: negrita;">Descripción</div>
<div id="descripción"></div>
</div>
Luego viene JavaScript. Puede ver que se llama a Mashup a través de Dflying.YahooWeatherService.GetWeather(), y el valor transformado se envía a la página después de que el método regresa: function getWeather_onclick() {.
// nuevo control 'Seleccionar' del atlas
var lugar = new Sys.UI.Select($('lugar'));
// invocar el método puente
Dflying.YahooWeatherService.GetWeather({'p': place.get_selectedValue()}, onGetComplete);
}
función onGetComplete(resultado) {
$('resultado').style.display = "bloque";
$('título').innerHTML = resultado[0].Título;
$('descripción').innerHTML = resultado[0].Descripción;
}