You are on page 1of 6

Accediendo a un Servicio Web REST

Este artculo es una traduccin del artculo original encontrado en: http://create.msdn.com/enUS/education/quickstarts/Accessing_a_REST_Web_Service.

Representational State Transfer (REST) se refiere a un estilo arquitectnico para exponer recursos en la web para el acceso a los clientes. Muchos recursos, como blogs, mapas y productos, se exponen como servicios REST en la web. Silverlight proporciona clases que hacen que sea fcil llamar a los servicios REST desde una aplicacin de Windows Phone. Este tutorial presenta cmo llamar y trabajar con servicios REST. Contiene las siguientes secciones:

Llamando servicios REST Ejemplo para llamar un servicio REST Detectando la disponibilidad de la red Nota

Los ejemplos del uso de Silverlight se ejecutan en el navegador para simular su comportamiento para Windows Phone. El comportamiento real puede ser ligeramente diferente en el emulador de Windows Phone o en un dispositivo Windows Phone.

Llamando servicios REST


Se llama a un servicio REST utilizando verbos estndar HTTP (GET, POST, PUT, y DELETE). Los recursos son identificados por un URI. Una respuesta contiene una representacin, por lo general XML o JavaScript Object Notation (JSON), del recurso especificado. Las peticiones no tienen estado, lo que significa que toda la informacin necesaria para completar una peticin debe ser incluida con cada peticin. Un aspecto importante al llamar a un servicio REST es garantizar que se utiliza el URI correcto para el recurso que se est tratando de acceder. Las empresas normalmente enlistan los requerimientos para una peticin, incluyendo parmetros de la peticin y los valores que debes pasar para dichos parmetros. Por ejemplo, para llamar a los servicios Web de Bing, puede revisar la Gua del API de Bing. Silverlight para Windows Phone proporciona varias clases para llamar servicios REST. Es importante recordar, sin embargo, que en este momento Windows Phone soporta Silverlight 3, lo que significa que las caractersticas de red de Silverlight 4 no estn disponibles para los clientes de Windows Phone. Para obtener ms informacin acerca de las diferencias en las capacidades de red entre Silverlight para Windows Phone y Silverlight para el escritorio, vea Redes en Silverlight

para Windows Phone.


Para llamar a un servicio REST desde una aplicacin cliente de Windows Phone, puedes utilizar las clases WebClient o HttpWebRequest y HttpWebResponse. Con cualquiera de las opciones, las solicitudes son asincrnicas. Sin embargo, WebClient es la ms simple de las dos opciones.

WebClient utiliza un sistema simple basado en eventos para hacer peticiones y obtener respuestas. Para utilizar WebClient, se llama al mtodo apropiado Async y se maneja el eventoCompleted correspondiente. La siguiente tabla enlista algunos de los mtodos y eventos de WebClient que debes usar, dependiendo de la accin y del tipo de datos. Accin Tipo de datos Mtodos y eventos
Mtodo DownloadStringAsync GET String Evento DownloadStringCompleted Mtodo OpenReadAsync GET Stream Evento OpenReadCompleted Mtodo UploadStringAsync POST String Evento UploadStringCompleted Mtodo OpenWriteAsync POST Stream Evento OpenWriteCompleted

La clase HttpWebRequest te permite tener ms control sobre el mensaje de peticin, como el

envo de mensajes HTTP, PUT y DELETE. Para obtener ms informacin sobre el uso de las clases HttpWebRequest y HttpWebResponse, consulta la informacin general de la claseHttpWebRequest.

Ejemplo para llamar un servicio REST


El siguiente ejemplo muestra cmo utilizar la clase WebClient para enviar una peticin desde una aplicacin de telfono hacia el servicio de bsqueda de Bing. En este ejemplo, puedes cambiar el trmino de bsqueda seleccionado utilizando el combo box, lo cual actualiza la URI de bsqueda. Al hacer clic en el botn Search!, se enva una peticin al servicio de bsqueda de Bing. Adems del trmino de bsqueda, el URI de la peticin especifica que los resultados son una bsqueda Web y que la respuesta est en XML. Los resultados son interpretados y mostrados en el list box. Nota Aunque el ejemplo incluye un ID de Aplicacin Bing en el URI para completar la peticin de bsqueda, el ID de Aplicacin real no se muestra en el cdigo. Para obtener un ID de Aplicacin para llamar al servicio de bsqueda de Bing, consulta Introduccin al API de Bing Versin 2. Nota de seguridad Cuando se conecta a un Servicio Web que requiere una clave de aplicacin, no almacenes la clave de aplicacin en una aplicacin que se ejecutar en un dispositivo. En su lugar, puedes crear un Servicio Web proxy para autenticar a un usuario y llamar a un servicio en la nube con la clave de aplicacin. Para obtener ms informacin acerca de las recomendaciones de seguridad, consultaSeguridad en Servicios Web para Windows Phone.

El fragmento siguiente muestra el markup y el cdigo para este ejemplo. XAML


<phone:PhoneApplicationPage x:Class="WindowsPhoneApplication1.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800" FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}" SupportedOrientations="Portrait" Orientation="Portrait" shell:SystemTray.IsVisible="False"> <!LayoutRoot es la red de la raz donde se encuentra todo el contenido de la pgina > <Grid x:Name="LayoutRoot" Background="Transparent"> <Grid.Resources> <Style x:Key="ComboBoxItemStyle" TargetType="ComboBoxItem" > <Setter Property="Foreground" Value="Black"/> <Setter Property="Background" Value="LightGray"/> </Style> <Style x:Key="ComboBoxStyle" TargetType="ComboBox" > <Setter Property="Foreground" Value="Black"/> <Setter Property="Background" Value="Gray"/> </Style> </Grid.Resources> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!TitlePanel contiene el nombre de la aplicacin y el ttulo de la pgina > <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> <TextBlock x:Name="ApplicationTitle" Text="REST CLIENT" Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock x:Name="PageTitle" Text="bing search" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}" Height="99" Width="453" /> </StackPanel> <!ContentPanel colocar el contenido adicional aqu > <Grid x:Name="ContentPanel" Margin="12,139,12,0" Grid.RowSpan="2"> <Button Content="Search!" Height="89" HorizontalAlignment="Left" Margin="264,140,0,0" Name="button1" VerticalAlignment="Top" Width="189" Click="button1_Click" /> <ComboBox Height="50" Style="{StaticResource ComboBoxStyle}" HorizontalAlignment="Left" Margin="6,159" Name="comboBox1" ItemContainerStyle="{StaticResource ComboBoxItemStyle}" VerticalAlignment="Top" Width="235" ItemsSource="{Binding}" SelectionChanged="comboBox1_SelectionChanged" /> <TextBlock Height="36" HorizontalAlignment="Left" Margin="12,120" Name="textBlock2" Text="Search Topic:" VerticalAlignment="Top" Width="121" /> <TextBlock Height="23" HorizontalAlignment="Left" Margin="12,1,0,0" Name="textBlock3" Text="URI:" VerticalAlignment="Top" /> <TextBlock Height="86" HorizontalAlignment="Left" Margin="6,28" Name="uriTextBlock" TextWrapping="Wrap" Text="{Binding}" VerticalAlignment="Top" Width="447" /> <TextBlock Height="23" HorizontalAlignment="Left" Margin="12,242,0,0"

Name="textBlock5" Text="Results:" VerticalAlignment="Top" /> <ListBox Height="352" HorizontalAlignment="Left" Margin="6,271,0,0" Name="listBox1" VerticalAlignment="Top" Width="444" ItemsSource="{Binding}" > <ListBox.ItemTemplate> <DataTemplate> <Border BorderBrush="{StaticResource PhoneForegroundBrush}" Width="418" BorderThickness="2" Margin="2"> <StackPanel> <TextBlock Text="{Binding Path=Title}" TextWrapping="Wrap" /> <TextBlock Text="{Binding Path=Url}" TextWrapping="Wrap"/> </StackPanel> </Border> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid> </Grid> </phone:PhoneApplicationPage>

C#
using using using using using using using using using using using using using System; System.Collections.Generic; System.Linq; System.Net; System.Windows; System.Windows.Controls; System.Windows.Documents; System.Windows.Input; System.Windows.Media; System.Windows.Media.Animation; System.Windows.Shapes; Microsoft.Phone.Controls; System.Xml.Linq;

namespace WindowsPhoneApplication1 { public partial class MainPage : PhoneApplicationPage { // Constructor String requestString = "http://api.bing.net/xml.aspx?AppId=YourAppId&Query={0}&Sources=Web&Version=2.0&Mark et=en-us&Adult=Strict"; string UriNoAppId = "http://api.bing.net/xml.aspx?AppId=YourAppId&Query={0}&Sources=Web&Version=2.0&Mark et=en-us&Adult=Strict"; public MainPage() { InitializeComponent(); List<string> searchTopics = new List<string>() { "Microsoft", "Silverlight", "Windows Phone 7" }; comboBox1.DataContext = searchTopics; comboBox1.SelectedIndex = 0; // Crear el cliente Web y asociar un controlador al evento OpenReadCompleted. wc = new WebClient(); wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted); } // Llame al servicio de tema en el sitio de bsqueda Bing. WebClient wc;

private void CallToWebService() { // Llamar a la OpenReadAsyc para hacer una peticin GET, pasando la URL con la cadena de bsqueda seleccionados. wc.OpenReadAsync(new Uri(String.Format(requestString, comboBox1.SelectedItem.ToString()))); } void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) { XElement resultXml; / / Siempre se debe comprobar si ha ocurrido un error. if (e.Error != null) { return; } else { XNamespace web = "http://schemas.microsoft.com/LiveSearch/2008/04/XML/web"; try { resultXml = XElement.Load(e.Result); / / Buscar el nodo WebResult y crear un SearchResults objeto para cada uno. var searchResults = from result in resultXml.Descendants(web + "WebResult") select new SearchResult { / / Obtener la descripcin del ttulo, y los valores Url. Title = result.Element(web + "Title").Value, Description = result.Element(web + "Description").Value, Url = result.Element(web + "Url").Value }; / / Establecer los datos de contexto para el cuadro de lista a los resultados. listBox1.DataContext = searchResults; } catch (System.Xml.XmlException ex) { textBlock2.Text = ex.Message; } } } private void button1_Click(object sender, RoutedEventArgs e) { CallToWebService(); } / / Actualizar el TextBlock como cambia la seleccin de cuadro combinado. private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) { uriTextBlock.DataContext = string.Format(UriNoAppId, e.AddedItems[0]); } } // Clase simple que contenga los resultados de bsqueda. public class SearchResult { public string Title { get; set; } public string Url { get; set; } public string Description { get; set; } } }

Detectando la disponibilidad de la red

Para asegurar una buena experiencia de usuario, debes comprobar que el telfono tiene acceso a Internet antes de llamar a un Servicio Web. Usas el mtodoNetworkInterface.GetIsNetworkAvailable para determinar si el telfono tiene conexin

a Internet. Puedes llamar este mtodo antes de llamar al Servicio Web. Si el mtodo devuelve false, ya sea que pidas al usuario que se conecte a una red viable o hazle saber que la llamada al servicio no pudo ser completada. Para un ejemplo de cmo utilizar este mtodo, consultaNetworkInterface.GetIsNetworkAvailable.
Nota La llamada al mtodo NetworkInterface.GetIsNetworkAvailable puede devolver true en el emulador, aun cuando una red no est disponible, por lo que debes probar el cdigo en un dispositivo.
Tags: mva, Silverlight, tutorial, Tutoriales, Windows Phone 7, WP7

You might also like