Опубликован: 02.08.2013 | Доступ: свободный | Студентов: 465 / 15 | Длительность: 18:38:00
Специальности: Программист
Самостоятельная работа 9:

Работа с API веб-сервисов

Facebook

Пример, демонстрирующий работу с сервисом 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

увеличить изображение
Рис. 31.3. Приложение, демонстрирующее работу с Facebook

Для успешного запуска приложения нужно заранее зарегистрировать приложение в сервисе 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 служб, которые могли бы представлять интерес для использования в вашем приложении и подготовьте обзорное сообщение по ним. Вы можете выбрать и большее количество служб – возможно, кому-нибудь из группы пригодится один из сервисов, рассмотренных вами.

Дополнительные материалы

К данной лабораторной работе подготовлено видеоприложение.