Статьи

Windows Phone REST … легкий путь

Снова и снова я вижу разработчиков, у которых есть отличная идея для приложения, которое извлекает классные данные из отличных сервисов, НО связывают себя с реализацией «Getting It Done». Поэтому я подумал, что покажу вам быстрый и простой способ получения данных REST из службы, передачи данных JSON в список POCO и связывания их со списком (менее чем за 3 минуты).

На твоей марке

Получить набор

Go .

Первое, что вам нужно сделать, это найти данные, которые вам интересны. Я люблю кофе, поэтому хочу создать приложение, которое показывает мне все кофейные места, которые находятся рядом со мной. Я могу сделать это с помощью поиска Bing  http://msdn.microsoft.com/en-us/library/dd251014.aspx 

В частности, я собираюсь использовать часть API PhoneBook Request, которая похожа на API Желтых страниц. Это даст мне все дела, которые обозначают себя как «кофейные» заведения.

(Да, я знаю, я не использую MVVM)

Сначала я создаю метод GetData () и вызываю его из моего конструктора MainPage ().

  public MainPage()
        {
            InitializeComponent();
            GetData();
        }

        private void GetData()
        {
            string uri = "http://api.bing.net/json.aspx?AppId=YOUR_APP_ID&Version=2.0&Market=en-US&Query=Coffee&Sources=phonebook&latitude=33.8563&longitude=-118.1232";
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(uri));
            request.BeginGetResponse(new AsyncCallback(ReadCallback), request);

        }

В GetData () первое, что я делаю, это звоню в BING API. 

Первая часть вызова показывает, что я хочу, чтобы json вернулся и предоставил мой App_ID (удален из поста) (Вы можете получить свой собственный ключ API Bing здесь http://msdn.microsoft.com/en-us/library/dd251020.aspx )

http://api.bing.net/json.aspx?AppId=YOUR_APP_ID

Далее я устанавливаю версию, Маркет, и что я ищу

&Version=2.0&Market=en-US&Query=Coffee&

И, наконец, я говорю, что я смотрю на часть телефонной книги API и где я хочу искать … В этом примере я жестко программирую широту / долготу, но вы, конечно, использовали бы географическое местоположение с телефона, но я хотел будь проще

Sources=phonebook&latitude=33.8563&longitude=-118.1232";

Далее нам нужно сделать звонок в сервис. Мы будем использовать запрос HttpWebRequest, передав ему только что созданный URI

HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create ( new Uri (uri));

И затем сделать в вызове и предоставить ему метод CallBack (Куда возвращается вызов, когда он завершен)

request.BeginGetResponse ( новый AsyncCallback (ReadCallback), запрос);

Теперь вот самое интересное. Для работы с данными JSon, возвращаемыми из этого запроса, нам нужно создать структуру классов, которая представляет данные …… ugggggg, что за боль, верно? Неправильно, все, что нам нужно сделать, это использовать http://json2csharp.com/     Просто вставьте либо возвращаемый JSon, либо строку URI, и он создаст классы для вас. Поэтому, когда я вставляю строку URI выше, это дает мне следующее.

(Конечно, вы можете разбить эти классы на отдельные файлы, но сейчас я просто вставил их в конец файла MainPage.xaml.cs.)

public class Query
    {
        public string SearchTerms { get; set; }
    }

    public class Result
    {
        public string Title { get; set; }
        public string Url { get; set; }
        public string Business { get; set; }
        public string PhoneNumber { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string StateOrProvince { get; set; }
        public string CountryOrRegion { get; set; }
        public string PostalCode { get; set; }
        public double Latitude { get; set; }
        public double Longitude { get; set; }
        public string UniqueId { get; set; }
        public string DisplayUrl { get; set; }
    }

    public class Phonebook
    {
        public int Total { get; set; }
        public int Offset { get; set; }
        public string LocalSerpUrl { get; set; }
        public string Title { get; set; }
        public List<Restuarnt> Results { get; set; }
    }

    public class SearchResponse
    {
        public string Version { get; set; }
        public Query Query { get; set; }
        public Phonebook Phonebook { get; set; }
    }

    public class RootObject
    {
        public SearchResponse SearchResponse { get; set; }
    }

Теперь, когда у вас есть классы, которые содержат возвращаемый json, все, что вам нужно сделать, это создать метод ReadCallback (определен выше)

private void ReadCallback(IAsyncResult asynchronousResult)
        {
            HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
            HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
            using (StreamReader streamReader1 = new StreamReader(response.GetResponseStream()))
            {
                string resultString = streamReader1.ReadToEnd();
                var ser = new DataContractJsonSerializer(typeof(RootObject));

                var stream = new MemoryStream(Encoding.Unicode.GetBytes(resultString));
                DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(RootObject));
                RootObject myBook = (RootObject)jsonSerializer.ReadObject(stream);

                Deployment.Current.Dispatcher.BeginInvoke(() => coffeeShops.ItemsSource = myBook.SearchResponse.Phonebook.Results); 

            }
        }

Вы можете видеть, что мы используем потоковое считывающее устройство для чтения результатов, а затем используем DataContractJsonSerializer для добавления данных в RootObject (Root Object — один из созданных для нас классов, который инкапсулирует все остальные)

В последней строке я собираю данные в поток пользовательского интерфейса с помощью Dispatcher.BeginInvoke и связываю их с ListBox с именем coffeeShops.

Это оно….

Теперь мне потребовалось 30 минут, чтобы написать это, но это займет у вас всего 3 минуты.

наслаждаться Улыбка


Источник: http://thesociablegeek.com/windows-phone-2/wp7-rest-the-easy-way/