Общее ведению в теорию по взаимодействию с сервером
Сервер — программное обеспечение, принимающее запросы от клиентов.
Веб-сервер — это сервер, принимающий HTTP-запросы от клиентов, обычно веб-браузеров, и выдающий им HTTP-ответы. Ответы обычно выдаются вместе с HTML-страницей, изображением, файлом или другими данными. По сути, веб-серверы — основа Всемирной паутины.
Веб-сервис — программная система, идентифицируемая строкой URI (Uniform Resource Identifier – универсальный идентификатор ресурса), чьи общедоступные интерфейсы определены на языке XML. Описание этой программной системы может быть найдено другими программными системами, которые могут взаимодействовать с ней согласно этому описанию посредством сообщений, основанных на XML, и передаваемых с помощью интернет-протоколов. [14]
Согласно поставленной задаче, необходимо найти веб-сервис, предоставляющий пользователю возможность работы с его API для получения статических изображений карт по заданным координатам. Таких веб-сервисов несколько. Это, например, Google maps, Microsoft maps, Yahoo maps и некоторые другие. Все они имеют очень похожую структуру, но так как эти сервисы конкурируют между собой, то существует и ряд существенных различий между некоторыми из них.
Как было сказано выше, общедоступные интерфейсы для разработки определены на языке XML. XML – расширяемый язык разметки, предназначенный для хранения и передачи структурированных данных. Он достаточно удобен и используется повсеместно, поэтому встала дополнительная задача по его изучению. Для этого, как вспомогательный ресурс, был разработан класс Settings, который находится в файле «Settings.cs» и подробное описание которого можно прочитать ниже.
Задача на взаимодействие с сервером
Задача на взаимодействие с сервером была поставлена следующим образом: необходимо сформировать строку запроса используя определенные координаты и передать эту строку на сервер, чтобы затем загрузить изображение статической карты на мобильное устройство.
Для приложения на Windows Mobile был выбран сервис “Yahoo! Maps Web Services”. Это сервис по предоставлению графической карты, сгенерированной согласно параметрам, которые указываются в отправляемом запросе. Для описываемого в моей курсовой работе приложения в запросе следует указать широту, долготу, и некоторые другие параметры карты. Возвращаемым с сервера “Yahoo!” параметром будет ссылка на статическую карту. Для работы с сервисом, потребовалось, в частности, изучить “Map Image API”, API, предоставляемым сервисом “Yahoo!” [16].
Методы, используемые для разработки модуля взаимодействия с сервером
Эта часть в обоих приложениях почти одинакова (различия в используемых библиотеках, именах функций и расширенным функционалом Windows Phone). Рассмотрим принцип работы этой части приложения для Windows Mobile.
Код, отвечающий за часть приложения по взаимодействию с веб-сервисом, описан в пространстве имен MyGPSMap.Services, которое находится в файле «LocationImageService.cs». Кроме этого, это самая большая часть моей работы и для удобства разработки использовались файлы «Settings.cs» и «Utility.cs».
Из файла «Settings.cs» здесь используется значение ключа YahooMapsApiKey для получения доступа к пользованию сервисом “Yahoo!”. Это является необходимым условием для доступа к веб-сервису.
В «Utility.cs» описаны методы QueryString (формирует строку запроса из парамтров и их значений) и ToStringNumeric (форматирует значение широты и долготы в формат, основанный на стандартах US).
Для разработки этой части программы использовался метод обработки событий. Событие вызывается когда получены координаты широты и долготы. Обработчик события – это делегат со специальной сигнатурой:
internal delegate void MapImageChangedDelegate(string mapUrl);
Делегат, на который объект ссылается, помечается ключевым словом event:
internal event MapImageChangedDelegate MapChanged;
Таким образом, если срабатывает событие MapChanged (это происходит когда получена строка с прямой ссылкой на изображение карты на сервере), то происходит обновление изображения карты через функцию _mapService_MapChanged основного класса Form1. Сам процесс получения прямой ссылки реализован следующим образом.
Нам необходимо создать строку запроса, которая состоит из двух частей. Первая – это собственно Url для доступа к сервису “Yahoo!”:
string Yahoo_Maps_Url = "http://local.yahooapis.com/MapsService/V1/mapImage?"
Вторая – это строка параметров, которые описаны в словаре parameters. Словарь (Dictionary) представляет собой набор данных, связанных как ключ-значение. При обьявлении словаря следует указывать типы, с которыми будет работать словарь:
Dictionary<string, string> parameters = new Dictionary<string, string>()
Параметры parameters описаны в теле словаря и представляют собой ID приложения (он указан в классе Settings в файле Settings.cs и представляется как Settings.YahooMapsApiKey), широту и долготу местоположения (которые получены ранее), формат изображения, высоту и ширину изображения, а также параметр увеличения изображения:
{"appid", Settings.YahooMapsApiKey},
{"latitude", location.Latitude.ToStringNumeric()},
{"longitude", location.Longitude.ToStringNumeric()},
{"image_type", "gif"},
{"image_height", "195"},
{"image_width", "195"},
{"zoom", Zoom.ToString()}
Названия всех параметров и их значения после инициализации записываются с помощью функции Utility.QueryString(), которая расположена в файле Utility.cs, в одну строку с помощью символов «=» и «&». Выглядит это, например, так:
"appid=id&image_height=195&image_ width=195&zoom=6"
Первая и вторая части соединяются и в итоге на сервер отправляется строка, например, такого вида:
http://local.yahooapis.com/MapsService/V1/mapImage?appid=id&latitude=56.1900&longitude44.0000&image_height=195&image_ width=195&zoom=6
Таким образом, по сформированной строке осуществляется запрос на сервер Yahoo! Затем во вспомагательный XML-документ помещается возвращаемая сервером информация, оформленная как текст с XML разметкой. Из полученной информации извлекается строка с адресом изображения и вызывается событие MapChanged с параметром – полученной строкой.
По вызову этого события в файле Form1.cs функция _mapService_MapChanged, привязанная на выполнение по событию MapChanged, осуществляет перерисовку изображения _mapImage, расположенного на форме приложения.