В моей предыдущей статье я говорил о том, как создать простой веб-сервис на PHP и использовать этот сервис из Silverlight . В этой статье будут использованы концепции этой статьи для создания очень простого клиента Twitter в Silverlight.
За последние несколько лет такие сервисы, как Twitter, стали очень популярными не только из-за ориентации на потребителя, но и потому, что они открывают свои API для разработчиков. Twitter, например, предоставляет много данных через RSS и каналы ATOM, поэтому загрузка данных так же проста, как и хорошо структурированный URL-вызов. Затем Silverlight может обрабатывать этот канал и извлекать из него содержимое (в данном случае, твиты).
Приложение, которое мы создадим в этой статье, позволит вам ввести поисковый запрос в Твиттере и отобразить твиты, полученные в Silverlight. К сожалению, этот процесс не так прост, как загрузка URL-адреса из Silverlight, из-за того, что называется политикой междоменного доступа.
Прежде чем мы начнем, настоятельно рекомендуем вам прочитать мою предыдущую статью о PHP-сервисах и Silverlight, потому что основная информация, которую я рассмотрел, является предпосылкой для того, что мы обсудим здесь.
На этот раз у нас есть статья-викторина, спонсируемая Microsoft, чтобы проверить ваши знания, когда вы закончите.
Silverlight и другие технологии RIA, такие как Adobe Flash, ограничены в доступе к данным из своего домена происхождения.
Например, если вы размещаете свое приложение Silverlight по адресу http://www.mysite.com
Однако, если вы попытаетесь загрузить что-то с http://www.yoursite.com
Одним из способов обойти это ограничение является размещение файла clientaccesspolicy.xml
в корне вашего сайта. Silverlight будет искать этот файл, и если он присутствует (и если он имеет правильные настройки), Silverlight получит разрешение на доступ к URL-адресам на другом сервере. Обратите внимание, что изображения и другие носители не подпадают под это ограничение. Это то же самое ограничение, которое применяется к JavaScript в браузере. Для получения дополнительной информации о междоменном доступе в Silverlight см. Http://msdn.microsoft.com/en-us/library/cc645032(VS.95).aspx .
Существует довольно простой способ обойти эти ограничения междоменного доступа. Twitter не предоставляет файл clientaccesspolicy.xml
Однако ограничения применяются только к Silverlight, а не к любому написанному вами коду на стороне сервера. Таким образом, одним из обходных путей является создание на вашем сервере веб-службы, к которой Silverlight может обращаться бесплатно, без ограничений домена, и которая будет действовать как прокси для загрузки данных Twitter.
Все это может показаться дополнительной работой, но, как мы увидим, на самом деле все довольно просто. Давайте начнем с создания веб-службы PHP для доступа к поиску в Twitter.
В моей предыдущей статье я описал, как настроить веб-сервис на PHP. Все шаги, которые необходимо выполнить для настройки этой службы PHP, одинаковы, с некоторыми изменениями в файле WSDL (язык описания веб-службы) и файле службы PHP. Кроме того, файл index.php
Начните с создания нового файла для хранения WSDL нового веб-сервиса, который называется twitterSearchService.wsdl
Это файл, который PHP использует для настройки предоставляемой службы. Он также используется Visual Studio для создания классов для доступа к сервису.
Файл должен иметь следующее содержимое (если ваша служба находится в каталоге с именем php
Пример 1. php/twitterSearchService.wsdl
<wsdl: определений xmlns = "http://schemas.xmlsoap.org/wsdl/" xmlns: soap = "http://schemas.xmlsoap.org/wsdl/soap/" xmlns: SOAP-ENC = "http: / /schemas.xmlsoap.org/soap/encoding/ "xmlns: wsdl =" http://schemas.xmlsoap.org/wsdl/ "xmlns: xsd =" http://www.w3.org/2001/XMLSchema "xmlns : tns = "http://schema.example.com" targetNamespace = "http://schema.example.com"> <wsdl: types> <xsd: schema targetNamespace = "http://schema.example.com" /> </ wsdl: types> <message name = "getTwitterSearchRequest"> <part name = "searchText" type = "xsd: string" /> <part name = "lastTwitterId" type = "xsd: string" /> </ message> <message name = "getTwitterSearchResponse"> <part name = "getTwitterSearchReturn" type = "xsd: string" /> </ message> <wsdl: portType name = "twitterSearchServicePortType"> <wsdl: operation name = "getTwitterSearch"> <wsdl: input message = "tns: getTwitterSearchRequest" /> <wsdl: output message = "tns: getTwitterSearchResponse" /> </ wsdl: operation> </ wsdl: portType> <binding name = "twitterSearchServiceBinding" type = "tns: twitterSearchServicePortType "> < soap: binding style = "document" transport = "http://schemas.xmlsoap.org/soap/http" /> <wsdl: имя операции = "getTwitterSearch"> <soap: операция soapAction = "urn: ageService / getTwitterSearch" style = "document" /> <wsdl: input> <soap: body use = "literal" /> </ wsdl: input> <wsdl: output> <soap: body use = "literal" /> </ wsdl: output > </ wsdl: operation> </ binding> <wsdl: service name = "twitterSearchService"> <wsdl: port name = "twitterSearchServicePort" binding = "tns: twitterSearchServiceBinding"> <soap: address location = "http: // localhost /php/twitterSearchService.php "/> </ wsdl: port> </ wsdl: service> </ wsdl: определения>
Этот файл лишь немного отличается от WSDL, который использовался в моей предыдущей статье: имена изменились, в поисковый запрос был добавлен второй параметр, а тип возвращаемого ответа был изменен с целого на строку.
Затем создайте второй файл с именем twitterSearchService.php
Вы заметите, что файл WSDL ссылается на это имя файла.
Начнем с настройки файла PHP для предоставления веб-сервиса. Внутри тегов <?php
Пример 2. php/twitterSearchService.php
ini_set ("soap.wsdl_cache_enabled", "0"); $ server = new SoapServer ("twitterSearchService.wsdl"); $ Server-> AddFunction ( "getTwitterSearch"); $ Server-> ручка ();
Как и в предыдущей статье, этот код загружает файл WSDL и добавляет указатель на функцию getTwitterSearch
Имея это в виду, вам нужно создать новую функцию с именем getTwitterSearch
Над кодом, который вы только что вставили в свой файл, создайте новую функцию getTwitterSearch
searchText
и lastTwitterId
. Эти параметры будут объединены в URL для доступа к API поиска Twitter. Хотя searchText
довольно очевиден, lastTwitterId
может и не быть. Он используется для указания поиска только для тех твитов, которые были опубликованы с момента последнего твита в предыдущем поиске. Это предотвращает возврат тех же твитов при последующих поисках.
Код для функции довольно прост:
Пример 4. php/twitterSearchService.php
function getTwitterSearch ($ searchText, $ lastTwitterId) {$ searchUrl = "http://search.twitter.com/search.atom?q=".$searchText; if (! empty ($ lastTwitterId)) {$ searchUrl = $ searchUrl. "& since_id =". $ lastTwitterId; } $ twitterAtom = file_get_contents ($ searchUrl); вернуть $ twitterAtom; }
Во-первых, текст поиска объединяется с URL-адресом базы поиска Twitter с помощью параметра q
Если $lastTwitterId
since_id
Параметр $lastTwitterId
Затем вызывается функция PHP file_get_contents
file_get_contents
Затем результат возвращается клиенту Silverlight. И это все: работа PHP завершена. Так просто!
Теперь, когда у вас есть служба для загрузки данных поиска в Твиттере, вы готовы создать клиент Silverlight. Начните с создания нового проекта Silverlight в Visual Studio. Для целей этой статьи я использовал инструменты Visual Studio 2010 и Silverlight 4, но Silverlight 3 также должен работать (с Visual Studio 2008).
Выполните шаги, описанные в предыдущей статье, чтобы создать свой проект Silverlight; на этот раз мы назовем его SilverlightPHPTwitter, как показано на рисунке 1, «Создание нового проекта Sliverlight» .
После того, как вы введете свое имя файла, вы можете продолжать выбирать настройки по умолчанию, пока не увидите, что ваш проект Silverlight был создан. Вам будет представлен файл MainPage.xaml