Веб-сервисы в теории и на практике для начинающих
Время на прочтение
9 мин
Количество просмотров 578K
Что такое веб-сервисы?
Прежде всего, веб-сервисы (или веб-службы) — это технология. И как и любая другая технология, они имеют довольно четко очерченную среду применения.
Если посмотреть на веб-сервисы в разрезе стека сетевых протококолов, мы увидим, что это, в классическом случае, не что иное, как еще одна надстройка поверх протокола HTTP.
С другой стороны, если гипотетически разделить Интернет на несколько слоев, мы сможем выделить, как минимум, два концептуальных типа приложений — вычислительные узлы, которые реализуют нетривиальные функции и прикладные веб-ресурсы. При этом вторые, зачастую заинтересованы в услугах первых.
Но и сам Интернет — разнороден, т. е. различные приложения на различных узлах сети функционируют на разных аппаратно-программных платформах, и используют различные технологии и языки.
Чтобы связать все это и предоставить возможность одним приложениям обмениваться данными с другими, и были придуманы веб-сервисы.
По сути, веб-сервисы — это реализация абсолютно четких интерфейсов обмена данными между различными приложениями, которые написаны не только на разных языках, но и распределены на разных узлах сети.
Именно с появлением веб-сервисов развилась идея SOA — сервис-ориентированной архитектуры веб-приложений (Service Oriented Architecture).
Протоколы веб-сервисов
На сегодняшний день наибольшее распространение получили следующие протоколы реализации веб-сервисов:
- SOAP (Simple Object Access Protocol) — по сути это тройка стандартов SOAP/WSDL/UDDI
- REST (Representational State Transfer)
- XML-RPC (XML Remote Procedure Call)
На самом деле, SOAP произошел от XML-RPC и является следующей ступенью его развития. В то время как REST — это концепция, в основе которой лежит скорее архитектурный стиль, нежели новая технология, основанный на теории манипуляции объектами CRUD (Create Read Update Delete) в контексте концепций WWW.
Безусловно, существуют и иные протоколы, но, поскольку они не получили широкого распространения, мы остановимся в этом кратком обзоре на двух основных — SOAP и REST. XML-RPC ввиду того, что является несколько «устаревшим», мы рассматривать подробно не будем.
Нас в первую очередь интересуют вопросы создания новых веб-служб, а не реализация клиентов к существующим (как правило поставщики веб-сервисов поставляют пакеты с функциями API и документацией, посему вопрос построения клиентов к существующим веб-службам менее интересен с точки зрения автора).
SOAP против REST
Проблемы данного противостояния хорошо описаны в статье Леонида Черняка, найденой на портале www.citforum.ru.
По мнению же автора, кратко можно выделить следующее:
SOAP более применим в сложных архитектурах, где взаимодействие с объектами выходит за рамки теории CRUD, а вот в тех приложениях, которые не покидают рамки данной теории, вполне применимым может оказаться именно REST ввиду своей простоты и прозрачности. Действительно, если любым объектам вашего сервиса не нужны более сложные взаимоотношения, кроме: «Создать», «Прочитать», «Изменить», «Удалить» (как правило — в 99% случаев этого достаточно), возможно, именно REST станет правильным выбором. Кроме того, REST по сравнению с SOAP, может оказаться и более производительным, так как не требует затрат на разбор сложных XML команд на сервере (выполняются обычные HTTP запросы — PUT, GET, POST, DELETE). Хотя SOAP, в свою очередь, более надежен и безопасен.
В любом случае вам решать, что больше подойдет вашему приложению. Вполне вероятно, вы даже захотите реализовать оба протокола, чтобы оставить выбор за пользователями службы и — это ваше право.
Практическое применение веб-сервисов
Поскольку речь идет о практическом применении, нам нужно выбрать платформу для построения веб-службы и поставить задачу. Так как автору ближе всего PHP 5, мы и выберем его в качестве технологии для построения службы, а в качестве задачи примем следующие требования.
Допустим, нам необходимо создать службу, предоставляющую доступ к информации о курсах валют, которая собирается нашим приложением, и накапливается в базе данных. Далее посредством веб-сервиса, данная информация передается сторонним приложениям для отображения в удобном для них виде.
Как видим задача довольно проста и, с точки зрения самой службы, ограничивается лишь чтением информации, но в практических целях нам этого будет достаточно.
Этап первый — реализация приложения сбора информации о курсах валют.
Информацию о курсах валют мы будем собирать со страниц сайта НБУ (Национального Банка Украины) ежедневно и складывать в базу данных под управлением СУБД MySQL.
Создадим структуру данных.
Таблица валют (currency):
+-------------+------------------+ | Field | Type | +-------------+------------------+ | code | int(10) unsigned | | charcode | char(3) | | description | varchar(100) | | value | int(10) unsigned | | base | tinyint(1) | +-------------+------------------+
Таблица номиналов обмена (exchange):
+------------+------------------+ | Field | Type | +------------+------------------+ | id | bigint(20) ai | | rate_date | timestamp | | rate_value | float | | code | int(10) unsigned | +------------+------------------+
Для работы с базой данных воспользуемся ORM слоем на базе пакета PHP Doctrine. Реализуем граббер:
класс Grubber (models/Grabber.php):
<?php /* * @package Currency_Service */ class Grabber { /** * Extracts data from outer web resource and returns it * * @param void * @return array */ public static function getData() { /** * Extracting data drom outer web-resource */ $content = file_get_contents( 'http://www.bank.gov.ua/Fin_ryn/OF_KURS/Currency/FindByDate.aspx'); if(preg_match_all( '/(d+)</td>([A-Z]+)</td>(d+)</td>(.+?)</td>(d+.d+)</td>/i', $content, $m) == false) { throw new Exception( 'Can not parse data!'); } /** * Preformatting data to return; */ $data = array(); foreach ($m[1] as $k => $code) { $data[] = array( 'code' => $code, 'charcode' => $m[2][$k], 'value' => $m[3][$k], 'description' => $m[4][$k], 'rate_value' => $m[5][$k] ); } return $data; } public static function run() { $data = self::getData(); /** * Sets default currency if not exists */ if (!Doctrine::getTable( 'Currency')->find( 980)) { $currency = new Currency(); $currency->setCode( 980) ->setCharcode( 'UAH') ->setDescription( 'українська гривня') ->setValue( 1) ->setBase( 1) ->save(); } foreach ($data as $currencyData) { /** * Updating table of currencies with found values */ if (!Doctrine::getTable( 'Currency')->find( $currencyData['code'])) { $currency = new Currency(); $currency->setCode( $currencyData['code']) ->setCharcode( $currencyData['charcode']) ->setDescription( $currencyData['description']) ->setValue( $currencyData['value']) ->setBase( 0) ->save(); } /** * Updating exchange rates */ $date = date( 'Y-m-d 00:00:00'); $exchange = new Exchange(); $exchange->setRateDate( $date) ->setRateValue( $currencyData['rate_value']) ->setCode( $currencyData['code']) ->save(); } } } ?>
и сам граббер (grabber.php):
<?php require_once('config.php'); Doctrine::loadModels('models'); Grabber::run(); ?>
Теперь заставим наш граббер отрабатывать раз в сутки в 10:00 утра, путем добавления команды запуска граббера в таблицы cron:
0 10 * * * /usr/bin/php /path/to/grabber.php
Все — у нас есть достаточно полезный сервис.
Теперь реализуем веб-сервис, который позволит другим приложениям извлекать данные из нашей базы.
Реализация SOAP сервиса
Для реализации веб-сервиса на базе SOAP протокола, мы воспользуемся встроенным пакетом в PHP для работы с SOAP.
Поскольку наш веб-сервис будет публичным, хорошим вариантом будет создание WSDL файла, который описывает структуру нашего веб-сервиса.
WSDL (Web Service Definition Language) — представляет из себя XML файл определенного формата. Подробное описание синтаксиса можно найти здесь.
На практике будет удобно воспользоваться функцией автоматической генерации файла, которую предоставляет IDE Zend Studio for Eclipse. Данная функция позволяет генерировать WSDL файл из классов PHP. Поэтому, прежде всего, мы должны написать класс, реализующий функциональность нашего сервиса.
класс CurrencyExchange (models/CurrencyExchange.php):
<?php /** * Class providing web-service with all necessary methods * to provide information about currency exchange values * * @package Currency_Service */ class CurrencyExchange { /** * Retrievs exchange value for a given currency * * @param integer $code - currency code * @param string $data - currency exchange rate date * @return float - rate value */ public function getExchange( $code, $date) { $currency = Doctrine::getTable( 'Currency')->find( $code); $exchange = $currency->getExchange( $date); return $exchange ? (float)$exchange->getRateValue() : null; } /** * Retrievs all available currencies * * @return array - list of all available currencies */ public function getCurrencyList() { return Doctrine::getTable( 'Currency')->findAll()->toArray(); } } ?>
Отметим, что для автоматической генерации WSDL, нам необходимо написать комментарии в стиле javadoc, потому что именно в них мы прописываем информацию о типах принимаемых аргументов и возвращаемых значений. Неплохо также описывать в нескольких словах работу методов — ведь WSDL послужит описанием API для сторонних разработчиков, которые будут использовать ваш веб-сервис.
Не пишите в докблоках param void или return void — для WSDL это не критично, но вот при реализации REST доступа к тому-же классу у вас возникнут проблемы.
Теперь в Zend Studio входим в меню File->Export…, выбираем PHP->WSDL, добавляем наш класс, прописываем URI-адрес нашего сервиса и создаем WSDL-файл. Результат должен быть примерно таким: http://mikhailstadnik.com/ctws/currency.wsdl
Если вы будете добавлять новую функциональность в ваш веб-сервис, вам нужно будет пересоздавать WSDL-файл. Но здесь не так все гладко. Следует учитывать, что SOAP-клиент, который уже запрашивал ваш WSDL файл, кеширует его на своей стороне. Поэтому, если вы замените старое содержимое новым в WSDL файле, некторые клиенты его не прочтут. А значит, при добавлении новой функциональности, дописывайте версию в имя вашего файла. И не забудбте обеспечить обратную совместимость для старых клиентов, особенно если вы не являетесь их поставщиком.
С другой стороны, WSDL довольно жестко задает структуру веб-сервиса, а это значит, что, если существует необходимость ограничить функциональность клиента по сравнению с сервером, вы можете не включать определенные методы ваших классов в WSDL. Таким образом они не смогут быть вызваны, несмотря на то, что существуют.
Реализация же самого сервера не предстваляет теперь никакой сложности:
файл index.php:
<?php require_once('config.php'); Doctrine::loadModels('models'); $server = new SoapServer( 'http://mikhailstadnik.com/ctws/currency.wsdl'); $server->setClass( 'CurrencyExchange'); $server->handle(); ?>
Вы можете попробовать веб-сервис в работе по адресу: http://mikhailstadnik.com/ctws/
Там же доступен тестовый клиент: http://mikhailstadnik.com/ctws/client.php
Код простейшего клиента может быть таким:
<?php $client = new SoapClient( 'http://mikhailstadnik.com/ctws/currency.wsdl'); echo 'USD exchange: ' . $client->getExchange( 840, date( 'Y-m-d')); ?>
Реализация REST сервиса
REST — это не стандарт и не спецификация, а архитектурный стиль, выстроенный на существующих, хорошо известных и контролируемых консорциумом W3C стандартах, таких, как HTTP, URI (Uniform Resource Identifier), XML и RDF (Resource Description Format). В REST-сервисах акцент сделан на доступ к ресурсам, а не на исполнение удаленных сервисов; в этом их кардинальное отличие от SOAP-сервисов.
И все же удаленный вызов процедур применим и в REST. Он использует методы PUT, GET, POST, DELETE HTTP протокола для манипуляции объектами. Кардинальное отличие его от SOAP в том, что REST остается HTTP-запросом.
Поскольку в PHP пока еще нет реалзации REST, мы воспользуемся Zend Framwork, в который включена реализация как REST клиента, так и REST севера.
Воспользуемся уже готовым классом CurrencyExchange. Напишем сам сервер:
rest.php:
<?php require_once 'config.php'; require_once 'Zend/Rest/Server.php'; Doctrine::loadModels('models'); $server = new Zend_Rest_Server(); $server->setClass( 'CurrencyExchange'); $server->handle(); ?>
Как видите все очень сходно и просто.
Однако, следует оговорить, что наш REST-сервис менее защищен, чем SOAP-сервис, так как любой добавленый метод в класс CurrencyExchange при его вызове отработает (сам класс определяет сруктуру сервиса).
Проверим работу нашего сервиса. Для этого достаточно передать параметры вызова метода в сроке GET-запроса:
?method=getExchange&code=840&date=2008-11-29
или
?method=getExchange&arg1=840&arg2=2008-11-29
При желании или необходимости вы можете самомтоятельно задавать структуру ваших XML ответов для сервиса REST. В этом случае, также будет необходимо позаботиться и о создании определения типа вашего XML документа (DTD — Document Type Definition). Это будет минимальным описанием API вашего сервиса.
Простейший тестовый клиент к REST сервису может быть в нашем случае таким:
<?php $client = new Zend_Rest_Client( 'http://mikhailstadnik.com/ctws/rest.php'); $result = $client->getExchange( 840, date( 'Y-m-d'))->get(); if ($result->isSuccess()) { echo 'USD exchange: ' . $result->response; } ?>
В принципе, Zend_Rest на сегодняшний день нельзя назвать наиболее точной реализацией принципов REST. Утрируя, можно говорить о том, что эта реализация свелась к удаленному вызову процедур (RPC), хотя философия REST гораздо шире.
Вы можете скачать пример в исходных кодах c PHP Doctrine и Zend Framework (4,42 Мб).
Заключение
Мы выполнили задачу минимум и показали, что такое веб-сервисы, для чего они нужны и как их реализовывать. Естественно, приведенный пример, возможно, несколько оторван от жизни, но он был выбран лишь в качестве инструмента для объяснения предмета и сущности веб-сервисов.
Кроме того мы увидели, что реализация веб-сервиса — задача довольно простая при использовании современного инструментария, который позволяет сконцентрироваться, в первую очередь, на разработке функциональности самого сервиса, не заботясь о низкоуровневой реализации протоколов.
Автор надеется, что данный материал будет действительно полезен тем, кто становится на тропу разработки веб-служб.
Удачи в девелопменте!
Основанный на SOAP веб-сервис
Чтобы узнать больше о веб-сервисах, давайте сначала разберемся с концепцией сервис-ориентированной архитектуры.
Что такое сервис-ориентированная архитектура?
Сервис-ориентированная архитектура – это принцип проектирования программного обеспечения и шаблон архитектурного проектирования, представляющий автономную единицу функциональности, называемую сервисом. SOA продвигает принципы проектирования, включающие слабую связь, возможность повторного использования и грубые услуги. В терминах корпоративной архитектуры преимущества SOA заключаются в обеспечении гибкости и быстром реагировании на потребности бизнеса, повышении окупаемости инвестиций за счет снижения затрат на интеграцию, снижения затрат на разработку за счет повторного использования компонентов. Корпоративные Aarchitect’s продвигают использование Enterprise Service Bus в качестве уровня интеграции для крупномасштабных корпоративных онлайн-приложений.
Например, очень хорошим примером будут выписка со счета ваших транзакций, информация о ценах на продукты, услуга обработки изображений, служба карт, служба определения местоположения и т. Д.
Что такое веб-сервисы?
Веб-сервисы являются лишь формой реализации сервис-ориентированной архитектуры, которая может обмениваться данными между различными системами независимо от платформы. Поставщики услуг определяют интерфейс, описанный WSDL, и сообщения обмениваются с потребителями услуг с использованием сообщений SOAP. Сообщения могут передаваться по протоколам HTTP, FTP или SMTP.
Веб-сервисы могут быть на основе SOAP или REST.
В сегодняшнем пошаговом руководстве мы рассмотрим, как создать веб-сервис на основе SOAP и потребителя, который будет использовать веб-сервис. Мы будем использовать JAX-WS (API Java для веб-служб XML) для создания веб-службы.
Программного обеспечения:
Weblogic Application Server 12c
Eclipse Oepe 12c
Weblogic Webservice Tool – это автоматически создаст весь необходимый код и файлы WSDL и позволит разработчикам сосредоточиться на бизнес-логике.
Шаг 1:
В вашем Eclipse создайте новый динамический веб-проект.
Создать новый динамический веб-проект
Нажмите изменить и добавьте аспекты, связанные с компонентами Weblogic Webservice.
Шаг 2:
Установите флажки, чтобы убедиться, что все зависимые модули также включены, как указано на скриншоте.
Добавить аспекты проекта, связанные с Weblogic Webservice
Шаг 3:
Корнем контекста по умолчанию является CalculatorServiceServer, а каталогом содержимого веб-модуля – WebContent. Нажмите Готово.
Шаг 4:
Теперь щелкните правой кнопкой мыши по вновь созданному проекту и добавьте модуль Weblogic Web Service в ваш проект.
Создать новый Weblogic Webservice
Шаг 5:
Создайте новый веб-сервис. Добавьте детали пакета и дайте имя веб-сервису.
Создать новый веб-сервис
Шаг 6:
Инструмент веб-сервиса в Eclipse создаст интерфейс конечной точки сервиса (контракт) с веб-методом по умолчанию hello (). Мы можем заменить метод по умолчанию требуемым методом – add (). Рекомендуется создать интерфейс, который объявляет методы, сопоставленные с операциями веб-службы. Этот интерфейс известен как интерфейс конечной точки службы (SEI). Всякий раз, когда мы видим аннотацию @WebService, это означает, что интерфейс является SEI.
Интерфейс вычислителя SEI
Шаг 7:
CalculatorImpl.java создается как класс JWS (веб-служба Java).
Замените код по умолчанию, присутствующий в CalculatorImpl.java. Добавьте детали реализации в add ().
Реализация SEI – CalculatorImpl.java
Шаг 8:
На приведенной ниже диаграмме показано сопоставление между реализацией веб-службы, аннотированной @webService, и сопоставлением wsdl.
Javax.jws.WebService сообщает серверу приложений, что этот класс должен рассматриваться как веб-сервис. Различные атрибуты javax.jws.Webservice:
- name – Имя веб-сервиса и отображается на элемент <wsdl: portType> в файле WSDL.
- targetNameSpace – пространство имен XML, используемое для элементов WSDL и XML, сгенерированных из этой веб-службы.
- serviceName – сервисное имя веб-сервиса. Значением по умолчанию является имя файла jws с суффиксом «service».
- wsdlLocation – URL-адрес абсолютного файла wsdl.
- endpointInterface – это основано на существующей конечной точке (SEI) службы веб-сервиса.
Сравнение JAX-WS и WSDL
На приведенном выше рисунке имя веб-службы в интерфейсе калькулятора сопоставлено с именем веб-службы, упомянутым в элементе portType в WSDL.
Взаимодействие portName, serviceName, целевого пространства имен и конечной точки службы (SEI) из CalculatorImpl.java сопоставляется с файлом CalculatorService.wsdl.
Шаг 9:
Теперь пришло время запустить веб-сервис на сервере Weblogic 12c, щелкнув правой кнопкой мыши по проекту и выбрав «Выполнить на сервере», добавив проект CalculatorServiceServer на сервер Weblogic и сконфигурировав их.
Добавить проект CalculatorServiceServer на сервер Weblogic
Шаг 10:
Веб-сервис теперь развернут на сервере и предоставлен клиентам для использования. Доступ к нему и управление им можно получить из консоли сервера weblogic.
Weblogic Server Console
Файл wsdl можно просмотреть и протестировать с места, как показано на скриншоте.
Шаг 11:
Файл wsdl с адресом удаленного расположения.
CalculatorService WSDL
http://10.0.2.15:7001/CalculatorServiceServer/CalculatorServer?WSDL
Шаг 12:
На приведенной ниже диаграмме показан файл CalculatorService.wsdl и объяснены все ключевые элементы файла WSDL. WSDL – это контракт на обслуживание с клиентами и поставщиками услуг.
Определение – самый внешний элемент файла WSDL – это <определения>. Это контейнер для всех других элементов, определенных в документе wsdl. В итоге это корневой элемент.
- <types> – описывает все типы данных, используемые и актуальные для обмена сообщениями между клиентом и сервером. Это необязательное поле. Раздел типов ссылается на XSD (определение схемы XML), которое определяет типы данных. Если этот раздел пуст, то веб-сервис будет использовать только простые типы данных.
- <messages> – определяет данные, которыми обмениваются между поставщиком и потребителем веб-службы. Сообщения создаются из типов данных.
- <portType> – представляет веб-сервис как именованные операции. Каждая операция может иметь одно или несколько сообщений.
- <binding> – определяет способ передачи сообщений. Он доступен через HTTP GET, HTTP POST, SOAP (поверх протокола HTTP). Из раздела связывания определения WSDL переходят от абстрактного к конкретному, предоставляя конкретные сведения о веб-службе. Элемент привязки должен указывать подробности реализации веб-службы, абстрактно определенные в portType.
- <сервис> – указывает на конечную точку, клиенты могут получить доступ к веб-сервису по этому пути.
CalculatorService WSDL объяснил
Шаг 13:
Мы можем протестировать веб-сервис с помощью клиента Weblogic Test.
Тестовый клиент WebLogic
Шаг 14:
Тестовый клиент Weblogic показывает успешный результат операции добавления и выдает SOAP-сообщение с запросом и ответом.
Тестовый клиент – SOAP-запрос и ответ
Шаг 15:
Теперь я хочу создать сервлет, который будет действовать как клиент веб-сервиса, который будет использовать веб-сервис калькулятора, который мы создали на предыдущих шагах.
Создайте новый динамический веб-проект – CalculatorServiceClient и добавьте аспекты клиентов веб-службы Oracle Weblogic.
Добавить фасет клиента Weblogic Webservice
Шаг 16:
Создайте новый клиент веб-службы, щелкнув правой кнопкой мыши проект CalculatorServiceClient -> Выбрать новый -> Выбрать другой -> Поиск клиента веб-службы Weblogic из мастеров. Теперь введите ссылку на файл WSDL. В этом случае мы будем использовать удаленное определение файла WSDL. Прежде чем щелкнуть, убедитесь, что файл WSDL подтвержден.
Добавьте местоположение WSDL
При следующем нажатии коды CalculatorServiceServer экспортируются в CalculatorService.jar. При нажатии «Далее» укажите местоположение места выполнения WSDL. Я использовал Копировать WSDL в опцию jar клиента.
Создать CalculatorService.jar
Шаг 17:
Теперь создайте класс Servlet, который будет вызывать Webservice.
Создать сервлет для вызова веб-службы
Шаг 18:
Давайте посмотрим на клиентский код сервлета.
1 2 3 4 5 6 7 8 9 |
|
Выход сервлета отображает все результаты операции добавления.
TestCalculatorWS выход сервлета
Надеюсь, вам понравилась статья . Пожалуйста, оставьте свои комментарии и отзывы и поделитесь своими знаниями, используя кнопки социальных сетей.
Загрузите полный код:
What are Web Services?
Different books and different organizations provide different definitions to Web Services. Some of them are listed here.
-
A web service is any piece of software that makes itself available over the internet and uses a standardized XML messaging system. XML is used to encode all communications to a web service. For example, a client invokes a web service by sending an XML message, then waits for a corresponding XML response. As all communication is in XML, web services are not tied to any one operating system or programming language—Java can talk with Perl; Windows applications can talk with Unix applications.
-
Web services are self-contained, modular, distributed, dynamic applications that can be described, published, located, or invoked over the network to create products, processes, and supply chains. These applications can be local, distributed, or web-based. Web services are built on top of open standards such as TCP/IP, HTTP, Java, HTML, and XML.
-
Web services are XML-based information exchange systems that use the Internet for direct application-to-application interaction. These systems can include programs, objects, messages, or documents.
-
A web service is a collection of open protocols and standards used for exchanging data between applications or systems. Software applications written in various programming languages and running on various platforms can use web services to exchange data over computer networks like the Internet in a manner similar to inter-process communication on a single computer. This interoperability (e.g., between Java and Python, or Windows and Linux applications) is due to the use of open standards.
To summarize, a complete web service is, therefore, any service that −
-
Is available over the Internet or private (intranet) networks
-
Uses a standardized XML messaging system
-
Is not tied to any one operating system or programming language
-
Is self-describing via a common XML grammar
-
Is discoverable via a simple find mechanism
Components of Web Services
The basic web services platform is XML + HTTP. All the standard web services work using the following components −
-
SOAP (Simple Object Access Protocol)
-
UDDI (Universal Description, Discovery and Integration)
-
WSDL (Web Services Description Language)
All these components have been discussed in the Web Services Architecture chapter.
How Does a Web Service Work?
A web service enables communication among various applications by using open standards such as HTML, XML, WSDL, and SOAP. A web service takes the help of −
-
XML to tag the data
-
SOAP to transfer a message
-
WSDL to describe the availability of service.
You can build a Java-based web service on Solaris that is accessible from your Visual Basic program that runs on Windows.
You can also use C# to build new web services on Windows that can be invoked from your web application that is based on JavaServer Pages (JSP) and runs on Linux.
Example
Consider a simple account-management and order processing system. The accounting personnel use a client application built with Visual Basic or JSP to create new accounts and enter new customer orders.
The processing logic for this system is written in Java and resides on a Solaris machine, which also interacts with a database to store information.
The steps to perform this operation are as follows −
-
The client program bundles the account registration information into a SOAP message.
-
This SOAP message is sent to the web service as the body of an HTTP POST request.
-
The web service unpacks the SOAP request and converts it into a command that the application can understand.
-
The application processes the information as required and responds with a new unique account number for that customer.
-
Next, the web service packages the response into another SOAP message, which it sends back to the client program in response to its HTTP request.
-
The client program unpacks the SOAP message to obtain the results of the account registration process.
Why Web Services?
Here are the benefits of using Web Services −
Exposing the Existing Function on the network
A web service is a unit of managed code that can be remotely invoked using HTTP. That is, it can be activated using HTTP requests. Web services allow you to expose the functionality of your existing code over the network. Once it is exposed on the network, other applications can use the functionality of your program.
Interoperability
Web services allow various applications to talk to each other and share data and services among themselves. Other applications can also use the web services. For example, a VB or .NET application can talk to Java web services and vice versa. Web services are used to make the application platform and technology independent.
Standardized Protocol
Web services use standardized industry standard protocol for the communication. All the four layers (Service Transport, XML Messaging, Service Description, and Service Discovery layers) use well-defined protocols in the web services protocol stack. This standardization of protocol stack gives the business many advantages such as a wide range of choices, reduction in the cost due to competition, and increase in the quality.
Low Cost Communication
Web services use SOAP over HTTP protocol, so you can use your existing low-cost internet for implementing web services. This solution is much less costly compared to proprietary solutions like EDI/B2B. Besides SOAP over HTTP, web services can also be implemented on other reliable transport mechanisms like FTP.
Web Services — Characteristics
Web services have the following special behavioral characteristics −
XML-Based
Web services use XML at data representation and data transportation layers. Using XML eliminates any networking, operating system, or platform binding. Web services based applications are highly interoperable at their core level.
Loosely Coupled
A consumer of a web service is not tied to that web service directly. The web service interface can change over time without compromising the client’s ability to interact with the service. A tightly coupled system implies that the client and server logic are closely tied to one another, implying that if one interface changes, the other must be updated. Adopting a loosely coupled architecture tends to make software systems more manageable and allows simpler integration between different systems.
Coarse-Grained
Object-oriented technologies such as Java expose their services through individual methods. An individual method is too fine an operation to provide any useful capability at a corporate level. Building a Java program from scratch requires the creation of several fine-grained methods that are then composed into a coarse-grained service that is consumed by either a client or another service.
Businesses and the interfaces that they expose should be coarse-grained. Web services technology provides a natural way of defining coarse-grained services that access the right amount of business logic.
Ability to be Synchronous or Asynchronous
Synchronicity refers to the binding of the client to the execution of the service. In synchronous invocations, the client blocks and waits for the service to complete its operation before continuing. Asynchronous operations allow a client to invoke a service and then execute other functions.
Asynchronous clients retrieve their result at a later point in time, while synchronous clients receive their result when the service has completed. Asynchronous capability is a key factor in enabling loosely coupled systems.
Supports Remote Procedure Calls(RPCs)
Web services allow clients to invoke procedures, functions, and methods on remote objects using an XML-based protocol. Remote procedures expose input and output parameters that a web service must support.
Component development through Enterprise JavaBeans (EJBs) and .NET Components has increasingly become a part of architectures and enterprise deployments over the past couple of years. Both technologies are distributed and accessible through a variety of RPC mechanisms.
A web service supports RPC by providing services of its own, equivalent to those of a traditional component, or by translating incoming invocations into an invocation of an EJB or a .NET component.
Supports Document Exchange
One of the key advantages of XML is its generic way of representing not only data, but also complex documents. These documents can be as simple as representing a current address, or they can be as complex as representing an entire book or Request for Quotation (RFQ). Web services support the transparent exchange of documents to facilitate business integration.
Web Services — Architecture
There are two ways to view the web service architecture −
- The first is to examine the individual roles of each web service actor.
- The second is to examine the emerging web service protocol stack.
Web Service Roles
There are three major roles within the web service architecture −
Service Provider
This is the provider of the web service. The service provider implements the service and makes it available on the Internet.
Service Requestor
This is any consumer of the web service. The requestor utilizes an existing web service by opening a network connection and sending an XML request.
Service Registry
This is a logically centralized directory of services. The registry provides a central place where developers can publish new services or find existing ones. It therefore serves as a centralized clearing house for companies and their services.
Web Service Protocol Stack
A second option for viewing the web service architecture is to examine the emerging web service protocol stack. The stack is still evolving, but currently has four main layers.
Service Transport
This layer is responsible for transporting messages between applications. Currently, this layer includes Hyper Text Transport Protocol (HTTP), Simple Mail Transfer Protocol (SMTP), File Transfer Protocol (FTP), and newer protocols such as Blocks Extensible Exchange Protocol (BEEP).
XML Messaging
This layer is responsible for encoding messages in a common XML format so that messages can be understood at either end. Currently, this layer includes XML-RPC and SOAP.
Service Description
This layer is responsible for describing the public interface to a specific web service. Currently, service description is handled via the Web Service Description Language (WSDL).
Service Discovery
This layer is responsible for centralizing services into a common registry and providing easy publish/find functionality. Currently, service discovery is handled via Universal Description, Discovery, and Integration (UDDI).
As web services evolve, additional layers may be added and additional technologies may be added to each layer.
The next chapter explains the components of web services.
Few Words about Service Transport
The bottom of the web service protocol stack is service transport. This layer is responsible for actually transporting XML messages between two computers.
Hyper Text Transfer Protocol (HTTP)
Currently, HTTP is the most popular option for service transport. HTTP is simple, stable, and widely deployed. Furthermore, most firewalls allow HTTP traffic. This allows XMLRPC or SOAP messages to masquerade as HTTP messages. This is good if you want to integrate remote applications, but it does raise a number of security concerns.ise a number of security concerns.
Blocks Extensible Exchange Protocol (BEEP)
This is a promising alternative to HTTP. BEEP is a new Internet Engineering Task Force (IETF) framework for building new protocols. BEEP is layered directly on TCP and includes a number of built-in features, including an initial handshake protocol, authentication, security, and error handling. Using BEEP, one can create new protocols for a variety of applications, including instant messaging, file transfer, content syndication, and network management.
SOAP is not tied to any specific transport protocol. In fact, you can use SOAP via HTTP, SMTP, or FTP. One promising idea is therefore to use SOAP over BEEP.
Web Services — Components
Over the past few years, three primary technologies have emerged as worldwide standards that make up the core of today’s web services technology. These technologies are discussed below.
XML-RPC
This is the simplest XML-based protocol for exchanging information between computers.
-
XML-RPC is a simple protocol that uses XML messages to perform RPCs.
-
Requests are encoded in XML and sent via HTTP POST.
-
XML responses are embedded in the body of the HTTP response.
-
XML-RPC is platform-independent.
-
XML-RPC allows diverse applications to communicate.
-
A Java client can speak XML-RPC to a Perl server.
-
XML-RPC is the easiest way to get started with web services.
To learn more about XML-RPC, visit our XML-RPC Tutorial.
SOAP
SOAP is an XML-based protocol for exchanging information between computers.
-
SOAP is a communication protocol.
-
SOAP is for communication between applications.
-
SOAP is a format for sending messages.
-
SOAP is designed to communicate via Internet.
-
SOAP is platform independent.
-
SOAP is language independent.
-
SOAP is simple and extensible.
-
SOAP allows you to get around firewalls.
-
SOAP will be developed as a W3C standard.
To learn more about SOAP, visit our SOAP Tutorial.
WSDL
WSDL is an XML-based language for describing web services and how to access them.
-
WSDL stands for Web Services Description Language.
-
WSDL was developed jointly by Microsoft and IBM.
-
WSDL is an XML based protocol for information exchange in decentralized and distributed environments.
-
WSDL is the standard format for describing a web service.
-
WSDL definition describes how to access a web service and what operations it will perform.
-
WSDL is a language for describing how to interface with XML-based services.
-
WSDL is an integral part of UDDI, an XML-based worldwide business registry.
-
WSDL is the language that UDDI uses.
-
WSDL is pronounced as ‘wiz-dull’ and spelled out as ‘W-S-D-L’.
To learn more about WSDL, visit our WSDL Tutorial.
UDDI
UDDI is an XML-based standard for describing, publishing, and finding web services.
-
UDDI stands for Universal Description, Discovery, and Integration.
-
UDDI is a specification for a distributed registry of web services.
-
UDDI is platform independent, open framework.
-
UDDI can communicate via SOAP, CORBA, and Java RMI Protocol.
-
UDDI uses WSDL to describe interfaces to web services.
-
UDDI is seen with SOAP and WSDL as one of the three foundation standards of web services.
-
UDDI is an open industry initiative enabling businesses to discover each other and define how they interact over the Internet.
To learn more about UDDI, visit our UDDI Tutorial.
Web Services — Examples
Based on the web service architecture, we create the following two components as a part of web services implementation −
Service Provider or Publisher
This is the provider of the web service. The service provider implements the service and makes it available on the Internet or intranet.
We will write and publish a simple web service using .NET SDK.
Service Requestor or Consumer
This is any consumer of the web service. The requestor utilizes an existing web service by opening a network connection and sending an XML request.
We will also write two web service requestors: one web-based consumer (ASP.NET application) and another Windows application-based consumer.
Given below is our first web service example which works as a service provider and exposes two methods (add and SayHello) as the web services to be used by applications. This is a standard template for a web service. .NET web services use the .asmx extension. Note that a method exposed as a web service has the WebMethod attribute. Save this file as FirstService.asmx in the IIS virtual directory (as explained in configuring IIS; for example, c:MyWebSerces).
FirstService.asmx <%@ WebService language = "C#" class = "FirstService" %> using System; using System.Web.Services; using System.Xml.Serialization; [WebService(Namespace = "http://localhost/MyWebServices/")] public class FirstService : WebService{ [WebMethod] public int Add(int a, int b) { return a + b; } [WebMethod] public String SayHello() { return "Hello World"; } }
To test a web service, it must be published. A web service can be published either on an intranet or the Internet. We will publish this web service on IIS running on a local machine. Let us start with configuring the IIS.
-
Open Start → Settings → Control Panel → Administrative tools → Internet Services Manager.
-
Expand and right-click on the default web site; select New &#rarr; Virtual Directory. The Virtual Directory Creation Wizard opens. Click Next.
-
The «Virtual Directory Alias» screen opens. Type the virtual directory name. For example, MyWebServices. Click Next.
-
The «Web Site Content Directory» screen opens.
-
Enter the directory path name for the virtual directory. For example, c:MyWebServices. Click Next.
-
The «Access Permission» screen opens. Change the settings as per your requirements. Let us keep the default settings for this exercise.
-
Click the Next button. It completes the IIS configuration.
-
Click Finish to complete the configuration.
To test whether the IIS has been configured properly, copy an HTML file (For example, x.html) in the virtual directory (C:MyWebServices) created above. Now, open Internet Explorer and type http://localhost/MyWebServices/x.html. It should open the x.html file.
Note − If it does not work, try replacing the localhost with the IP address of your machine. If it still does not work, check whether IIS is running; you may need to reconfigure the IIS and the Virtual Directory.
To test this web service, copy FirstService.asmx in the IIS virtual directory created above (C:MyWebServices). Open the web service in Internet Explorer (http://localhost/MyWebServices/FirstService.asmx). It should open your web service page. The page should have links to two methods exposed as web services by our application. Congratulations! You have written your first web service!
Testing the Web Service
As we have just seen, writing web services is easy in the .NET Framework. Writing web service consumers is also easy in the .NET framework; however, it is a bit more involved. As said earlier, we will write two types of service consumers, one web-based and another Windows application-based consumer. Let us write our first web service consumer.
Web-Based Service Consumer
Write a web-based consumer as given below. Call it WebApp.aspx. Note that it is an ASP.NET application. Save this in the virtual directory of the web service (c:MyWebServicesWebApp.axpx).
This application has two text fields that are used to get numbers from the user to be added. It has one button, Execute, that when clicked gets the Add and SayHello web services.
WebApp.aspx <%@ Page Language = "C#" %> <script runat = "server"> void runSrvice_Click(Object sender, EventArgs e) { FirstService mySvc = new FirstService(); Label1.Text = mySvc.SayHello(); Label2.Text = mySvc.Add(Int32.Parse(txtNum1.Text), Int32.Parse(txtNum2.Text)).ToString(); } </script> <html> <head> </head> <body> <form runat = "server"> <p> <em>First Number to Add </em>: <asp:TextBox id = "txtNum1" runat = "server" Width = "43px">4< /asp:TextBox> </p> <p> <em>Second Number To Add </em>: <asp:TextBox id = "txtNum2" runat = "server" Width = "44px">5</asp:TextBox> </p> <p> <strong><u>Web Service Result -</u></strong> </p> <p> <em>Hello world Service</em> : <asp:Label id = "Label1" runat = "server" Font-Underline = "True">Label< /asp:Label> </p> <p> <em>Add Service</em> : & <asp:Label id = "Label2" runat = "server" Font-Underline = "True">Label</asp:Label> </p> <p align = "left"> <asp:Button id = "runSrvice" onclick = "runSrvice_Click" runat = "server" Text = "Execute"></asp:Button> </p> </form> </body> </html>
After the consumer is created, we need to create a proxy for the web service to be consumed. This work is done automatically by Visual Studio .NET for us when referencing a web service that has been added. Here are the steps to be followed −
-
Create a proxy for the Web Service to be consumed. The proxy is created using the WSDL utility supplied with the .NET SDK. This utility extracts information from the Web Service and creates a proxy. The proxy is valid only for a particular Web Service. If you need to consume other Web Services, you need to create a proxy for this service as well. Visual Studio .NET creates a proxy automatically for you when the Web Service reference is added. Create a proxy for the Web Service using the WSDL utility supplied with the .NET SDK. It will create FirstSevice.cs file in the current directory. We need to compile it to create FirstService.dll (proxy) for the Web Service.
c:> WSDL http://localhost/MyWebServices/FirstService.asmx?WSDL c:> csc /t:library FirstService.cs
-
Put the compiled proxy in the bin directory of the virtual directory of the Web Service (c:MyWebServicesbin). Internet Information Services (IIS) looks for the proxy in this directory.
-
Create the service consumer, in the same way we already did. Note that an object of the Web Service proxy is instantiated in the consumer. This proxy takes care of interacting with the service.
-
Type the URL of the consumer in IE to test it (for example, http://localhost/MyWebServices/WebApp.aspx).
Windows Application-Based Web Service Consumer
Writing a Windows application-based web service consumer is the same as writing any other Windows application. You only need to create the proxy (which we have already done) and reference this proxy when compiling the application. Following is our Windows application that uses the web service. This application creates a web service object (of course, proxy) and calls the SayHello, and Add methods on it.
WinApp.cs using System; using System.IO; namespace SvcConsumer { class SvcEater { public static void Main(String[] args) { FirstService mySvc = new FirstService(); Console.WriteLine("Calling Hello World Service: " + mySvc.SayHello()); Console.WriteLine("Calling Add(2, 3) Service: " + mySvc.Add(2, 3).ToString()); } } }
Compile it using c:>csc /r:FirstService.dll WinApp.cs
. It will create WinApp.exe. Run it to test the application and the web service.
Now, the question arises: How can you be sure that this application is actually calling the web service?
It is simple to test. Stop your web server so that the web service cannot be contacted. Now, run the WinApp application. It will fire a runtime exception. Now, start the web server again. It should work.
Web Services — Security
Security is critical to web services. However, neither XML-RPC nor SOAP specifications make any explicit security or authentication requirements.
There are three specific security issues with web services −
- Confidentiality
- Authentication
- Network Security
Confidentiality
If a client sends an XML request to a server, can we ensure that the communication remains confidential?
Answer lies here −
- XML-RPC and SOAP run primarily on top of HTTP.
- HTTP has support for Secure Sockets Layer (SSL).
- Communication can be encrypted via SSL.
- SSL is a proven technology and widely deployed.
A single web service may consist of a chain of applications. For example, one large service might tie together the services of three other applications. In this case, SSL is not adequate; the messages need to be encrypted at each node along the service path, and each node represents a potential weak link in the chain. Currently, there is no agreed-upon solution to this issue, but one promising solution is the W3C XML Encryption Standard. This standard provides a framework for encrypting and decrypting entire XML documents or just portions of an XML document. You can check it at www.w3.org/Encryption
Authentication
If a client connects to a web service, how do we identify the user? Is the user authorized to use the service?
The following options can be considered but there is no clear consensus on a strong authentication scheme.
-
HTTP includes built-in support for Basic and Digest authentication, and services can therefore be protected in much the same manner as HTML documents are currently protected.
-
SOAP Digital Signature (SOAP-DSIG) leverages public key cryptography to digitally sign SOAP messages. It enables the client or server to validate the identity of the other party. Check it at www.w3.org/TR/SOAP-dsig.
-
The Organization for the Advancement of Structured Information Standards (OASIS) is working on the Security Assertion Markup Language (SAML).
Network Security
There is currently no easy answer to this problem, and it has been the subject of much debate. For now, if you are truly intent on filtering out SOAP or XML-RPC messages, one possibility is to filter out all HTTP POST requests that set their content type to text/xml.
Another alternative is to filter the SOAPAction HTTP header attribute. Firewall vendors are also currently developing tools explicitly designed to filter web service traffic.
Web Services — Standards
This chapter gives you an idea of all the latest standards related to web services.
Transports
BEEP, the Blocks Extensible Exchange Protocol (formerly referred to as BXXP), is a framework for building application protocols. It has been standardized by IETF and it does for Internet protocols what XML has done for data.
-
Blocks Extensible Exchange Protocol (BEEP)
Messaging
These messaging standards and specifications are intended to give a framework for exchanging information in a decentralized, distributed environment.
-
SOAP 1.1 (Note)
-
SOAP 1.2 (Specification)
-
Web Services Attachments Profile 1.0
-
SOAP Message Transmission Optimization Mechanism
Description and Discovery
Web services are meaningful only if potential users may find information sufficient to permit their execution. The focus of these specifications and standards is the definition of a set of services supporting the description and discovery of businesses, organizations, and other web services providers; the web services they make available; and the technical interfaces which may be used to access those services.
-
UDDI 3.0
-
WSDL 1.1 (Note)
-
WSDL 1.2 (Working draft)
-
WSDL 2.0 (Working Group)
Security
Using these security specifications, applications can engage in secure communication designed to work with the general web services framework.
-
Web Services Security 1.0
-
Security Assertion Markup Language (SAML)
Management
Web services manageability is defined as a set of capabilities for discovering the existence, availability, health, performance, usage, as well as the control and configuration of a web service within the web services architecture. As web services become pervasive and critical to business operations, the task of managing and implementing them is imperative to the success of business operations.
-
Web Services Distributed Management
Web Services — Summary
In this tutorial, you have learnt how to use web services. However, a web service also include components such as WSDL, UDDI, and SOAP that contribute to make it active. The next step is to learn WSDL, UDDI, and SOAP.
WSDL
WSDL is an XML-based language for describing web services and how to access them.
WSDL describes a web service, along with the message format and protocol details for the web service.
To learn more about WSDL, visit our WSDL Tutorial.
UDDI
UDDI is an XML-based standard for describing, publishing, and finding web services.
To learn more about UDDI, visit our UDDI Tutorial.
SOAP
SOAP is a simple XML-based protocol that allows applications to exchange information over HTTP.
To learn more about SOAP, visit our SOAP Tutorial.
() translation by (you can also view the original English article)
Дважды в месяц мы возвращаемся к любимым постам наших читателей на протяжении всей истории Nettuts +. Этот учебник был впервые опубликован в июле 2010 года.
Предлагать ваш контент или логику в качестве службы в Интернете — отличная идея. Для начинающих это позволяет вам создавать многочисленные внешние интерфейсы для вашей собственной информации без необходимости постоянного доступа к базам данных (и, таким образом, значительно упрощает масштабирование вашей системы).
Еще более практичным результатом является то, что вы позволяете людям в Интернете играть с вашей информацией и создавать вещи, о которых вы даже не мечтали. Многие компании понимают, что это «краудсорсинговое новшество» — это халява, которую слишком хорошо игнорировать, поэтому вокруг так много отличных API.
Предоставление API миру — это совсем другая история. Вам нужно знать, как масштабировать свои серверы, вы должны быть там, чтобы отвечать на вопросы разработчиков, и вам нужно поддерживать хорошую документацию, чтобы люди могли использовать ваш контент. Вам также нужно подумать о хорошей стратегии кэширования, чтобы не допустить взрыва ваших серверов, и вам нужно найти способ ограничить доступ к вашей системе, чтобы люди не злоупотребляли ею. Или же вы сами?
Введите YQL
Yahoo предлагает людям доступ к своим API-интерфейсам, который называется Yahoo Query Language или YQL. YQL — это язык в стиле SQL, который превращает информацию в Интернете в виртуальные базы данных, к которым могут обращаться конечные пользователи. Поэтому, если вы хотите, например, найти в интернете термин «слон», все, что вам нужно сделать, это использовать следующее утверждение:
1 |
select * from search.web where query="elephant" |
Вы отправляете этот оператор конечной точке данных и возвращаете его как XML, JSON или JSON-P. Вы можете запросить дополнительные результаты и отфильтровать их, указав, что вы хотите получить:
1 |
http://query.yahooapis.com/v1/public/yql |
2 |
?q={yql query} |
3 |
&diagnostics={true|false} |
4 |
&format={json|xml} |
5 |
&callback={function name} |
Мешивать и Сочетать
Все API-интерфейсы Yahoo доступны через этот интерфейс, и вы можете смешивать и сопоставлять сервисы с подвыборами. Например, вы можете запустить инструмент анализа ключевых слов поверх абстрактного веб-поиска, чтобы найти соответствующие ключевые слова. Используя функции unique ()
, вы также можете легко удалить ложные срабатывания.
1 |
select * from search.termextract where context in ( |
2 |
select abstract from search.web(50) where query="elephant") |
3 |
| unique(field="Result") |
Смотрите результаты этого более сложного запроса здесь.
Консоль
Самый простой способ играть с YQL как потребитель — это использовать консоль по адресу http://developer.yahoo.com/yql/console/. Там вы можете нажать на разные таблицы, чтобы увидеть демонстрационный запрос о том, как его использовать, и, если вы нажмете ссылку desc
, вы узнаете, какие опции доступны для вас.
YQL ограничения
Использование YQL имеет несколько ограничений, которые описаны в документации. По сути, вы можете получить доступ к конечной точке открытых данных 1000 раз в час по IP. Если вы аутентифицируете (проверка подлинности) приложение с помощью oAuth, вы получаете 10000 обращений в час. Каждое приложение допускается 100 000 просмотров в день.
Это и кеширование результатов, которое делает YQL автоматически, означает, что данные запрашиваются только при их изменении. Это означает, что YQL является своего рода брандмауэром для запросов к данным, которые люди предлагают вместе с ним.
Будьте осторожны, используя jQuery «$ .getJSON» и анонимную функцию в качестве обратного вызова. Это может нарушить кеширующие способности YQL и снизить производительность.
Создание веб-сервисов с открытыми таблицами
Для вас как для провайдера действительно здорово то, что YQL открыт для других провайдеров данных.
Если вы хотите предложить API всему миру (или просто иметь его для себя), вы можете легко сделать это, написав «открытую таблицу», которая представляет собой XML-схему, указывающую на веб-сервис.
Люди часто этим занимаются, а это значит, что если вы нажмете ссылку «Показать таблицы сообщества» в консоли YQL, вы обнаружите, что теперь есть 812 вместо 118 таблиц, с которыми можно играть (на сегодняшний день — завтра, вероятно, будет больше).
Чтобы перевести свой сервис на YQL и предложить его всему миру, достаточно указать на него YQL. Давайте посмотрим на простой пример:
Реальное приложение: Craigslist как API
У сайта бесплатных объявлений Craigslist нет общедоступного API — и это действительно позор. Однако, выполнив поиск по сайту, вы обнаружите, что результаты поиска имеют выход RSS — что, по крайней мере, указывает на функциональность API. Например, когда я ищу «schwinn mountain bike» в Сан-Франциско, URL-адрес поиска будет:
1 |
http://sfbay.craigslist.co.uk/search/sss?format=rss&query=schwinn+mountain+bike |
где переменными являются местоположение, тип продукта, который вы ищете (это раздел сайта) и запрос, который вы искали (в этом случае я обернул параметры в фигурные брекеты):
1 |
http://{location}.craigslist.co.uk/search/{type}?format=rss&query=1 |
Найдя такой шаблон, вы можете начать писать свою открытую таблицу:
1 |
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
<table xmlns="http://query.yahooapis.com/v1/schema/table.xsd"> |
3 |
<meta>
|
4 |
<author>Yahoo! Inc.</author> |
5 |
<documentationURL>http://craigslist.org/</documentationURL> |
6 |
<sampleQuery>select * from {table} where
|
7 |
location="sfbay" and type="sss" and |
8 |
query="schwinn mountain bike"</sampleQuery>
|
9 |
<description>Searches Craigslist.org</description> |
10 |
</meta>
|
11 |
<bindings>
|
12 |
<select itemPath="" produces="XML"> |
13 |
<urls>
|
14 |
<url>http://{location}.craigslist.org/search/{type}?format=rss</url> |
15 |
</urls>
|
16 |
<inputs>
|
17 |
<key id="location" type="xs:string" paramType="path" required="true" /> |
18 |
<key id="type" type="xs:string" paramType="path" required="true" /> |
19 |
<key id="query" type="xs:string" paramType="query" required="true" /> |
20 |
</inputs>
|
21 |
</select>
|
22 |
</bindings>
|
23 |
</table>
|
Чтобы получить полное описание того, что все это значит, вы можете просмотреть документацию по YQL для открытых таблиц, но вот краткое руководство:
- Вы начинаете с пролога XML и элемента
таблицы
, указывающего на схему для открытых таблиц YQL. Это позволяет YQL проверять вашу таблицу. - Вы добавляете
мета
элемент с информацией о вашей таблице: автор, URL вашей документации и пример запроса. Пример запроса является наиболее важным здесь, поскольку именно это будет отображаться в окне запроса консоли YQL, когда люди нажимают на имя вашей таблицы. Это первый шаг к использованию вашего API — так что стоит потратить время. Покажите параметры, которые вы предлагаете и как их использовать. Часть{table}
будет заменена именем таблицы. - Элемент
bindings
показывает, с чем связана таблица и какие ключи ожидаются в запросе. - Вы определяете
путь
итип
выходных данных в элементеselect
— значения для этого типа — XML или JSON, и этот путь позволяет вам возвращать только определенную часть данных, возвращаемых с URL-адреса, к которому вы обращаетесь. - В разделе
urls
-адресов вы определяете конечные точки URL-адреса вашего сервиса. В нашем случае это параметризованный URL из предыдущего. YQL заменяет элементы в фигурных скобках информацией, предоставленной пользователем YQL. - В разделе
inputs
section (входов) вы определяете все возможные ключи, которые конечные пользователи могут или должны предоставить. Каждыйключ
имеетидентификатор
, paramType, который является либопутем
, если параметр является частью пути URL, либозапросом
, если он должен быть добавлен к URL в качестве параметра. Вы определяете, какие ключи являются обязательными, устанавливая дляобязательного
атрибута значениеtrue
.
И это все! Собрав этот документ XML, вы сделали первый из трех шагов, чтобы ваши веб-сервисы стали частью инфраструктуры YQL. Следующий шаг — сообщить YQL, где находится определение вашего веб-сервиса. Просто загрузите файл на сервер, например, http://isithackday.com/craigslist.search.xml. Затем вы указываете YQL на сервис, применяя команду use
:
1 |
use "http://isithackday.com/craigslist.search.xml" as cl; |
2 |
select * from cl where location"sfbay" and type="sss" and query="playstation" |
Вы можете попробовать это, и вы увидите, что теперь вы найдете PlayStation для продажи в районе залива Сан-Франциско. Аккуратно, не правда ли?
Логика как услуга
Иногда у вас вообще нет веб-службы, и все, что вы хотите сделать, это предложить миру определенную логику. Я обнаружил, что делаю то же самое на днях. То, что я хотел знать, — это расстояние между двумя местами на Земле. Для этого мне нужно было найти широту и долготу мест, а затем сделать очень умные вычисления. Поскольку я ленивый человек, я построил на работе, которую другие люди сделали для меня. Чтобы найти широту и долготу определенного места на Земле, вы можете использовать API Yahoo Geo. В YQL вы можете сделать это с:
1 |
select * from geo.places(1) where text="paris" |
Попробуйте это сами.
Чтобы найти функцию, которая надежно рассчитывает расстояние между двумя точками на Земле, я потратил несколько минут на Google и обнаружил реализацию Криса Венесса «Обратного решения геодезических Винсенти на эллипсоиде».
YQL предлагает исполняемый блок внутри открытых таблиц, который содержит серверный JavaScript. Вместо того, чтобы просто возвращать данные из службы, вы можете использовать это для преобразования информации перед ее возвратом. Вы также можете выполнять вызовы REST для других сервисов и для самого YQL в этих блоках JavaScript. И вот что я сделал:
1 |
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
<table xmlns="http://query.yahooapis.com/v1/schema/table.xsd"> |
3 |
<meta>
|
4 |
<sampleQuery>
|
5 |
select * from {table} where place1="london" and place2="paris" |
6 |
</sampleQuery>
|
7 |
<author>Christian Heilmann</author> |
8 |
<documentationURL>
|
9 |
http://isithackday.com/hacks/geo/distance/ |
10 |
</documentationURL>
|
11 |
<description>
|
12 |
Gives you the distance of two places on earth in miles or kilometers |
13 |
</description>
|
14 |
</meta>
|
15 |
<bindings>
|
16 |
<select itemPath="" produces="XML"> |
17 |
<inputs>
|
18 |
<key id='place1' type='xs:string' paramType='variable' |
19 |
required="true" /> |
20 |
<key id='place2' type='xs:string' paramType='variable' |
21 |
required="true" /> |
22 |
</inputs>
|
23 |
<execute><![CDATA[ |
24 |
default xml namespace = "http://where.yahooapis.com/v1/schema.rng";
|
25 |
var res = y.query("select * from geo.places(1) where text='" +
|
26 |
place1 + "'").results;
|
27 |
var res2 = y.query("select * from geo.places(1) where text='" +
|
28 |
place2 + "'").results;
|
29 |
var lat1 = res.place.centroid.latitude;
|
30 |
var lon1 = res.place.centroid.longitude;
|
31 |
var lat2 = res2.place.centroid.latitude;
|
32 |
var lon2 = res2.place.centroid.longitude;
|
33 |
var d = distVincenty(lat1,lon1,lat2,lon2);
|
34 |
function distVincenty(lat1, lon1, lat2, lon2) {
|
35 |
/* ... vincenty function... */
|
36 |
var d = d / 1000;
|
37 |
var miles = Math.round(d/1.609344);
|
38 |
var kilometers = Math.round(d);
|
39 |
response.object = <distance>
|
40 |
<miles>{miles}</miles>
|
41 |
<kilometers>{kilometers}</kilometers>
|
42 |
{res.place}
|
43 |
{res2.place}
|
44 |
</distance>;
|
45 |
]]></execute> |
46 |
</select>
|
47 |
</bindings>
|
48 |
</table>
|
-
Элемент meta
такой же, как и любая другая открытая таблица. - В привязках (
bindingsу
) нас нет URL для указания, поэтому мы можем его пропустить. Однако теперь мы добавляем элементexecute
, который гарантирует, что определенныеключи
будут отправлены в JavaScript, определенный в этом блоке. - Поскольку Geo API в Yahoo возвращает XML с пространством имен, мы должны указать JavaScript, какое это пространство имен.
- Я выполняю два запроса YQL из сценария, используя метод
y.query ()
, используя параметрыplace1
иplace2
, чтобы получить местоположения этих двух мест..Results
после вызова метода гарантирует, что я получу результаты. Я храню их вres
иres2
соответственно. - Затем я получаю широту и долготу для каждого из результатов и вызываю метод
distVincenty ()
. - Я делю результат на 1000, чтобы получить километры, и умножаю результат на правильное число, чтобы получить мили.
- Я заканчиваю часть скрипта, определяя
response.object
, который будет возвращать YQL. Поскольку это серверный JavaScript с полной поддержкой E4X, все, что мне нужно написать, это XML, который я хочу вернуть с переменными JavaScript, которые я хочу отобразить в фигурных скобках.
спользуя этот сервис и добавив немного интерфейса, теперь я могу легко показать расстояние между Бэтменом и Робином.
Используя серверный JavaScript, вы можете не только конвертировать данные, но и легко предлагать услугу, которая состоит только из вычислений — так же, как это делает Google Calculator.
Превращение редактируемого набора данных в веб-сервис
Что вы действительно хотите сделать в большинстве случаев, так это позволить людям легко редактировать данные, которые управляют веб-сервисом. Обычно мы создавали CMS, обучали ее и тратили много времени на передачу данных из CMS в Интернет для доступа к ним через YQL. Это может быть сделано проще, хотя.
Несколько месяцев назад я выпустил веб-сайт winterolympicsmedals.com, который показывает вам всю информацию о зимних Олимпийских играх за эти годы.
Данные, которые управляют веб-сайтом, были опубликованы The Guardian в Великобритании бесплатно в их блоге данных в виде электронной таблицы Excel. Чтобы превратить это в редактируемый набор данных, все, что мне нужно было сделать, это сохранить копию в моем собственном хранилище Документов Google. Вы можете получить эти данные здесь. Документы Google позволяют публиковать таблицы в Интернете. Используя «CSV» в качестве выходного формата, я получаю URL для доступа в YQL:
А используя YQL, вы можете использовать CSV в качестве источника данных:
1 |
select * from csv where |
2 |
url="http://spreadsheets.google.com/pub? |
3 |
key=0AhphLklK1Ve4dHBXRGtJWk1abGVRYVJFZjQ5M3YxSnc &hl=en&output=csv"
|
Смотрите результат этого в вашем собственном браузере.
Как видите, таблица CSV автоматически добавляет строки и столбцы в вывод XML. Чтобы сделать этот веб-сервис более полезным и фильтруемым, вы можете предоставить список столбцов для переименования результирующих элементов XML:
1 |
select * from csv where url="http://spreadsheets.google.com/pub? |
2 |
key=0AhphLklK1Ve4dHBXRGtJWk1abGVRYVJFZjQ5M3YxSnc&hl=en&output=csv" and |
3 |
columns="year,city,sport,discipline,country,event,gender,type" |
Смотрите переименованные столбцы в вашем браузере.
Это позволяет вам фильтровать информацию, что я и сделал для создания winterolympicsmedals.com. Например, чтобы получить все золотые медали 1924 года, вы должны сделать следующее:
1 |
select * from csv where url="http://spreadsheets.google.com/pub? |
2 |
key=0AhphLklK1Ve4dHBXRGtJWk1abGVRYVJFZjQ5M3YxSnc&hl=en&output=csv" and |
3 |
columns="year,city,sport,discipline,country,event,gender,type" |
4 |
and year="1924" and type="Gold"</code> |
Смотрите золотые медали 1924 года в своем браузере.
Таким образом, вы можете использовать бесплатное хранилище Google и инфраструктуру бесплатных веб-сервисов для преобразования бесплатных данных в веб-сервис. Все, что вам нужно сделать, это создать хороший интерфейс для него.
Добавление вашего сервиса в таблицы сообщества YQL
После того, как вы определили свою открытую таблицу, вы можете использовать ее, разместив на своем собственном сервере, или вы можете полностью ее добавить, добавив ее в хранилище таблиц YQL. Для этого все, что вам нужно, — это добавить его в репозиторий таблиц YQL на GitHub, который можно найти по адресу http://github.com/yql/yql-tables/.Обширную справку по использованию Git и GitHub можно найти в их разделе справки.
Если вы отправите запрос команде YQL на извлечение из вашего репозитория, они проверит вашу таблицу, и, если все в порядке, они перенесут ее на http://datatables.org/, который является ресурсом для таблица сообществ в консоли YQL.
Это не только делает жизнь других разработчиков более интересной, но и очень хорошей рекламой для вас. Вместо того, чтобы надеяться найти разработчиков, которые будут играть с вашими данными, вы переносите данные туда, где разработчики уже ищут их.
Продвинутые темы YQL
Это введение может только очистить поверхность от того, что вы можете сделать с YQL. Если вы посмотрите документацию, то обнаружите, что в дополнение к этим «читаемым» открытым таблицам вы также можете настроить некоторые службы, в которые можно записывать данные, а YQL также предлагает облачное хранилище вашей информации. Проверьте обширную документацию по YQL для получения дополнительной информации.
краткое изложение
Объединяя открытые системы, такие как YQL и Google Docs, и некоторые знания XML и JavaScript, вы можете предложить пользователям веб-сервис за считанные минуты. В любом случае, переход вашей разработки от доступа к локальным файлам и базам данных к доступу к службам делает ее гораздо более универсальной и позволяет вам в любое время переключать поставщиков. С YQL вы можете погрузить свои пальцы в воду веб-сервисов, не утонув, так как большая часть тяжелой работы для вас уже проделана. Спасибо за прочтение!
Об авторе
Кристиан Хейлманн — международный евангелист-разработчик, работающий на Mozilla.
Веб-сервисы
О веб-сервисах
-
Web Service — программная система, предназначенная поддерживать взаимодействие между интераперабельными устройствами через сеть. Веб сервис обладает интерфейсом, описанным в WSDL формате. Другие системы, взаимодействуют с веб сервисом через SOAP-сообщения, которые обычно передаются с помощью HTTP с XML сериализацией в связке с другими веб-стандартами. [source]
- Сервис доступен по сети, может располагаться и выполняться на разных компьютерах.
- Передача сообщений между сервисом и клиентом происходит в независимом формате.
- Web Service может быть создан из существующего Web приложения.
- Сервис использует стандартизированную XML messaging систему.
- Не привязан к операционной системе или языку программирования
-
Пример веб сервиса: dailyinfo
Архитектурные модели
-
SOA (Service Based Architecture) — модульный подход к разработке программного обеспечения, основанный на использовании распределённых, слабо связанных заменяемых компонентов, оснащённых стандартизированными интерфейсами для взаимодействия по стандартизированным протоколам. [source]
- Программные комплексы, разработанные в соответствии с сервис-ориентированной архитектурой, обычно реализуются как набор веб-служб, взаимодействующих по протоколу SOAP, но существуют и другие реализации, например, на основе REST.
-
ROA (REST-Oriented Architecture) — архитектурный стиль приложения и подход к разработке для создания ПО в виде ресурсов с RESTful интерфейсами. Эти ресурсы являются программными компонентами, которые могут быть переиспользованы для различных целей. [source]
-
MOM (Message-Oriented Model) сосредаточена на тех аспектах архитектуры, которые относятся к сообщениям и их обработке. [source]
-
SOM (Service-Oriented Model) сосредаточена на тех аспектах архитектуры, которые относятся к сервису и действиям. [source]
- Главная цель SOM — устанавливать отношения между агентом, сервисом, который он реализует, и запросами.
- SOM построен на основе MOM, но сосредочен больше на действия, чем на сообщения.
-
ROM (Resource-Oriented Model) сосредоточена на тех аспектах архитектуры, которые относятся к ресурсам, и сервис модель которых связана с манипулированием ресурсами. [source]
-
PM (Policy Model) сосредаточена на тех аспектах архитектуры, которые относятся к политике, расширениям, защите и качеству сервиса. [source]
-
MM (Management Model) сосредаточена на тех аспектах архитектуры, которые относятся к регулированию веб сервисов. [source]
Стек протоколов
-
Протокол — набор соглашений интерфейса логического уровня, которые определяют обмен данными между различными программами. [[source]][protocol]
-
TCP/IP — семейство протоколов, предназначенных для взаимодйествия между электронными устройствами. Определяет, как они должны быть связаны через интернет и как нужно передавать данные между ними. [source]
-
TCP (Transmission Control Protocol) — отвечает за разбиение данных на небольшие пакеты перед тем, как пересылать их по сети, и за сборку этих пакетов в исходное состояние после получения. [[source]][tcp]
-
IP (Internet Protocol) — отвечает за обмен данными между устройствами, т.е. за адресацию, отправку и получение пакетов данных через интернет. [[source]][ip]
-
DNS (Domain Name Server) — иерархическая система имен, построенная на распределенных базах данных. [source]
- Когда пользователь посещает сайт, то имя сайта преобразуется в числовое представление с помощью DNS.
- Когда регистрируется новый домен вместе с TCP/IP адресом, DNSs по всему миру фиксируют эту информацию.
-
HTTP (HyperText Transfer Protocol) — протокол уровня приложения, используемый в основном в World Wide Web. HTTP использует клиент-серверную модель, где браузер является клиентом и общается с веб-сервером, который хостит веб-сайт. [source]
- Обычный HTTP запрос состоит из следующих шагов:
- Открывается соединение к HTTP серверу.
- Запрос отправляется на сервер.
- Выполняются вычисления на сервере.
- Сервер посылает назад ответ.
- Соединение закрывается.
- Для HTTP, действие над данными задается с помощью методов (CRUD операций):
- GET — получить.
- PUT — добавить, заменить.
- POST — добавить, изменить, удалить.
- DELETE — удалить.
- Обычный HTTP запрос состоит из следующих шагов:
-
HTTPS (HyperText Transfer Protocol Secure) — разновидность HTTP протокола, который добавляет передаваемым данным уровень безопасности через SSL протокол или TLS протокол. [source]
-
FTP (File Transfer Protocol) — протокол, используемый для передачи или обмена файлами между компьютерами. FTP часто используется для загрузки сетевых страниц и других документов с частного устройства разработки на открытые сервера хостинга.
-
GIOP (General Inter-ORB Protocol) — абстрактный протокол в распределённых объектных системах, обеспечивающий возможность взаимодействия сервисов-брокеров.
-
IIOP (Inter-ORB Protocol) — является конкретной реализацией абстрактных определений GIOP.
-
SSL (Secure Socket Layer) — стандартный протокол, используемый для защищенной передачи документов через сеть.
-
TLS (Transport Layer Security) — улучшенная версия SSL протокола.
-
SNMP (Simple Network Management Protocol) — используется для управления сетями.
-
ARP (Address Resolution Protocol) — используется IP для поиска адреса параметров сетевой карты компьютера, опираясь на IP-адрес.
-
RARP (Reverse Address Resolution Protocol) — используется IP для поиска IP-адресов, опираясь на параметры сетевой карты компьютера.
-
PPTP (Point to Point Tunneling Protocol) — используется для установления соединения (тунеля) между приватными сетями.
-
NTP (Network Time Protocol) — используется для синхронизации времени между компьютерами.
-
LDAP (Lightweight Directory Access Protocol) — используется для сбора информации о пользователях и электронных почтовых адресов из интернета.
-
ICMP (Internet Control Message Protocol) — заботится об ошибках в сети.
-
DHCP (Dynamic Host Configuration Protocol) — используется для поиска динамических IP-адресов компьютеров в сети.
-
BOOTP (Boot Protocol) — используется для бута (запуска) компьютеров из сети.
-
POP (Post Office Protocol) — используется программами с почтовой функциональностью для отыскания нужной почти из почтового сервера.
-
IMAP (Internet Message Access Protocol) — действует также, как и POP, только не загружает сразу все запрашиваемые почты, а дает возможность посмотреть на сообщения, которые выдает почтовый сервер, или удалить их из базы.
-
SMTP (Simple Mail Transfer Protocol) — заботится об отправки сообщений в почту. Обычно сообщения посылаются на почтовый сервер, а затем в другие серверы и только потом в пункт назначения. Может передавать только текстовые данные.
-
MIME (Multi-purpose Internet Mail Extensions) — выполняет такие же функции, что и SMTP, только может еще передавать в сообщениях двоичные данные, т.е. аудио, видео, картинки, что угодно.
Технологии
-
SOAP (Simple Object Access Protocol) — основанный на XML протокол обмена сообщениями.
-
WSDL (Web Services Description Language) — язык разметки, основанный на XML, преднзначенный для
описания веб сервисов. -
UDDI (Universal Description, Discovery, and Integration) — предоставляет всемирный реестр веб сервисов для рекламы, поиска и хранения.
-
Взаимодействие между SOAP, WSDL и UDDI:
- Приложение играет роль веб сервисов, которые нужны клиенту для доступа к другому приложению или бизнес логике, расположенной где-то в сети.
- Клиент делает запрос в UDDI реестр для нахождения сервиса по имени, категории, идентификатору или какой-то другой спецификации.
- Как только сервис найден, клиент получает информацию о местонахождении WSDL документа из UDDI реестра.
- WSDL документ содержит информацию о том, как обратиться к веб сервису, и формат запросов в XML схему.
- Клиент создает SOAP сообщение в соответствии с XML схемой, взятой из WSDL, и посылает запрос хосту (где находится веб сервис).
1. SOM
-
SOM (Service-Oriented Model) сосредаточена на тех аспектах архитектуры, которые относятся к сервису и действиям. [source]
- Главная цель SOM — устанавливать отношения между агентом, сервисом, который он реализует, и запросами.
- SOM построен на основе MOM, но сосредочен больше на действия, чем на сообщения.
-
Message — единица информации, отсылаемая одним агентом другому в конексте веб сервисов. [source]
-
Action — любое действие, представленное агентом в качестве отклика на получение сообщения, или посылки сообщения, или другого изменения состояния. [source]
-
Service — набор действий, которые формируют целостную систему с точки зрения провайдеров и реквесторов. [source]
-
Agent — программа, выполняющая функции, указанные пользователем, сущностью или процессом. [source]
- Агент представляет программу, выполняющую функции согласно действиям пользователя, сущности или процесса.
- Агент обладает идентификатором, владельцем (сущностью) и может предоставлять 1 и более сервисов или запрашивать 0 и более сервисов.
-
Choreography — определяет очередность и условия, которые позволяют объеденению независимых веб сервисов обмениваться информацией с целью достичь некоторую полезную функцию. [source]
-
Choreography Description Language — нотация для описания хореографии. [source]
-
Service Description — набор документов, описывающих интерфейс и семантику сервиса. [source]
- Описание выражается через XML и обуславливается одним или более стандартами.
-
Service Operation — абстрактная группировка сообщений, которую сервис посылает и получает, чтобы совершить определенную задачу. [source]
-
Service Platform — среда, используемая для хостинга одного или более веб сервисов. [[source]][service-platform]
- Она включает в себя один или более SOAP серверов, ни одного или несколько UDDI реестров, защиту и транзакционные сервисы, используемые веб сервисами, которые хостятся на ней, и прочую инфраструктуру.
-
Service Provider — агент, который способен и предназначен для совершения действий, связанных с сервисом. [source]
- Провайдер предоставляет 1 или более сервисов.
- Провайдер представляет или вызывает представление действий, связанных с сервисом.
-
Service Requester — сущность, которая отвечает за запросы к сервису через провайдер. [source]
- Реквестор запрашивает 1 или более сервисов.
-
Service Registry (Broker) — логически-централизованная директория сервисов, куда девелоперы публикуют новые
сервисы и где можно найти существующие. Поэтому этот элемент является координационным центром для компаний и их услуг. [[source]][service-registry]- Реестр предоставляет следующего вида информацию: бизнес данные, такие как имя, описание, контактная информация, или данные, необходимые для использования веб сервиса.
-
Service Semantics — контракт между провайдером и реквестором, который отображает вызов сервиса. [source]
- Семантика является обобщением таксов, которые составляют сервис.
- Семантика может выражаться с помощью языка описания сервиса.
-
Service Task — еденица активности, связанная с сервисом. [source]
2. ROM
- ROM (Resource-Oriented Model) сосредоточена на тех аспектах архитектуры, которые относятся к ресурсам, и сервис модель которых связана с манипулированием ресурсами. [source]
3. SOAP
-
SOAP — протокол обмена структурированными сообщениями в распределенной вычислительной среде. Также предоставляет стандарт структуры упаковки данных для транспортировки XML документов с помощью различных интернет-технологий, как: SMTP, HTTP, FTP. [source]
- Так как SOAP обладает стандартным механизмом транспортировки, различные клиенты и серверы могут взаимодействовать, например, с EJB через .NET клиент и наоборот.
-
Пример взаимодействия клиента с Web приложением (регистрация аккаунта):
- Программа на клиентской стороне конвертирует информацию о регистрации аккаунта в SOAP сообщение.
- SOAP сообщение отсылается в веб сервис, как тело HTTP POST запроса.
- Веб сервис распаковывает SOAP реквест и конвертирует в комманду, которую понимает приложение на сервере.
- Приложение обрабатывает информацию своей логикой и отправляет ответ с новым уникальным номером аккаунта.
- Следующим шагом, веб сервис конвертирует ответ сервера в SOAP сообщение, которое отправляет назад в клиентское
приложение, как ответ на HTTP запрос. - Клиентское приложение распаковывает SOAP сообщение и предоставляет клиенту соотвествующую информацию.
-
Клиент/сервер связь:
HTTP POST of SOAP request document SOAP: client ----------------------------------> service client <---------------------------------- service SOAP (maybe JSON) document
-
SOAP Building Blocks. SOAP сообщение — это обычный XML документ, содержащий следующие элементы:
- Оболочка — идентифицирует XML документ как SOAP сообщение.
- Заголовок — содержит различного рода информацию о сообщении, которая помещается обычно в заголовки.
- Тело — содержит информацию о вызове и ответе.
- Ошибка — содержит все ошибки и текущий статус.
4. WSDL
-
WSDL (Web Service Description Language) — XML технология, которая описывает интерфейс веб сервиса в стандартизированном виде. WSDL указывает стандарт, как веб сервис должен представлять входные и выходные параметры при вызове извне, как должна выглядеть структура функции, природа вызова и как осуществлять связывание протокола сервера. [source]
- WSDL позволяет различным клиентам автоматически распознавать, как взаимодействовать с веб сервисом.
-
WSDL документ — описывает веб сервис. Он указывает местоположение сервиса и его методы, используя следующие элементы:
<types>
— определяет типы данных, используемые веб сервисом.<message>
— определяет элементы данных для каждой операции.<portType>
— описывает операции и сообщение, которые могут встретиться в сервисе.<binding>
— определяет протокол и формат данных для каждого типа порта.<service>
— определяет адрес веб сервиса.<definition>
— корневой элемент каждого WSDL документа.<operation>
— абстрактное определение операции для сообщения.<documentation>
— предоставляет документацию<import>
— импортирует сторонние WSDL документы или XML Schemas.
-
Структура WSDL документа выглядит следующим образом:
<definitions> <types> data type definitions........ </types> <message> definition of the data being communicated.... </message> <portType> set of operations...... </portType> <binding> protocol and data format specification.... </binding> </definitions>
-
<portType>
— элемент, который определяет веб сервис, операции, приводимые в нем, и задействованные сообщения.- request-response — самый распространенный тип операции. Она получает запрос и возвращает ответ.
- one-way — операция может получать сообщения, но не будет возвращать ответ.
- solicit-response — операция может отправлять запрос и будет ждать ответа.
- notification — операция может посылать сообщений, но не будет ждать ответа.
-
Пример Request-Response операции (словарь терминов):
<message name="getTermRequest"> <part name="term" type="xs:string"/> </message> <message name="getTermResponse"> <part name="value" type="xs:string"/> </message> <portType name="glossaryTerms"> <operation name="getTerm"> <input message="getTermRequest"/> <output message="getTermResponse"/> </operation> </portType>
<portType>
определяет «glossaryTerms» как имя порта, аgetTerm
— имя операции<message>
элементы определяют<part>
сообщений «getTermRequest» и «getTermResponse».
-
Пример One-Way операции (словарь терминов):
<message name="newTermValues"> <part name="term" type="xs:string"/> <part name="value" type="xs:string"/> </message> <portType name="glossaryTerms"> <operation name="setTerm"> <input name="newTerm" message="newTermValues"/> </operation> </portType >
- В этом примере «glossaryTerms» определяет one-way операцию «setTerm».
- «setTerm» операция позволяет вводить новое сообщение используя «newTermValues».
-
Пример WSDL файла:
<?xml version="1.0" encoding="UTF-8"?> <definitions name="HelloService" targetNamespace="http://www.ecerami.com/wsdl/HelloService.wsdl" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.ecerami.com/wsdl/HelloService.wsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <types> <xsd:schema> <xsd:import schemaLocation="http://localhost:9876/ts?xsd=1" namespace="http://ts.ch02/"> </xsd:import> </xsd:schema> </types> <message name="SayHelloRequest"> <part name="firstName" type="xsd:string"/> </message> <message name="SayHelloResponse"> <part name="greeting" type="xsd:string"/> </message> <portType name="Hello_PortType"> <operation name="sayHello"> <input message="tns:SayHelloRequest"/> <output message="tns:SayHelloResponse"/> </operation> </portType> <binding name="Hello_Binding" type="tns:Hello_PortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="sayHello"> <soap:operation soapAction="sayHello"/> <input> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:examples:helloservice" use="encoded"/> </input> <output> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:examples:helloservice" use="encoded"/> </output> </operation> </binding> <service name="Hello_Service"> <documentation>WSDL File for HelloService</documentation> <port binding="tns:Hello_Binding" name="Hello_Port"> <soap:address location="http://localhost:8080/soap/rpcrouter"/> </port> </service> </definitions>
<service>
: HelloService.<types>
: Использование импортированной по локальному адресу XML Schema.<message>
: «sayHelloRequest»: «firstName» параметр, «sayHelloResponse»: «greeting» возвращаемое
значение<portType>
: sayHello операция, которая состоит из request-response сервиса.<binding>
: Указание использовать SOAP HTTP протокол.<service>
: сервис доступен по ссылке http://www.examples.com/SayHello/.<port>
: Связывает<binding>
с URI http://www.examples.com/SayHello/, по которой доступен данный сервис.
5. UDDI
- UDDI (Universal Description, Discovery, and Integration) — предоставляет всемирный реестр веб сервисов для рекламы, поиска и хранения. [source]
- UDDI предоставляет структуру для представления деловых отношений, веб сервисов, технических метаданных и точек доступа к веб сервисам.
6. REST
-
REST (REpresentational State Transfer) — это стиль архитектуры программного обеспечения для распределенных систем, использующий веб протоколы и веб технологии. REST архитектура включает в себя клиентское и серверное взаимодействие, построенное вокруг передачи ресурсов. [source]
- Самая большая реализация REST — World Wide Web, которая, как правило, используется для построения веб-служб.
- Системы, которые построены согласно REST принципам, называются RESTful.
- REST может быть использован для сбора данных вебсайта через XML файлы веб страницы.
- Пользователи могут обращаться к веб страницам через URL сайта, взаимодействовать с XML файлами через браузер и использовать данные как угодно.
- Базовые REST принципы:
- Client и Server — клиент и сервер должны быть отделены от REST операций через специальный интерфейс, который улучшает переносимость кода.
- Stateless — каждый клиентский запрос должен содержать все требуемые данные для обработки запроса без хранения клиентского окружения на сервере.
- Cacheable — ответы могут быть закэшированны на клиентском компьютере, чтобы ускорить веб поиск.
- Layered System — позволяет клиентам подключаться к серверу через вспомогательный уровень для улучшения расширяемости.
-
Клиент/сервер связь:
HTTP GET, POST, PUT, or DELETE REST: client ----------------------------------> service client <---------------------------------- service XML, JSON, plaintext,... document
Веб-сервисы в Java
-
Servlet API является основой для всех остальных технологий Java, касающихся Web и дает возможность динамически генерировать любой web-контент, используя любые библиотеки, доступные для java.
-
JSP (JavaServer Pages) — технология, используемая для разработки интерактивных веб страниц. JSP была разработана Sun Microsystems и является улучшенной версией Java сервлетов. [source]
- Как и большинство серверных технологий, JSP отделяет бизнес логику от представления.
- JSP являются обычные HTML страницы с встроенным Java кодом.
- Чтобы обработать JSP файл, разработчику нужен JSP движок, который подключен к веб серверу.
- JSP страница компилируется в сервлет, который управляет сервлет движком (этот этап называется «преобразованием»). Сервлет движок затем загружает класс сервлета и реализовывает его, чтобы создать динамический HTML, который затем посылается в браузер. Такой процесс запускается каждый раз, когда запрашивается очередная страница.
- Если вместе с JSP исользовать JDBC, то можно сделать динамические, связанные с базой данных, вебсайты.
-
Apache Tomcat — опенсорсный веб сервер, разработанный Apache Software Foundation. Он позволяет реализовывать Java сервлеты и JSPs для поддержки эффективных Java-серверных сред. [source]
- Пользователь также может получить доступ к конфигурациям и использовать XML для настройки проектов.
- Tomcat может предоставить рантайм оболочку для Java сервлетов.
- Ключевой элемент Java-based веб сервера — сервлет контейнер, поэтому JSP скрипты и им подобные автоматически преобразовываются в сервлет.
- Catalina — контейнер сервлетов Tomcat’а, который реализует спецификацию сервлетов.
-
Apache Ant — Java-based опенсорсный build tool, разработанный Apache Software Foundation. Он схож с «make» утилитой, но в большинстве своем функционирует только на java платформе. [source]
- В отличии от Make, Ant написан на XML, поэтому портируемость и простота — это два главных преимущества Ant.
-
RPC (Remote Procedure Call) — класс технологий, позволяющих компьютерным программам вызывать функции или процедуры в другом адресном пространстве (как правило, на удаленных компьютерах). [source]
- RPC работает по принципу: отправитель или клиент создает запрос с помощью процедуры, функции или вызова метода в удаленный сервер, который RPC обрабатывает и посылает. Когда удаленный сервер получает запрос, он отсылает ответ назад клиенту, и приложение продолжает свою работу. Перед тем, как продолжать работу программы, клиент ждет, пока сервер завершит процесс обработки.
- В общем, RPC приложения используют модули, называемые прокси и заглушки, которые заставляют их выглядеть как простые локальные вызовы процедур.
- RPC-ориентированное приложение — приложение, в которых существует интерактивная связь между удалёнными компонентами с небольшим временем ответов и относительно малым количеством передаваемых данных.
- Пример RPC можно найти в GWT.
-
RMI (Remote Method Invocation) — программный интерфейс вызова удаленных методов в языке Java. [source]
- Он представляет объектно-ориентированный эквивалент RPC.
- RMI функциональность находится в
java.rmi
пакете и предоставляет распределенную объектную модель, специфицирующую, каким образом производится вызов удаленных методов, работающих на другой виртуальной машине Java. - При доступе к объектам на другом компьютере возможно вызывать методы этого объекта. Необходимо только передать параметры метода на другой компьютер, сообщить объекту о необходимости выполнения метода, а затем получить обратно возвращаемое значение.
-
RSS (Really Simple Syndication)
-
RDF (Resource Description Framework)