Работа с http и простой клиент для чтения rss




Выполнение работы

Возможность получать данные извне и сохранять их локально для дальнейшего использования или сохранять локально настройки приложение или результаты его работы – важная часть возможностей мобильной платформы.

На примере простого приложения мы научимся получать данные по протоколу HTTP и, при необходимости, сохранять их на устройстве.

Работа с http и простой клиент для чтения rss

Разработаем простой клиент для чтения RSS, который будет при запуске обращаться по определенному адресу, считывать RSS ленту и представлять её заголовки пользователю. Для простоты мы закодируем ссылку на RSS ленту прямо в код, в качестве примера ленты в нашем приложении будет использоваться RSS лента русского блога MSDN: https://blogs.msdn.com/b/rudevnews/rss.aspx

Наш клиент будет отображать только заголовки с возможностью перейти по ссылке на новость, так что разработку начнём со стандартного шаблона Windows Phone Application и назовём приложение SimpleRussianRSSReader.

Сначала научимся получать данные, а потом перейдем к их отображению.Добавим в код константу – URL, указывающий на RSS:

const string RSS = "https://blogs.msdn.com/b/rudevnews/rss.aspx";

Теперь нам надо обратиться по указному адресу и скачать ленту. Разработчику доступны два API: WebClient и HttpWebRequest. WebClient API позволяет удобно работать со GET/POST запросами, HttpWebRequest позволяет использоваться методы PUT/DELETE и даёт больше контроля разработчику над параметрами запроса. Поскольку нам надо просто скачать документ с веба, мы будем использовать WebClient.

Напишем простую функцию, в которой создадим экземпляр класса, зарегистрируемся на окончание процесса скачивания и запустим асинхронную процедуру скачивания документа:

 

Листинг 1

private void LoadRSS()

{

WebClient client = new WebClient();

client.DownloadStringCompleted +=

new DownloadStringCompletedEventHandler

(client_DownloadStringCompleted);

client.DownloadStringAsync(new Uri(RSS));

}

Добавим глобальную строковую переменную в которой сохраним результат запроса:

Листинг 2

string RSSString = "";

И в обработчике завершения скачивания, при отсутствии ошибок, присвоим ей значения результата:

void client_DownloadStringCompleted

(object sender, DownloadStringCompletedEventArgs e)

{

if (e.Error == null)

{

RSSString = e.Result;

}

}

Чтобы проверить работоспособность кода на этом этапе, добавим элемент управления TextBlock на страницу приложения, заодно отредактировав его название, так что XAML код будет выглядеть следующим образом:

Листинг 3

<!--TitlePanel contains the name of the application and page title-->

<StackPanel x:Name="TitlePanel"

Grid.Row="0" Margin="12,17,0,28" >

<TextBlock x:Name="ApplicationTitle"

Text="РУССКИЙ MSDN" Style="{StaticResource PhoneTextNormalStyle}" />

<TextBlock x:Name="PageTitle"

Text="новости" Margin="9,-7,0,0"

Style="{StaticResource PhoneTextTitle1Style}" />

</StackPanel>

<!--ContentPanel - place additional content here-->

<Grid x:Name="ContentPanel" Grid.Row="1"

Margin="12,0,12,0" >

<TextBlock Name="RSSText" > </TextBlock>

</Grid>

В конструктор класса добавим вызов функции LoadRSS, а в обработчик загрузки, присвоение свойству Text элемента управления RSSText результата полученного из веб.

Запустите приложение (F5) и убедитесь, что мы получаем ответ от сервера.

Рисунок 1 – Получение RSS ленты

Собственно мы научились основам работы с HTTP. Тот же самый запрос, реализованный через HttpWebRequest потребует значительных усилий, написания callback функции и определения множества дополнительных переменных.

Чтобы получить более красивый интерфейс отображения мы немного забежим вперёд. Настойчивый читатель сможет при желании разобраться с

Удалим TextBloсk и добавим ListBox с шаблоном и привязкой к данным.

Листинг 4

<!--ContentPanel - place additional content here-->

<Grid x:Name="ContentPanel" Grid.Row="1"

Margin="12,0,12,0" >

<ListBox Name="RssList" >

<ListBox. ItemTemplate >

<DataTemplate>

<StackPanel>

<TextBlock Text="{Binding pubDate}" FontSize="20"

Foreground="Coral" />

<TextBlock Text="{Binding title}" TextWrapping="Wrap"

FontSize="22" />

</StackPanel>

</DataTemplate>

</ListBox.ItemTemplate>

</ListBox>

</Grid>

Теперь нужно создать класс, который будет содержать свойства pubDate и title. Список экземпляров этого класса мы получим разобрав при помощи LINQ полученный XML.

Добавьте в решение класс с именем PostMessage и определите в нем свойства pubDate и title типа строка:

 

Листинг 5

public class PostMessage

{

public string pubDate { get; set; }

 

public string title { get; set; }

}

Теперь добавьте в решение ссылку на библиотеку System.Xml.Linq и соответствующую директиву using в файл MainPage.xaml.cs

using System.Xml.Linq;

Теперь в обработчике результатов запроса мы можем обработать полученные результаты, проинициализировать список экземпляров класса и связать его с ListBox, чтобы отобразить в интерфейсе пользователя.

Листинг 6

XElement twitterElements = XElement.Parse(e.Result);

var postList =

from tweet in twitterElements.Descendants("item")

select new PostMessage

{

title = tweet.Element("title").Value,

pubDate = tweet.Element("pubDate").Value

};

RssList.ItemsSource = postList;

 

Запустим приложение (F5) и проверьте, как работает наш простой клиент RSS.

Рисунок 2- тестирование приложения

Есть ещё много возможностей доработать данное приложение как в смысле дизайна визуального, так и программного. Например, можно отображать дату в соответствии с региональным настройками телефона, можно по щелчку по теме сообщения открывать возможность чтения тела сообщения в RSS – оставляем это для наших следующих частей или для самостоятельной работы читателей.

В качестве же последнего усовершенствования и закрепления материала по задачам запуска, модифицируем программу, чтобы при выборе темы открывался интернет браузер со страницей блога.

Добавим в класс PostMessage свойство link:

 

Листинг 7

public class PostMessage

{

public string pubDate { get; set; }

 

public string title { get; set; }

 

public string link { get; set; }

}

При разборе RSS добавим инициализацию этого поля:

Листинг 8

var postList =

from tweet in twitterElements.Descendants("item")

select new PostMessage

{

title = tweet.Element("title").Value,

pubDate = tweet.Element("pubDate").Value,

link = tweet.Element("link").Value

};

В XAML файле MainPage назначим обработчик события SelectionChanged и напишем следующий код в этом обработчике:

Листинг 9

private void RssList_SelectionChanged

(object sender, SelectionChangedEventArgs e)

{

WebBrowserTask webTask = new WebBrowserTask();

webTask.Uri = new Uri(((PostMessage)(RssList.SelectedItem)).link);

webTask.Show();

}

Не забудьте добавить в секцию using следующую директиву:

using Microsoft.Phone.Tasks;

Запустим приложение (F5) и проверьте, как оно работает.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: