Autor: Dflying Chen ( http://dflying.cnblogs.com/ )
No artigo anterior (Chamando Web Service no ASP.NET Atlas - Criando Mashup para Chamar Web Service Remoto (Conhecimento Básico e Exemplo Simples)), apresentei alguns conhecimentos básicos de Mashup para Web Service remoto no Atlas e dei um exemplo mais básico. isso não é nada útil. Voltando a este tópico hoje, darei um exemplo mais complexo, mas um tanto útil - Yahoo Weather!
Chega de bobagem, vamos primeiro nos familiarizar com o serviço Yahoo! Weather: o Yahoo! fornece um serviço de previsão do tempo em seu site ( http://weather.yahoo.com/ ) e também fornece uma interface de serviço da Web ( http :/ /developer.yahoo.com/weather/ )
Pelas duas páginas da web acima, podemos saber que a URL do serviço meteorológico fornecido pelo Yahoo! é http://xml.weather.yahoo.com/forecastrss . O serviço também possui dois parâmetros:
p: o código do local onde o serviço está localizado. o clima deve ser consultado (você pode verificar este código em diferentes locais em http://weather.yahoo.com/ ).
u: A unidade da temperatura no resultado retornado, f representa Fahrenheit e c representa Celsius.
Parece que este serviço do Yahoo! Weather é bastante simples. Vamos testar se funciona bem. Primeiro acesse http://weather.yahoo.com/ e descubra que o código de localização de Xangai é CHXX0116. Em seguida, digite http://xml.weather.yahoo.com/forecastrss?p=CHXX0116&u=c no navegador. Bem, o seguinte XML não muito complicado é retornado:
Resultado XML do Yahoo Weather Service.
<?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>Yahoo! - Xangai, CH</title>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Shanghai__CH/*http://xml.weather.yahoo.com/forecast/CHXX0116_c.html</link>
<descrição>Tempo do Yahoo! para Xangai, CH</descrição>
<idioma>en-us</idioma>
<lastBuildDate>Qui, 25 de maio de 2006, 11h00 CST</lastBuildDate>
<ttl>60</ttl>
<yweather:location city="Shanghai" região="" país="CH" />
<yweather:unidades temperatura="C" distância="km" pressão="mb" velocidade="kph" />
<yclima:vento frio="21" direção="260" velocidade="14" />
<yclima:umidade atmosférica="78" visibilidade="299" pressão="0" subindo="0" />
<yweather:astronomia nascer do sol="4h52" pôr do sol="18h50" />
<imagem>
<title>Tempo do Yahoo!</title>
<largura>142</largura>
<altura>18</altura>
<link>http://weather.yahoo.com/</link>
<url>/u/info_img/2009-06/30/main_142b.gif</url>
</imagem>
<item>
<title>Condições para Xangai, CH às 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>Qui, 25 de maio de 2006, 11h00 CST</pubDate>
<yweather:condition text="Fog" code="20" temp="21" date="Qui, 25 de maio de 2006, 11h00 CST" />
<descrição>
<![CDATA[
<img src=" <b>Condições Atuais:</b><br />
Nevoeiro, 21 C<BR /><BR />
<b>Previsão:</b><BR />
Qui - Trovoadas dispersas Alta: 25 Baixa: 20<br />.
Sexta-feira - AM Chuvas Alta: 26 Baixa: 18<br />
<br />
<a href=" http://us.rd.yahoo.com/dailynews/rss/weather/Shanghai__CH/*http://xml.weather.yahoo.com/forecast/CHXX0116_c.html"> Previsão completa no Yahoo! Clima</a><BR/>
(fornecido pelo The Weather Channel)<br/>
]]>
</descrição>
<yweather:forecast day="Qui" date="25 de maio de 2006" low="20" high="25" text="Tempestades dispersas" code="38" />
<yweather:forecast day="Sex" date="26 de maio de 2006" low="18" high="26" text="Chuveiros AM" code="39" />
<guid isPermaLink="false">CHXX0116_2006_05_25_11_0_CST</guid>
</item>
</canal>
</rss>
<!-- p1.weather.scd.yahoo.com descompactado/chunked Qui, 25 de maio 20:49:07 PDT 2006 -->
Podemos ver que as informações que ele fornece são muito abrangentes (até mesmo os horários do nascer e do pôr do sol... ), vamos escrever a página asbx Bridge para Mashup este serviço.
Primeiro, referindo-nos à instrução asbx no artigo Chamando Web Service no ASP.NET Atlas - Criando Mashup para Chamar Remote Web Service (Conhecimento Básico e Exemplo Simples), podemos escrever o seguinte parágrafo:
<?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 " />
<nome do método="GetWeather">
<entrada>
<nome do parâmetro = "p" />
<nome do parâmetro = "u" valor = "c" />
</input>
</método>
</ponte>
em:
Os atributos namespace e className de <bridge> e o atributo name de <method> nos permitem acessar este mashup no JavaScript do cliente por meio de assinaturas de método como Dflying.YahooWeatherService.GetWeather().
O atributo serviceUrl de <proxy> especifica a URL do Yahoo Weather Service.
O método GetWeather define os dois parâmetros p e u listados acima. Especificamos o valor padrão do parâmetro u como c (representando graus Celsius), e o parâmetro p será passado pelo chamador.
Esta etapa é suficiente. O cliente receberá a String XML vista no navegador acima, e ela poderá ser processada e exibida no cliente. Mas o processamento de XML pelo cliente não é tão fácil ou eficiente, e transmitir muitas informações desnecessárias pela rede também é um desperdício. Então aqui usamos o Transformer embutido no asbx para processar esse XML, extrair o conteúdo de nosso interesse e enviá-lo ao cliente na forma de JSON. Adicione o seguinte parágrafo à seção <method>:
<transforms>
<transform type="Microsoft.Web.Services.XPathBridgeTransformer">
<dados>
<attribute name="seletor" value="canal" />
<dictionary name="namespaceMapping">
<item name="yweather" value=" http://xml.weather.yahoo.com/ns/rss/1.0 " />
</dicionário>
<dictionary name="selectedNodes">
<item name="Título" value="título" />
<item name="Descrição" value="item/descrição" />
<item name="CurrentCondition" value="item/yweather:condition/@text" />
</dicionário>
</dados>
</transformar>
</transforma>
A instrução <transforms> indica que o valor de retorno deste método Mashup será alterado por alguns transformadores. Ela declara um transformador do tipo Microsoft.Web.Services.XPathBridgeTransformer, o que significa que expressões XPath serão utilizadas para conversão. As seguintes partes devem ser declaradas neste XPathBridgeTransformer:
name é um segmento de atributo do seletor e o atributo de valor especificado é uma expressão XPath, que selecionará o segmento de dados que será usado por todo o XPathBridgeTransformer.
name é um segmento de dicionário de namespaceMapping, que especifica o mapeamento de namespace neste arquivo XML. Se usarmos um determinado namespace no processo de seleção de nó a seguir, sua declaração deverá estar aqui. Aqui adicionamos um mapeamento para yweather, pois ele será usado abaixo.
name é um segmento de dicionário de selectNodes, onde o atributo value de cada item é uma string XPath, usada para selecionar o valor correspondente de XML, e o atributo name é usado para especificar o nome do atributo correspondente em JavaScript. Como exemplo aqui, obtive apenas três partes do conteúdo. Você pode ver que o namespaceMapping especificado acima é usado no XPath de CurrentCondition.
Não vou entrar em detalhes sobre o XPath. Amigos que estão interessados ou não familiarizados com ele podem pesquisar no Google por conta própria. Não estou muito familiarizado com outros tipos de Transformers. Falarei sobre eles se os encontrar no futuro. O arquivo YahooWeatherBridge.asbx completo é o seguinte:
<?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 " />
<nome do método="GetWeather">
<entrada>
<nome do parâmetro = "p" />
<nome do parâmetro = "u" valor = "c" />
</input>
<transforma>
<transform type="Microsoft.Web.Services.XPathBridgeTransformer">
<dados>
<attribute name="seletor" value="canal" />
<dictionary name="namespaceMapping">
<item name="yweather" value=" http://xml.weather.yahoo.com/ns/rss/1.0 " />
</dicionário>
<dictionary name="selectedNodes">
<item name="Título" value="título" />
<item name="Descrição" value="item/descrição" />
<item name="CurrentCondition" value="item/yweather:condition/@text" />
</dicionário>
</dados>
</transformar>
</transforma>
</método>
</ponte>
Agora crie uma página ASP.NET para testar. Primeiro, ainda existe o ScriptManager repetido mil vezes, e uma referência ao Bridge: <atlas:ScriptManager ID="sm" runat="server">.
<Serviços>
<atlas:ServiceReference Path="YahooWeatherBridge.asbx" />
</Serviços>
</atlas:ScriptManager>
Depois, há um elemento HTML Select, que lista diversas cidades e códigos de cidade correspondentes:
<!-- place selector -->
<selecione id="local">
<option selected="selected" value="CHXX0116">Xangai, CH</option>
<option value="USCA0746">Mountain View, CA</option>
<option value="CHXX0008">Pequim, CH</option>
</selecionar>
Um botão HTML usado para acionar a chamada para o serviço:
<!-- invocar o serviço -->
<input id="getWeather" type="button" value="Obter clima" onclick="return getWeather_onclick()" />
Um pedaço de HTML é usado para exibir o resultado:
<!-- display result -->
<div id="resultado" style="display: nenhum;">
<div style="background-color: Gray; font-weight: negrito;">Título</div>
<div id="title"></div>
<div style="background-color: Gray; font-weight: negrito;">Descrição</div>
<div id="descrição"></div>
</div>
Em seguida, vem o JavaScript. Você pode ver que o Mashup é chamado por meio de Dflying.YahooWeatherService.GetWeather(), e o valor transformado é enviado para a página após o retorno do método: function getWeather_onclick() {
// novo controle 'Select' do atlas
var lugar = new Sys.UI.Select($('lugar'));
//invoca o método bridge
Dflying.YahooWeatherService.GetWeather({'p': place.get_selectedValue()}, onGetComplete);
}
função onGetComplete(resultado) {
$('resultado').style.display = "bloquear";
$('título').innerHTML = resultado[0].Título;
$('descrição').innerHTML = resultado[0].Descrição;
}