Работа с API веб-сервисов
Пример, демонстрирующий работу с сервисом Facebook и дополнительные материалы можно найти здесь: https://github.com/facebook-csharp-sdk/facebook-windows-phone-sample. Фактически, здесь речь идёт о примере использования библиотеки Facebook C# SDK v6 в приложениях для Windows Phone.
Пример (Рис. 16.3) демонстрирует применение библиотеки в Windows Phone 7, преобразование проекта к версии платформы Windows Phone 8 подтверждает работоспособность используемых механизмов в Windows Phone 8. Библиотеки, подобные рассматриваемой здесь, периодически обновляются, поэтому вполне можно ожидать появления новой версии библиотеки, которая предназначена для Windows Phone 8.
Для успешного запуска приложения нужно заранее зарегистрировать приложение в сервисе Facebook и получить идентификатор приложения (App ID/API Key). Указание этого идентификатора в соответствующем месте приложения (в файле кода к странице FacebookLoginPage.xaml.cs, в строковой константе AppId), во-первых, приводит к возможности успешно запустить приложение, во-вторых, приводит к тому, что Facebook распознаёт это приложение как то, которое вы зарегистрировали и идентификатор которого указали. Этот идентификатор стоит держать в секрете, так как, хотя разработчик и может контролировать зарегистрированное приложение, знание его третьими лицами позволит им создать приложение, действующее от имени приложения разработчика.
В приложении реализована следующая схема работы. Страница MainPage.xaml содержит кнопку Login To Facebook, нажатие на которую приводит к открытию страницы FacebookLoginPage.xaml (Листинг 16.2). Не забудьте, что, для работы приложения нужно заполнить поле AppId, введя в него данные приложения, зарегистрированного на Facebook (https://developers.facebook.com).
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using Microsoft.Phone.Controls; using Facebook; namespace facebook_windows_phone_sample.Pages { public partial class FacebookLoginPage : PhoneApplicationPage { private const string AppId = ""; /// <summary> /// Расширенные разрешения – это список полномочий, разделенных запятой и запрашиваемых у пользователя /// </summary> /// <remarks> /// Список доступных расширенных разрешений можно найти по данной ссылке /// https://developers.facebook.com/docs/reference/api/permissions/ /// </remarks> private const string ExtendedPermissions = "user_about_me,read_stream,publish_stream"; private readonly FacebookClient _fb = new FacebookClient(); public FacebookLoginPage() { InitializeComponent(); } private void webBrowser1_Loaded(object sender, RoutedEventArgs e) { var loginUrl = GetFacebookLoginUrl(AppId, ExtendedPermissions); webBrowser1.Navigate(loginUrl); } private Uri GetFacebookLoginUrl(string appId, string extendedPermissions) { var parameters = new Dictionary<string, object>(); parameters["client_id"] = appId; parameters["redirect_uri"] = "https://www.facebook.com/connect/login_success.html"; parameters["response_type"] = "token"; parameters["display"] = "touch"; // добавляем 'scope' только если имеется extendedPermissions. if (!string.IsNullOrEmpty(extendedPermissions)) { // Список разрешений, разделённых запятой parameters["scope"] = extendedPermissions; } return _fb.GetLoginUrl(parameters); } private void webBrowser1_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e) { FacebookOAuthResult oauthResult; if (!_fb.TryParseOAuthCallbackUrl(e.Uri, out oauthResult)) { return; } if (oauthResult.IsSuccess) { var accessToken = oauthResult.AccessToken; LoginSucceded(accessToken); } else { // Отменено пользователем MessageBox.Show(oauthResult.ErrorDescription); } } private void LoginSucceded(string accessToken) { var fb = new FacebookClient(accessToken); fb.GetCompleted += (o, e) => { if (e.Error != null) { Dispatcher.BeginInvoke(() => MessageBox.Show(e.Error.Message)); return; } var result = (IDictionary<string, object>)e.GetResultData(); var id = (string)result["id"]; var url = string.Format("/Pages/FacebookInfoPage.xaml?access_token={0}&id={1}", accessToken, id); Dispatcher.BeginInvoke(() => NavigationService.Navigate(new Uri(url, UriKind.Relative))); }; fb.GetAsync("me?fields=id"); } } }Листинг 31.2. Код файла FacebookLoginPage.xaml.cs
На данной странице расположен элемент управления WebBrowser. Фактически, авторизация пользователя в сервисе происходит с использованием веб-интерфейса сервиса. Здесь пользователь вводит учетные данные, даёт, если считает нужным, разрешения приложению на выполнение некоторых действий, после успешной авторизации приложение получает некоторые сведения, в частности, маркер доступа (access token) и идентификатор пользователя (user id). Здесь же начинается применение механизмов библиотеки Facebook, в частности, используется класс FacebookClient.
Работа с данной страницей, при успешной авторизации, завершается открытием страницы FacebookInfoPage.xaml с передачей ей полученных маркера доступа и идентификатора пользователя. В коде страницы так же используются механизмы библиотеки Facebook.
Выводы
Разработка приложений, которые могут взаимодействовать с веб-службами, используя API этих служб, обычно начинается с регистрации приложения и с изучения API нужной службы. При этом надо принимать во внимание тот факт, что для некоторых API разработаны общедоступные библиотеки, которые позволяют ускорить и упростить процесс разработки за счёт использования стандартных способов взаимодействия с API, реализованных в них.
Задание
Подумайте, какие выгоды приложение, разработкой которого вы занимаетесь, может извлечь из работы с веб-сервисами, предоставляющими программный доступ к своим возможностям. Существует огромное количество таких сервисов, если известные вам сервисы не представляется возможным использовать в приложении, поработайте со списком веб-служб по этому адресу: http://www.programmableweb.com/apis. Здесь сервисы разделены по категориям, присутствуют краткие описания их API. Выберите как минимум 5 служб, которые могли бы представлять интерес для использования в вашем приложении и подготовьте обзорное сообщение по ним. Вы можете выбрать и большее количество служб – возможно, кому-нибудь из группы пригодится один из сервисов, рассмотренных вами.
Дополнительные материалы
К данной лабораторной работе подготовлено видеоприложение.