Статьи

Получайте удовольствие от мобильных служб Azure — приложение для Windows Phone

Вам понравилось работать с Azure Mobile Service с приложением Windows 8? Хорошо, потому что теперь веселье продолжится! Мы будем делать те же операции, используя приложение Windows Phone. Как я уже ожидал в предыдущих статьях, на самом деле нет Windows Phone SDK, и причина очень проста: Microsoft, вероятно, ждет выпуска Windows Phone 8 SDK, чтобы обеспечить надлежащую поддержку как старого, так и нового мобильного устройства. Платформа.

Но нам не о чем беспокоиться: наш сервис — это сервис REST, который поддерживает протокол OData, поэтому мы можем взаимодействовать с ним начиная с сегодняшнего дня, используя простые HTTP-запросы и анализируя HTTP-ответ.

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

  • RestSharp , это оболочка класса HttpWebRequest, которая упрощает код, необходимый для взаимодействия со службой REST. Иногда RestSharp пытается быть «слишком умным» на мой вкус, как мы увидим позже, но это все же идеальный кандидат для нашего сценария.
  • JSON.NET, это библиотека, которая предоставляет много полезных функций при работе с данными JSON, таких как сериализация, десериализация, а также язык манипулирования на основе LINQ, называемый LINQ to JSON.

Давайте начнем! Сначала необходимо открыть Visual Studio 2010 (выпуск 2012 года пока не поддерживается текущим Windows Phone SDK) и создать новый проект Windows Phone. Затем, используя NuGet, мы собираемся установить две библиотеки: щелкните правой кнопкой мыши по проекту, выберите « Управление пакетами NuGet» и найдите две необходимые библиотеки, используя ключевые слова RestSharp и JSON.NET .

Пользовательский интерфейс приложения будет очень похож на тот, который мы использовали для приложения Windows 8, я только что заменил ListView на ListBox .

<StackPanel>
    <Button Content="Insert data" Click="OnAddNewComicButtonClicked" />
    <Button Content="Show data" Click="OnGetItemButtonClicked" />
    <ListBox x:Name="ComicsList">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Margin="0, 20, 0, 0">
                    <TextBlock Text="{Binding Title}" />
                    <TextBlock Text="{Binding Author}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</StackPanel>

Вставьте некоторые данные

Чтобы вставить данные, нам нужно отправить HTTP-запрос в службу, используя метод POST; Тело запроса будет JSON, который представляет наш объект Comic . Давайте сначала посмотрим код:

private void OnAddNewComicButtonClicked(object sender, RoutedEventArgs e)
{
 
    RestRequest request = new RestRequest("https://myService.azure-mobile.net/tables/Comics");
 
    request.Method = Method.POST;
    request.AddHeader("X-ZUMO-APPLICATION", "your-application-key");
 
    Comic comic = new Comic
                       {
                           Title = "300",
                           Author = "Frank Miller"
                       };
 
    string jsonComic = JsonConvert.SerializeObject(comic, new JsonSerializerSettings
                                                              {
                                                                  NullValueHandling = NullValueHandling.Ignore
                                                              });
 
    request.AddParameter("application/json", jsonComic, ParameterType.RequestBody);
 
    RestClient client = new RestClient();
    client.ExecuteAsync(request, response =>
                                     {
                                         MessageBox.Show(response.StatusCode.ToString());
                                     });
 
}

Первое, что мы делаем, это создаем RestRequest , который является классом RestSharp, представляющим веб-запрос: URL-адрес запроса (который передается как параметр конструктора) является URL-адресом нашего сервиса.

Затем мы устанавливаем метод HTTP, который мы собираемся использовать (в данном случае POST, поскольку мы собираемся добавить некоторые данные для таблицы), и мы устанавливаем секретный ключ приложения: благодаря Fiddler, перехватывая трафик нашего В предыдущем приложении Windows 8 я обнаружил, что ключ, который в нашем приложении Windows Store был передан в качестве параметра конструктора класса MobileService, был добавлен в качестве заголовка запроса с именем X-ZUMO-APPLICATION. Мы делаем то же самое, используя метод AddHeader, предоставленный RestSharp.

Следующим шагом является создание объекта Comic, который мы собираемся вставить в таблицу: для этой задачи, пожалуйста, поприветствуйте Json.net, который мы собираемся использовать для сериализации нашего объекта Comic , что означает преобразование его в простую строку JSON. , Что это означает? Если вы установите точку останова в этом методе и посмотрите на содержимое переменной jsonComic , вы найдете текстовое представление нашего сложного объекта, например, следующее:

{
    "Author" : "Frank Miller",
    "Title" : "300"
}

Мы выполняем эту задачу , используя SerializeObject метод JsonConvert класса: кроме прохождения Comic объекта метода, мы также передать JsonSerializerSettings объект, который мы можем использовать для настройки процесса сериализации. В этом случае мы говорим сериализатору не включать свойства объекта, имеющие нулевое значение . Этот шаг очень важен: вы помните, что у комического объекта есть Idсвойство, которое действует как первичный ключ и которое автоматически генерируется каждый раз, когда мы вставляем новый элемент в таблицу? Без этой настройки сериализатор добавит свойство Jd в Json со значением «0». В этом случае запрос к службе завершится неудачей, поскольку он не является допустимым значением: свойство Id не должно указываться, поскольку его генерирует база данных.

Получив json, мы можем добавить его в тело нашего запроса: вот небольшая хитрость, чтобы избежать того, что RestSharp пытается быть слишком умным для нас. В самом деле, если вы используете AddBody метод RestRequest объекта вы не имеете способ указать что тип содержимого запроса. RestSharp попытается угадать это и применит это: проблема в том, что иногда RestSharp не может правильно распознать тип содержимого, и это один из таких случаев. В моих тестах каждый раз, когда я пытался добавить json в тело запроса, RestSharp устанавливал тип контента на text / xml , что не только неправильно, но и активно отклоняется мобильной службой Azure, поскольку это единственный приемлемый тип контента это приложение / JSON .

Используя метод AddParameter и вручную указав тип содержимого, содержимое тела и тип параметра ( ParameterType.RequestBody ), мы можем применить обходной путь к этому поведению. В конце мы можем выполнить запрос, создав новый экземпляр класса RestClient и вызвав метод ExecuteAsync , который принимает в качестве параметров запрос и обратный вызов, который выполняется, когда мы получаем ответ от нашего сервиса. Просто чтобы проследить, что происходит, в обратном вызове мы просто отображаем с помощью MessageBox код состояния: если все, что мы сделали, правильно, то полученный код состояния должен быть создан.

Чтобы проверить это, просто перейдите на портал управления Azure , откройте панель управления своей службы и перейдите на вкладку данных: вы должны увидеть новый элемент в таблице.

Играть с данными

Возвращение данных для целей отображения немного проще: это просто запрос GET с теми же функциями, что и для запроса POST. Разница в том, что на этот раз мы будем использовать десериализацию , которая представляет собой процесс преобразования JSON, который мы получаем от сервиса, в объекты C #.

private void OnGetItemButtonClicked(object sender, RoutedEventArgs e)
{
    RestRequest request = new RestRequest("https://myService.azure-mobile.net/tables/Comics");
    request.AddHeader("X-ZUMO-APPLICATION", "my-application-key");
    request.Method = Method.GET;
 
    RestClient client = new RestClient();
    client.ExecuteAsync(request, result =>
                                     {
                                         string json = result.Content;
                                         IEnumerable<Comic> comics = JsonConvert.DeserializeObject<IEnumerable<Comic>>(json);
                                         ComicList.ItemsSource = comics;
                                     });
}

Первая часть кода должна быть проста для понимания, поскольку мы вставляем данные так же, как мы написали: мы создаем объект RestRequest , добавляем заголовок с ключом приложения и выполняем запрос асинхронно, используя объект RestClient .

На этот раз в ответе, а точнее в свойстве Content, мы получаем JSON со списком всех комиксов, которые хранятся в нашей таблице. Пора снова использовать Json.NET: на этот раз мы будем использовать DeserializeObject <T> метод JsonConvert класса, где T является типом объекта , мы ожидаем , чтобы вернуться после процесса десериализации. В этом случае тип возвращаемого значения — IEnumerable <Comic>, поскольку наш запрос возвращает коллекцию всех комиксов, хранящихся в таблице.

Некоторые сложные сценарии для игры с данными

В следующих статьях мы увидим еще несколько операций, которые мы можем выполнять с данными: мобильная служба, созданная с помощью Azure, поддерживает протокол OData; это означает, что мы можем выполнять дополнительные операции (такие как фильтрация результатов) непосредственно с помощью HTTP-запроса, без необходимости сначала получать все содержимое таблицы. Посмотрим, как это сделать, а пока… счастливого кодирования!