Использование веб-службы Yahoo! (а также REST и XPath)

В последнем примере этой главы мы используем еще одну веб-службу, на этот раз веб-службу Yahoo!. В настоящее время эта служба не предоставляет интерфейс SOAP и использует исключительно интерфейс REST. Таким образом, на стороне сервера вместо запроса POST SOAP будет посылаться запрос GET. Пакет ASP.NET AJAX Futures поддерживает такую возможность, но сначала нам нужно зарегистрироваться на сайте Yahoo!, чтобы получить возможность использовать службу.

Yahoo! предполагает регистрацию каждого приложения и, как результат, предоставит вам несколько ключей, если вы используете несколько приложений. Чтобы получить ключ для своего приложения, перейдите на страницу http://search.yahooapis.com/webservices/register_application. Чтобы получить доступ к этой странице, вы должны быть зарегистрированы на сервере Yahoo!. Если у вас еще нет учетной записи Yahoo!, то вы можете получить ее совершенно бесплатно. Страница содержит анкету, где необходимо ввести основные сведения о приложении.

Сохраните новый ключ в файле Web.config под именем YahooApplicationID. С учетом предыдущих примеров, файл Web.config теперь должен содержать раздел, который выглядит следующим образом:
(appSettings)
(add key="AmazonAccessKey" value="***" /)
(add key="GoogleLicenseKey" value="***" /)
(add key="YahooAppID" value="***" /)
(/appSettings)
http://api.search.yahoo.com/WebSearchService/V1/
webSearch?appid=***&output=xml&query=***

Эта строка URL содержит базовую часть (http://api.search.yahoo.com/WebSearchService/V1/webSearch) и ряд аргументов, входящих в строку запроса.


Мост для этого примера (в файле .asbx) настроен на отправку запросов приложения по этому URL.

Для начала нужно выбрать корректный тип класса-посредника. На этот раз нам не нужно использовать класс-обертку для работы с интерфейсом SOAP, созданный на основе WSDL?описания службы, но нам потребуется провайдер, который входит в состав ASP.NET AJAX Futures: Microsoft.Web.Preview.Services.BridgeRestProxy. Свойство serviceURL элемента должно содержать базовую часть URL службы поиска Yahoo!:

(bridge namespace="OReilly.AspNetAJAX" className="Yahoo")
serviceUrl="http://api.search.yahoo.com/WebSearchService/V1/webSearch" />

Как и в предыдущих примерах, метод определяется с помощью элемента . Значения аргументов appid и output будут определяться на стороне сервера, а аргумент query (фактическая строка поиска) будет предоставляться сценарием JavaScript:

value="% appsettings : YahooAppID %"
serverOnly="true" />
value="xml"
serverOnly="true" />



Этот мост фактически уже может работать.


Если вызвать метод OReilly.AspNetAJAX.Yahoo.Search(), то будет получен XML-документ. После этого XML-документ можно проанализировать в JavaScript и отобразить данные в веб-странице. Синтаксический анализ XML-документа в JavaScript не только может оказаться достаточно утомительной задачей, которая не одинаково хорошо будет работать во всех типах броузеров, но и просто здесь не нужен. В нашем распоряжении имеется еще одна удобная возможность ASP.NET AJAX Futures – XPathBridgeTransformer. Этот подход чем-то напоминает XsltBridgeTransformer, но на этот раз XML-документ преобразуется платформой ASP.NET AJAX не в HTML, а в объект JavaScript.

Основная идея заключается в использовании запросов XPath для доступа к конкретным узлам XML?документа. Результаты запросов XPath преобразуются в объекты JavaScript и могут использоваться в клиентском сценарии.

Как правило, для этого потребуется выполнить следующие действия:
1. Использовать , чтобы запросить один или более узлов XML-документа.
2. Необязательно: Если необходимо использовать пространство имен, следует определить его с помощью элемента (в следующем примере показано, как это сделать).
3.


C помощью элемента отобрать узлы из результата запроса XPath и преобразовать их в свойства объекта JavaScript.
Ниже показано, как выглядит XML-документ, полученный от службы поиска Yahoo! (сокращенная версия):

Ajax (programming) ? Wikipedia, the free encyclopedia
http://en.wikipedia.org/wiki/AJAX


...



Чтобы выбрать отдельные результаты, можно использовать XPath-запрос ResultSet/Result или просто Result. Однако следует учесть одну вещь. В XML?документе используется пространство имен для организации информации: urn:yahoo:srch. Это пространство имен также следует определить в файле моста. Делается это следующим образом:


(attribute name="selector" value="y:Result" /)



Теперь префикс 'y' будет обозначать пространство имен urn:yahoo:srch. Предыдущий фрагмент выбирает все узлы Result. Теперь с помощью элемента можно получить доступ к конкретным узлам и свойствам. В этом примере нас интересуют названия и URL, которые описываются элементами и <Url>. Следующий фрагмент отбирает эти элементы, а также объявляет соответствующие им имена свойств JavaScript (resultTitle и resultUrl):<br /> <dictionary name="selectedNodes"> <item name="resultTitle" value="y:Title" /><br /> <item name="resultUrl" value="y:Url" /><br /> </dictionary><br /> </data><br /> </transform><br /> </transforms><br /> </method><br /> </bridge><br /> <br /> В примере 18.15 приводится полный код разметки моста.<br /> Пример 18.15. Мост доступа к веб?службе Yahoo! с использованием <br /> интерфейса REST <br /> Yahoo.asbx<br /> <?xml version="1.0" encoding="utf?8" ?><br /> <bridge namespace="OReilly.AspNetAJAX" className="Yahoo"> <proxy type="Microsoft.Web.Preview.Services.BridgeRestProxy"<br /> serviceUrl="http://api.search.yahoo.com/WebSearchService/V1/webSearch" /><br /> <method name="Search"> <input><br /> <parameter name="appid"<br /> value="% appsettings : YahooAppID %"<br /> serverOnly="true" /><br /> <parameter name="output"<br /> value="xml"<br /> serverOnly="true" /><br /> <parameter name="query" /><br /> </input><br /> <transforms><br /> <transform type="Microsoft.Web.Preview.Services.XPathBridgeTransformer"> <data><br /> <attribute name="selector" value="y:Result" /><br /> <dictionary name="namespaceMapping"> <item name="y" value="urn:yahoo:srch" /><br /> </dictionary><br /> <dictionary name="selectedNodes"> <item name="resultTitle" value="y:Title" /><br /> <item name="resultUrl" value="y:Url" /><br /> </dictionary><br /> </data><br /> </transform><br /> </transforms><br /> </method><br /> </bridge><br /> <br /> Теперь мост на месте, а остальная часть приложения делается по аналогии с предыдущими примерами. Создайте новый файл ASP.NET и добавьте в него ссылки на файл .asbx и библиотеку Futures в элемент управления ScriptManager:<br /> (asp:ScriptManager ID="ScriptManager1" runat="server")<br /> <Services><br /> (asp:ServiceReference Path="~/Yahoo.asbx" /)<br /> </Services><br /> <Scripts><br /> (asp:ScriptReference Assembly="Microsoft.Web.Preview" <br /> Name="PreviewScript.js" /)<br /> </Scripts><br /> (/asp:ScriptManager)<br /> <br /> Затем добавьте элементы пользовательского интерфейса, которые дадут пользователю возможность вводить строку поиска. По щелчку на кнопке отправки формы необходимо выполнить следующий программный код:<br /> function Search() {<br /> var query = new Sys.Preview.UI.TextBox($get('Query'))<br /> $get("Button").disabled = true;<br /> clearList();<br /> OReilly.AspNetAJAX.Yahoo.Search(<br /> { "query": query.get_text() },<br /> callComplete, callError<br /> );<br /> }<br /> <br /> Функция callComplete() автоматически получает результат обращения к веб-службе в первом аргументе. Этот аргумент представляет собой массив JavaScript со всеми результатами поиска (по умолчанию веб-служба Yahoo! возвращает десять результатов, если их не было меньше).<br /> <br /> Каждый из элементов этого массива представляет собой объект со свойствами resultTitle и resultUrl, в соответствии с определениями в файле моста. Эти данные легко извлекать и легко добавлять в страницу:<br /> function callComplete(result) {<br /> for (var i = 0; i < result.length; i++) {<br /> var li = document.createElement("li");<br /> var a = document.createElement("a");<br /> a.setAttribute("href", result[i].resultUrl);<br /> a.innerHTML = result[i].resultTitle;<br /> li.appendChild(a);<br /> $get("Results").appendChild(li);<br /> }<br /> $get("Button").disabled = false;<br /> }<br /> <br /> Пример 18.16. Вызов веб?службы Yahoo! с использованием интерфейса REST Yahoo.aspx<br /> <%@ Page Language="C#" %><br /> <!DOCTYPE html PUBLIC "?//W3C//DTD XHTML 1.0 Transitional//EN"<br /> "http://www.w3.org/TR/xhtml1/DTD/xhtml1?transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <title>ASP.NET AJAX


(body)
(asp:ScriptManager ID="ScriptManager1" runat="server")

(asp:ServiceReference Path="~/Yahoo.asbx" /)


(asp:ScriptReference Assembly="Microsoft.Web.Preview"
Name="PreviewScript.js" /)

(/asp:ScriptManager)






(/body)


Оцените статью: (0 голосов)
0 5 0

Статьи из раздела ASP.NET AJAX на эту тему:
Использование веб-службы Amazon
Использование веб-службы Google
Преобразование результатов веб-службы с помощью XSLT