Снова и снова я вижу разработчиков, у которых есть отличная идея для приложения, которое извлекает классные данные из отличных сервисов, НО связывают себя с реализацией «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/