Auteur : Dflying Chen ( http://dflying.cnblogs.com/ )
Dans l'article précédent (Appel d'un service Web dans ASP.NET Atlas - Création d'un mashup pour appeler un service Web distant (connaissances de base et exemple simple)), j'ai présenté quelques connaissances de base sur un mashup pour un service Web distant dans Atlas et j'ai donné un exemple des plus élémentaires. cela ne sert à rien du tout. Revenant sur ce sujet aujourd'hui, je vais donner un exemple plus complexe, mais quelque peu utile : Yahoo Weather.
Assez de bêtises, familiarisons-nous d'abord avec le service Yahoo! Weather : Yahoo! propose un service de prévisions météo sur son site Web ( http://weather.yahoo.com/ ), ainsi qu'une interface de service Web ( http :/ /developer.yahoo.com/weather/ )
À partir des deux pages Web ci-dessus, nous pouvons savoir que l'URL du service météo fourni par Yahoo! est http://xml.weather.yahoo.com/forecastrss . Le service a également deux paramètres :
p : le code de localisation où se trouve le site. la météo doit être interrogée (vous pouvez vérifier ce code à différents endroits sur http://weather.yahoo.com/ ).
u : l'unité de température dans le résultat renvoyé, f représente Fahrenheit et c représente Celsius.
Il semble que ce service Yahoo! Météo soit assez simple. Testons s'il fonctionne bien. Allez d’abord sur http://weather.yahoo.com/ et découvrez que le code de localisation de Shanghai est CHXX0116. Entrez ensuite http://xml.weather.yahoo.com/forecastrss?p=CHXX0116&u=c dans le navigateur. Eh bien, le XML suivant, pas très compliqué, est renvoyé :
Résultat XML du service météo Yahoo.
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<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 #">
<canal>
<title>Météo Yahoo! - Shanghai, CH</title>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Shanghai__CH/*http://xml.weather.yahoo.com/forecast/CHXX0116_c.html</link>
<description>Météo Yahoo! pour Shanghai, CH</description>
<langue>en-us</langue>
<lastBuildDate>Jeudi 25 mai 2006 11h00 CST</lastBuildDate>
<ttl>60</ttl>
<yweather:location city="Shanghai" region="" country="CH" />
<ymétéo:unités température="C" distance="km" pression="mb" vitesse="kph" />
<yweather:wind chill="21" direction="260" speed="14" />
<ymétéo:humidité de l'atmosphère="78" visibilité="299" pression="0" montante="0" />
<yweather:astronomy lever du soleil="4:52 am" coucher du soleil="18:50 pm" />
<image>
<titre>Météo Yahoo!</titre>
<largeur>142</largeur>
<hauteur>18</hauteur>
<link>http://weather.yahoo.com/</link>
<url>/u/info_img/2009-06/30/main_142b.gif</url>
</image>
<élément>
<title>Conditions pour Shanghai, CH à 11h00 CST</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>Jeudi 25 mai 2006, 11h00 CST</pubDate>
<yweather:condition text="Brouillard" code="20" temp="21" date="Jeudi 25 mai 2006 11h00 CST" />
<description>
<![CDATA[
<img src=" <b>Conditions actuelles :</b><br />
Brouillard, 21 C<BR /><BR />
<b>Prévision :</b><BR />
Jeu - Orages épars Maximum : 25 Minimum : 20<br />
Du vendredi au matin. Averses. Haute : 26. Basse : 18.<br />
<br />
<a href=" http://us.rd.yahoo.com/dailynews/rss/weather/Shanghai__CH/*http://xml.weather.yahoo.com/forecast/CHXX0116_c.html"> Prévisions complètes sur Yahoo! Météo</a><BR/>
(fourni par The Weather Channel)<br/>
]]>
</description>
<yweather:forecast day="Jeudi" date="25 mai 2006" low="20" high="25" text="Orages épars" code="38" />
<yweather:forecast day="Fri" date="26 mai 2006" low="18" high="26" text="AM Showers" code="39" />
<guid isPermaLink="false">CHXX0116_2006_05_25_11_0_CST</guid>
</article>
</canal>
</rss>
<!-- p1.weather.scd.yahoo.com non compressé/chunked jeu. 25 mai 20:49:07 PDT 2006 -->
On voit que les informations qu'il fournit sont très complètes (même les heures de lever et de coucher du soleil... ), écrivons la page asbx Bridge pour Mashup ce service.
Tout d'abord, en nous référant à l'instruction asbx dans l'article Appel d'un service Web dans ASP.NET Atlas - Création d'un mashup pour appeler un service Web distant (connaissances de base et exemple simple), nous pouvons écrire le paragraphe suivant :
<?xml version= "1.0" encoding ="utf-8" ?>
<bridge namespace="Dflying" className="YahooWeatherService">
<proxy type="Microsoft.Web.Services.BridgeRestProxy"
serviceUrl=" http://xml.weather.yahoo.com/forecastrss " />
<method name="GetWeather">
<entrée>
<nom du paramètre="p" />
<nom du paramètre="u" valeur="c" />
</entrée>
</méthode>
</pont>
dans:
Les attributs namespace et className de <bridge> et l'attribut name de <method> nous permettent d'accéder à ce Mashup dans le JavaScript client via des signatures de méthode telles que Dflying.YahooWeatherService.GetWeather().
L'attribut serviceUrl de <proxy> spécifie l'URL du service météo Yahoo!
La méthode GetWeather définit les deux paramètres p et u répertoriés ci-dessus. Nous avons spécifié la valeur par défaut du paramètre u comme c (représentant les degrés Celsius), et le paramètre p sera transmis par l'appelant.
Cette étape est en fait suffisante. Le client recevra la chaîne XML vue dans le navigateur ci-dessus, et elle pourra être traitée et affichée sur le client. Mais le traitement du XML par le client n'est pas si simple ni efficace, et transmettre trop d'informations inutiles sur le réseau est également un gaspillage. Nous utilisons donc ici le Transformer intégré à asbx pour traiter ce XML, extraire le contenu qui nous intéresse et l'envoyer au client sous forme de JSON. Ajoutez le paragraphe suivant à la section <method> :
<transforms>
<transform type="Microsoft.Web.Services.XPathBridgeTransformer">
<données>
<attribute name="selector" value="channel" />
<dictionary name="namespaceMapping">
<item name="yweather" value=" http://xml.weather.yahoo.com/ns/rss/1.0 " />
</dictionnaire>
<nom du dictionnaire="selectedNodes">
<item name="Titre" value="titre" />
<item name="Description" value="item/description" />
<item name="CurrentCondition" value="item/yweather:condition/@text" />
</dictionnaire>
</données>
</transformation>
</transformations>
L'instruction <transforms> indique que la valeur de retour de cette méthode Mashup sera modifiée par certains transformateurs. Elle déclare un transformateur de type Microsoft.Web.Services.XPathBridgeTransformer, ce qui signifie que les expressions XPath seront utilisées pour la conversion. Les parties suivantes doivent être déclarées dans ce XPathBridgeTransformer :
name est un segment d'attribut du sélecteur et l'attribut value spécifié est une expression XPath, qui sélectionnera le segment de données qui sera utilisé par l'ensemble de XPathBridgeTransformer.
name est un segment de dictionnaire de namespaceMapping, qui spécifie le mappage d'espace de noms dans ce fichier XML. Si nous utilisons un certain espace de noms dans le processus de sélection de nœud suivant, alors sa déclaration doit être ici. Ici, nous ajoutons un mappage à yweather, car il sera utilisé ci-dessous.
name est un segment de dictionnaire de selectedNodes, où l'attribut value de chaque élément est une chaîne XPath, utilisée pour sélectionner la valeur correspondante dans XML, et l'attribut name est utilisé pour spécifier le nom de l'attribut correspondant en JavaScript. À titre d'exemple ici, je n'ai obtenu que trois éléments de contenu. Vous pouvez voir que le namespaceMapping spécifié ci-dessus est utilisé dans le XPath de CurrentCondition.
Je n'entrerai pas dans les détails de XPath. Les amis qui sont intéressés ou qui ne le connaissent pas peuvent le rechercher eux-mêmes. Il existe de nombreuses ressources en ligne. Je ne connais pas très bien les autres types de Transformers, j'en parlerai si je les rencontre à l'avenir. Le fichier YahooWeatherBridge.asbx complété est le suivant :
<?xml version="1.0" encoding="utf-8" ?>
<bridge namespace="Dflying" className="YahooWeatherService">
<proxy type="Microsoft.Web.Services.BridgeRestProxy"
serviceUrl=" http://xml.weather.yahoo.com/forecastrss " />
<method name="GetWeather">
<entrée>
<nom du paramètre="p" />
<nom du paramètre="u" valeur="c" />
</entrée>
<transformations>
<transform type="Microsoft.Web.Services.XPathBridgeTransformer">
<données>
<attribute name="selector" value="channel" />
<dictionary name="namespaceMapping">
<item name="yweather" value=" http://xml.weather.yahoo.com/ns/rss/1.0 " />
</dictionnaire>
<nom du dictionnaire="selectedNodes">
<item name="Titre" value="titre" />
<item name="Description" value="item/description" />
<item name="CurrentCondition" value="item/yweather:condition/@text" />
</dictionnaire>
</données>
</transformation>
</transformations>
</méthode>
</pont>
Créez maintenant une page ASP.NET à tester. Tout d'abord, il y a toujours le ScriptManager répété mille fois et une référence à Bridge : <atlas:ScriptManager ID="sm" runat="server">.
<Prestations>
<atlas:ServiceReference Path="YahooWeatherBridge.asbx" />
</Services>
</atlas:ScriptManager>
Ensuite, il y a un élément HTML Select, qui répertorie plusieurs villes et les codes de ville correspondants :
<!-- place selector -->
<select id="lieu">
<option selected="selected" value="CHXX0116">Shanghai, CH</option>
<option value="USCA0746">Mountain View, Californie</option>
<option value="CHXX0008">Pékin, CH</option>
</sélectionner>
Un Bouton HTML permettant de déclencher l'appel au Service :
<!-- invoquer le service -->
<input id="getWeather" type="button" value="Obtenir la météo" onclick="return getWeather_onclick()" />
Un morceau de HTML est utilisé pour afficher le résultat :
<!-- display result -->
<div id="result" style="display: none;">
<div style="background-color: Gray; font-weight: bold;">Titre</div>
<div id="titre"></div>
<div style="background-color: Gray; font-weight: bold;">Description</div>
<div id="description"></div>
</div>
Vient ensuite JavaScript. Vous pouvez voir que Mashup est appelé via Dflying.YahooWeatherService.GetWeather(), et la valeur transformée est affichée sur la page après le retour de la méthode : function getWeather_onclick() {.
// nouveau contrôle atlas 'Select'
var place = new Sys.UI.Select($('place'));
// invoque la méthode bridge
Dflying.YahooWeatherService.GetWeather({'p': place.get_selectedValue()}, onGetComplete);
}
fonction onGetComplete (résultat) {
$('result').style.display = "bloc";
$('titre').innerHTML = résultat[0].Titre;
$('description').innerHTML = résultat[0].Description;
}