Для чего нужны веб службы
Основные понятия Web-службы
Основные понятия web-службы
Сегодня доступ к Интернету можно получить с помощью различных устройств, обеспечивающих большое разнообразие функциональных средств. В большинстве случаев обмен информацией в Интернете осуществляется посредством запросов и ответов с использованием открытых протоколов, в частности HTTP. Обычно большая часть такой информации представлена на языке HTML, специальные теги которого позволяют организовать пользовательский интерфейс в отображаемых браузером web-страницах.
Web-ориентированные приложения
Web-приложения нельзя назвать совершенными, поскольку для интеграции функциональных возможностей различных web-узлов используются достаточно «неуклюжие» методы, такие как метод поиска связей, кадров и экранов. Недостаток приложений подобного типа состоит в их «монолитности» (связанности): они существуют как пакеты «все в одном», и очень непросто отделить пользовательский интерфейс от его функциональности, обеспечить, скажем, отслеживание курсов акций или их пакетов без того, чтобы принуждать пользователя «бегать» по всему web-узлу.
Что такое web-служба
Для чего нужны web-службы
Web-службы предоставляют способ совместного использования программных функций. Их даже можно назвать «СОМ для Web», хотя в основе работы этих систем лежит совсем другая технология.
Web-служба не является продуктом для конечного пользователя. Она представляет собой основанное на компонентах приложение, позволяя многократно использовать свою функциональность в различных средах и на клиентах разных типов. Пользователем web-службы всегда является другое приложение.
Web-службы могут использоваться для решения следующих задач:
На сегодняшний день это наиболее широко распространенные задачи, решаемые с применением web-служб. Web-службы позволяют совместно использовать информацию либо могут интегрироваться с другими службами. Например, компания, занимающаяся электронной коммерцией, может обращаться к web-службе для осуществления автоматического взаимодействия с поставщиками. В подобных случаях в качестве пользователя web-службы, скорее всего, будет выступать программное обеспечение, установленное в такой компании.
Web-службы можно использовать, в частности, для соединения специализированной программы по работе с платежными ведомостями с бухгалтерским программным обеспечением через защищенную корпоративную сеть (а не через Интернет).
1) Введение в WebService
Что такое веб-сервис?
Веб-сервисы — это механизм или средство связи, посредством которого два приложения / машины будут обмениваться данными независимо от их архитектуры подчеркивания и технологии.
Что такое тестирование веб-службы?
Тестирование веб-сервисов — это тип тестирования программного обеспечения, который проверяет веб-сервисы. Целью тестирования веб-служб является проверка функциональности, надежности, производительности и безопасности API (интерфейса прикладных программ). Тестирование веб-службы в некоторых случаях аналогично тестированию модулей. Вы можете протестировать Web-сервис вручную или создать свой собственный код автоматизации или использовать готовый инструмент автоматизации, такой как Postman.
Зачем нужен веб-сервис?
В общем, программные приложения разрабатываются для использования людьми, когда человек отправляет запрос в службу программного обеспечения, которая, в свою очередь, возвращает ответ в удобочитаемом для человека формате.
В современную технологическую эпоху, если вы хотите создать программное приложение, вам не нужно создавать все с нуля. Существует множество готовых сервисов, которые вы можете подключить к своему приложению, и вы можете начать предоставлять эти сервисы в своем приложении.
Например, вы хотите отображать информацию о прогнозе погоды, которая вам не нужна для сбора, обработки и отображения данных в вашем приложении. Вы можете купить услуги у людей, которые уже хорошо зарекомендовали себя в обработке и публикации такого рода данных.
Веб-сервисы позволяют нам делать такие реализации.
В качестве примера рассмотрим следующий WebService
Это дает стоимость акций для компании.
Давайте найдем цену акции для Google (Символ: GOOG)
XML ответа дает цену акции.
Этот веб-сервис может вызываться программным приложением с использованием протокола SOAP или HTTP.
Протоколы веб-сервисов
Веб-сервисы могут быть реализованы различными способами, но следующие два являются популярными подходами к реализации.
SOAP — это стандартный протокол, определенный стандартом W3C для отправки и получения запросов и ответов веб-служб.
SOAP использует формат XML для отправки и получения запроса и, следовательно, данные являются независимыми от платформы данными. Сообщения SOAP обмениваются между приложениями поставщика и принимающим приложением в конвертах SOAP.
Поскольку SOAP использует простой транспортный протокол http, его сообщения не блокируются брандмауэрами.
ОСТАТОК
REST означает REpresentational State Transfer; это архитектура, которая обычно работает через HTTP. Стиль REST подчеркивает взаимодействия между клиентами и сервисами, которые улучшаются благодаря ограниченному количеству операций. REST является альтернативой SOAP (Simple Object Access Protocol), и вместо использования XML для запроса REST в некоторых случаях использует простой URL. В отличие от SOAP, приложения RESTFUL используют HTTP-заголовки для переноса метаинформации.
Rest API поддерживает формат XML и JSON. Как правило, он предпочтителен для мобильных и веб-приложений, поскольку он делает работу приложений более быстрой и плавной.
WSDL (язык описания веб-сервисов) — это язык на основе XML, который будет использоваться для описания сервисов, предлагаемых веб-сервисом.
WSDL описывает все операции, предлагаемые конкретным веб-сервисом в формате XML. Он также определяет, как могут быть вызваны сервисы, то есть какое входное значение мы должны предоставить и какой будет формат ответа, который он будет генерировать для каждого вида сервиса.
Как проверить веб-сервис?
Для тестирования веб-сервиса вы можете
Тестирование WebService включает в себя следующие шаги:
Предположим, мы хотим протестировать веб-сервис, который предоставляет средство конвертации валют. Это будут текущие курсы обмена между валютами разных стран. Этот сервис мы можем использовать в наших приложениях для преобразования значений из одной валюты в другую валюту.
Теперь давайте посмотрим на шаги выше
Шаг с 1 по 4: Понимание WSDL и определение операций и форматов XML
Файл WSDL Currency Convertor можно увидеть @ ( http://www.webservicex.net/CurrencyConvertor.asmx?wsdl ), который предоставит информацию о методах веб-службы Currency Convertor, которые он будет поддерживать, параметр, который нам нужно передать, и тип параметров… и т. д.
Шаг 5: Использование инструмента или написание кода для отправки запроса и проверки ответа
Для тестирования веб-сервисов доступно множество инструментов. SoapUI — один из популярных инструментов, который поможет нам протестировать веб-сервисы. Фактически вы можете использовать любой язык программирования, который способен отправлять XML-запрос приложению поставщика веб-услуг через http и может анализировать и проверять XML-ответ в соответствии с ожидаемым результатом. В нашем случае мы будем тестировать WebService
ЧАСТЬ 1) Тестирование WebService с использованием Apache Axis2 API (Java).
Обычно веб-служба принимает запрос и отправляет ответ в формате XML.
Axis2 может отправлять сообщения SOAP и получать и обрабатывать сообщения SOAP. Мы можем написать небольшую Java-программу, используя API для создания веб-сервиса. Axis2 сгенерирует WSDL из Java-программы, которая будет использоваться для передачи сервисов, предлагаемых веб-сервисом. Мы можем использовать тот же Axis2 для генерации Java-класса (заглушки) из файла WSDL, который мы можем использовать в качестве клиентской программы для генерации запроса веб-сервиса, отправки запроса конечной точке сервиса и обработки ответа.
Давайте посмотрим на шаги выше в деталях
Шаг а) Загрузите API-интерфейс axis2 @ https://axis.apache.org/axis2/Java/core/download.cgi и установите переменную среды AXIS2_HOME.
Шаг б) Создайте папку для хранения всех сгенерированных артефактов
Пример: C: \ Axis \ Projects \ CurrencyConverter
Шаг c) Откройте командную строку и перейдите к структуре папок, в которой вы хотите создать артефакты, и выполните следующую команду, которая сгенерирует заглушки
Шаг d) После успешного выполнения команды вы увидите папку с необходимыми файлами.
Шаг д) Далее мы должны создать клиентскую программу, с помощью которой мы будем отправлять фактический запрос, используя сгенерированные заглушки. Откройте затмение и создайте новый проект Java и выберите папку, которую мы создали выше.
Шаг f) Добавьте все файлы jar, связанные с axis2, в путь сборки проекта, который будет находиться в папке lib в папке программного обеспечения axis2
(например: C: \ Axis \ axis2-1.6.2 \ lib)
Шаг g) Создайте новый класс Java (например: Client.Java) и создайте экземпляр объекта-заглушки. Используя объект-заглушку, мы можем вызвать все поддерживаемые методы конкретного WebService.
ЧАСТЬ 2) Использование SoapUI для тестирования WebService
Как вы можете заключить, использование таких инструментов, как SoapUI, ускоряет ваши усилия по тестированию WebService. Поэтому SoapUi будет центром нашего обучения в последующих уроках.
Резюме
Часто задаваемые вопросы
В чем разница между WebService и WebAPI?
Веб-сервис
Веб-API
Это руководство стало возможным благодаря участию г-на Нарендера Редди Нукала
Веб-сервисы в теории и на практике для начинающих
Что такое веб-сервисы?
Прежде всего, веб-сервисы (или веб-службы) — это технология. И как и любая другая технология, они имеют довольно четко очерченную среду применения.
Если посмотреть на веб-сервисы в разрезе стека сетевых протококолов, мы увидим, что это, в классическом случае, не что иное, как еще одна надстройка поверх протокола HTTP.
С другой стороны, если гипотетически разделить Интернет на несколько слоев, мы сможем выделить, как минимум, два концептуальных типа приложений — вычислительные узлы, которые реализуют нетривиальные функции и прикладные веб-ресурсы. При этом вторые, зачастую заинтересованы в услугах первых.
Но и сам Интернет — разнороден, т. е. различные приложения на различных узлах сети функционируют на разных аппаратно-программных платформах, и используют различные технологии и языки.
Чтобы связать все это и предоставить возможность одним приложениям обмениваться данными с другими, и были придуманы веб-сервисы.
По сути, веб-сервисы — это реализация абсолютно четких интерфейсов обмена данными между различными приложениями, которые написаны не только на разных языках, но и распределены на разных узлах сети.
Именно с появлением веб-сервисов развилась идея SOA — сервис-ориентированной архитектуры веб-приложений (Service Oriented Architecture).
Протоколы веб-сервисов
На сегодняшний день наибольшее распространение получили следующие протоколы реализации веб-сервисов:
На самом деле, 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):
Таблица номиналов обмена (exchange):
Для работы с базой данных воспользуемся ORM слоем на базе пакета PHP Doctrine. Реализуем граббер:
класс Grubber (models/Grabber.php):
и сам граббер (grabber.php):
Теперь заставим наш граббер отрабатывать раз в сутки в 10:00 утра, путем добавления команды запуска граббера в таблицы cron:
Все — у нас есть достаточно полезный сервис.
Теперь реализуем веб-сервис, который позволит другим приложениям извлекать данные из нашей базы.
Реализация SOAP сервиса
Для реализации веб-сервиса на базе SOAP протокола, мы воспользуемся встроенным пакетом в PHP для работы с SOAP.
Поскольку наш веб-сервис будет публичным, хорошим вариантом будет создание WSDL файла, который описывает структуру нашего веб-сервиса.
WSDL (Web Service Definition Language) — представляет из себя XML файл определенного формата. Подробное описание синтаксиса можно найти здесь.
На практике будет удобно воспользоваться функцией автоматической генерации файла, которую предоставляет IDE Zend Studio for Eclipse. Данная функция позволяет генерировать WSDL файл из классов PHP. Поэтому, прежде всего, мы должны написать класс, реализующий функциональность нашего сервиса.
класс CurrencyExchange (models/CurrencyExchange.php):
Отметим, что для автоматической генерации 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. Таким образом они не смогут быть вызваны, несмотря на то, что существуют.
Реализация же самого сервера не предстваляет теперь никакой сложности:
Вы можете попробовать веб-сервис в работе по адресу: http://mikhailstadnik.com/ctws/
Там же доступен тестовый клиент: http://mikhailstadnik.com/ctws/client.php
Код простейшего клиента может быть таким:
Реализация 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-сервис менее защищен, чем SOAP-сервис, так как любой добавленый метод в класс CurrencyExchange при его вызове отработает (сам класс определяет сруктуру сервиса).
Проверим работу нашего сервиса. Для этого достаточно передать параметры вызова метода в сроке GET-запроса:
При желании или необходимости вы можете самомтоятельно задавать структуру ваших XML ответов для сервиса REST. В этом случае, также будет необходимо позаботиться и о создании определения типа вашего XML документа (DTD — Document Type Definition). Это будет минимальным описанием API вашего сервиса.
Простейший тестовый клиент к REST сервису может быть в нашем случае таким:
В принципе, Zend_Rest на сегодняшний день нельзя назвать наиболее точной реализацией принципов REST. Утрируя, можно говорить о том, что эта реализация свелась к удаленному вызову процедур (RPC), хотя философия REST гораздо шире.
Вы можете скачать пример в исходных кодах c PHP Doctrine и Zend Framework (4,42 Мб).
Заключение
Мы выполнили задачу минимум и показали, что такое веб-сервисы, для чего они нужны и как их реализовывать. Естественно, приведенный пример, возможно, несколько оторван от жизни, но он был выбран лишь в качестве инструмента для объяснения предмета и сущности веб-сервисов.
Кроме того мы увидели, что реализация веб-сервиса — задача довольно простая при использовании современного инструментария, который позволяет сконцентрироваться, в первую очередь, на разработке функциональности самого сервиса, не заботясь о низкоуровневой реализации протоколов.
Автор надеется, что данный материал будет действительно полезен тем, кто становится на тропу разработки веб-служб.
А ваша служба является RESTful? Все что необходимо/обязательно знать про веб службы и REST
Введение
Вот не люблю я изобретать велосипед и статью я бы эту не написал, но пришлось. Про REST сказано уже довольно много. Многие поставщики веб служб готовы клясться, что их службы являются RESTful. Во время собеседования вы точно услышите хотя бы несколько вопросов про REST, независимо от того это собеседования для бэкенд, мобайл или фронтенд разработчика. Я вот помню как-то во время одного собеседования меня задали такой вопрос: «Вот вы написали в своем резюме, что знайте REST․ Ответьте пожалуйста, какой HTTP код вы получите, если при запросе к RESTful сервису ресурс не найден?». Ответ 404 был принят единогласно. Если честно, я так и не понял, как этот вопрос помог понять знаю ли я REST или нет, но одно могу уверенно сказать: REST понимают далеко не все. Вот некоторые вопросы, которые мучали меня долгое время:
Поскольку REST мы рассматриваем с точки зрения веб служб, в статье я попытался изложить все то, что нужно знать для представления общей картины.
Ну что же, начнем путешествие в мир веб-сервисов.
SOA & Web Services
SOA, расширяемая как сервис ориентированная архитектура (Service Oriented Architecture), является парадигмой для организации и использования распределенных систем, которые могут находиться под контролем различных областей собственности [1]. В SOA, под service подразумевается функциональная возможность, которая удовлетворяет следующим критериям [2]։
Web Service, согласно определению [3], является системой, предназначенная для взаимодействия машин/программ по сети. Веб-сервис должен иметь интерфейс, описанной в машинно-обрабатываемом формате (service description). Другие системы должны взаимодействовать с веб-сервисом посредством сообщений.
Взаимосвязь между веб-сервисом и SOA является то, что SOA может быть реализован посредством веб-сервисов.
Если вас заинтересует какие еще методы существуют или существовали для реализации SOA, можете посмотреть COM и CORBA.
Протоколы веб служб
До того, как решить какая служба является RESTful, а какая нет, рассмотрим некоторые реализации, или как по другому их называют, протоколы веб служб. Список общеизвестных протоколов веб служб можно найти в [4].
Протокол XML-RPC (XML Remote Procedure Call) [5] был в первые опубликован в 1999 году. Все сообщение XML-RPC являются HTTP-POST запросами. Для кодирования сообщений используется XML. Параметры процедуры могут быть скалярные значения, числа, строки, даты, массивы и структуры. Ответ веб службы может хранить либо значение, возвращаемой процедурой, либо код и сообщение ошибки.
В качестве недостатка протокола XML-RPC, приводится большой размер сообщений (4 раза больше, по сравнению с обычным XML) и не существования языка описания веб-сервиса (что-то похожее на WSDL), который мог был бы использоваться для генерации прокси классов на стороне клиента.
Протокол JSON-RPC [6], опубликованный в 2009 году, по своим принципам работы очень похож на XML-RPC. Главными отличиями являются способ кодирования данных, независимость от транспортного уровня, способность передачи извещений (notification request) и возможность идентификации ответов при отправке нескольких запросов одновременно.
Для кодирования данных в JSON-RPC используется JSON. Кроме имени процедуры и параметров, в запросе указывается также значение id, который используется для идентификации ответа на стороне клиента. Другими словами если вы отправили запрос с то ответ этого запроса обязательно должен возвращать сообщение с >
Извещение – это специальные запросы, на которые сервер может не отвечать. Для отметки запроса, как извещение, значения параметра id указывается = null.
Независимость от транспортного уровня можно обусловить только тем, что в спецификации JSON-RPC [6] HTTP не указывается обязательным протоколом. При использовании JSON-RPC над HTTP, необходимо использовать POST запросы.
Недостатком JSON-RPC, как и в случае XML-RPC является отсутствие языка описания веб-сервиса (аналог WSDL).
Протокол SOAP (Simple Object Access Protocol) [7] является наследником XML-RPC. Основными характеристиками SOAP являются:
REST является на сегодняшний день наверное самым популярным веб-сервис протоколом.
На самом деле REST вовсе не является протоколом и оно вообще не новое. REST является архитектурой который был предложен в 2000-ие годы Роем Филдингом в его диссертации «Architectural Styles and the Design of Network-based Software Architectures» [8]. До этого REST архитектура была использована в многих проектах в рамках IETF и W3C. В самой диссертации вы не сумейте найти терминов «веб служба» или SOA. REST архитектура была предложена для правильного конструирования распределенных гипермедиа систем, по другим словом того, что на сегодня называется World Wide Web. Чтобы диссертацию Филдинга вы приняли в серьез, скажу, что Рой является архитектором HTTP 1.1, соавтором интернет стандартов для HTTP и URI [10]. В общем мужик он серьезный и известный.
Чтобы распределенная система считалась сконструированной по REST архитектуре, необходимо, чтобы она удовлетворяла следующим критериям:
Для получения универсального интерфейса вводятся следующие ограничения:
В REST ресурсом является все то, чему можно дать имя. Например, пользователь, HTML документ, изображение, регистрированный пользователь, красная майка, голодная собака, текущая погода и т.д. Каждый ресурс в REST должен быть идентифицирован посредством стабильного идентификатора, который не меняется при изменении состояния ресурса. В нашем случае идентификатором в REST является URI.
Представление в REST используется для выполнения действий над ресурсами. Представление ресурса представляет собой текущее или желаемое состояние ресурса. Например, если ресурсом является пользователь, то представлением может являться XML или HTML описание этого пользователя.
Под само-описательностью имеется ввиду, что запрос и ответ должны хранить в себе всю необходимую информацию для их обработки. Не должны быть дополнительные сообщения или кэши для обработки одного запроса.
Данный пункт означает, что гипертекст должен быть использован для навигации по API [9]. Отмечу, что в случае SOA для этого используется service description.
Рассмотрим данный пункт более подробно.
Как вы уже заметили в этих пунктах ничего не сказано про GET, PUT, POST и DELETE запросы, кодирование JSON, HTTP и т.д.
REST – это просто архитектура, он никак не привязан к каким либо протоколом.
Наверняка вы уже заметили, что в REST архитектуре нет ничего удивительного и нового. Нового было в REST в 2000 году, когда веб только-только начал развиваться. Чтобы еще лучше представить REST и его значимость, представьте, что веб – это распределенная система гипермедиа, где каждый сайт представляет собой гипертекст.
Тогда конечно возникает вопрос — а то, что мы видим и делаем на практике, это что? В интернете можно найти кучу споров про то, как должна выглядеть RESTful служба и как не должна. Какие методы HTTP должны использоваться а какие нет. В общем, как уже понятно, все эти обсуждения не имеют теоритической основы, поскольку нет какой-либо спецификации про RESTful службы. В одном проекте могут решить, что POST будет использоваться для создания новой записи, в другой для обновления, а в третей для удаления. Эти решения никак не связаны с REST архитектурой.
REST & Richardson Maturity Model
И так, как же связан REST с веб службами? Какие службы можно считать RESTful, а какие нет? Что вы получите, если ваша служба будет удовлетворять всем пунктам Филдинга? Отвечу на эти вопросы по очереди:
REST provides a set of architectural constraints that, when applied as a whole, emphasizes scalability of component interactions, generality of interfaces, independent deployment of components, and intermediary components to reduce interaction latency, enforce security, and
encapsulate legacy systems.
Звучит конечно все очень круто, но надо ли чтобы ваш веб-сервис был сконструирован по REST или это просто тренд? Давайте рассмотрим модель RMM (Richardson Maturity Model) Леонарда Ричардсона.
После анализа нескольких сотен веб-сервисов [11] был предложен модель RMM для оценки качества, или как Ричардсон назвал это, зрелости веб-сервиса. Модель RMM состоит из 4 уровней. Если ваш сервис соответствует последнему уровню, то можно считать его RESTful. Ниже я приведу примеры и рисунки из [12], которые по словам автора были проверены Аароном Шварцем, Леонардом Ричардсоном и другими известными лицами. Все примеры основаны на следующей истории: Я хочу записаться на прием к врачу. От веб службы мне нужно получить свободные часы приема на конкретную дату и после записаться на прием. И так, рассмотрим все эти четыре уровня на данном примере.
Уровень 0: Один URI, один HTTP метод.
Здесь HTTP используется только для взаимодействия компонентов распределенной системы. Из методов используется только один, например POST. Как вы уже догадались, такими веб-сервисами являются протоколы XML-RPC и SOAP.
XML используется тут только для примера, в его месте мог был быть JSON, HTML и т.д. Веб-сервис имеет только один URL (относительный URL): /appointmentService. Запрашиваемая функция указывается в теле запроса.
Если ваш сервис соответствует уровню 0, то он еще ребенок.
Теперь рассмотрим этот же пример при работе с веб-сервисом с уровнем 1.
Уровень 1: Несколько URI, один HTTP метод.
Службы этого уровня используют понятие «разделяй и властвуй». В службе вводится понятие ресурсов и для действия с конкретным ресурсом используется URL этого ресурса.
И так, если вы хотите выполнить какое-то действие с доктором, то надо использовать относительный URL /doctors, а если ваше действие связано с посещением, то URL /slots. Если сравнить службу первого уровня со службой нулевого уровня, то в последнем случае есть только один ресурс, и этот ресурс сама веб служба.
Если ваш сервис соответствует уровню 1, то он является подростком.
Уровень 2: Несколько URI, каждый поддерживает разные HTTP методы (Правильное использование HTTP).
И так, на уровне 1 все методы веб службы были отделены с помощью ресурсов, но с ресурсом можно выполнить кучу действий. Чтобы эти действия тоже были как-то логически разделены, используется возможность HTTP отправлять и принимать операции с разними методами: GET, HEAD, POST, PUT, DELETE, TRACE, CONECT. Например, если метод является чтением, можно использовать GET, если для создания POST или PUT․ В принципе, можно и наоборот, но поскольку в HTTP эти методы имеют какие-то понятия и характеристики, лучше, чтобы эти понятия были те же, что и в веб службе, в противном случае вы можете получить кэшируемый метод создания ресурса. Другими словами, какой метод вы будете использовать для каких операций, уже вопрос правильного использования протокола HTTP․
Наверное, пришло время для примеров:
С вводом разных HTTP методов вводится также необходимость возвращения правильных HTTP статус кодов. Например, на запрос создания встречи, если она создана, то должен быть возвращен код 201. Если в течении ваших действий кто-то уже регистрировался на выбранный день и час, должен быть возвращен код 409 conflict и т.д. Опять же, тут дело в правильном использовании протокола HTTP․
Если ваш сервис соответствует уровню 2, то он является уже взрослым мужчиной.
Уровень 3: HATEOAS․ Ресурсы сами описывают свои возможности и взаимосвязи.
HATEOAS (Hypertext as the Engine of Application State), требование которое на мой взгляд обязательно для гипермедиа, но насколько это актуально для веб служб — не знаю. Все же, HATEOAS – это характеристика веб-сервиса возвращать действия в виде URL, которые могут быть выполнены с интересующим вам ресурсом.
Поскольку HATEOAS был уже рассмотрен выше, тут я приведу только примеры.
Каждый свободный час имеет URL, для выполнения действий над ним, в этом случае регистрация на этот час.
Преимуществом HATEOAS является то, что оно дает возможность разработчикам веб служб менять URI независимо от клиентов. Кроме этого, веб-сервис сам описывает себя без каких-либо WSDL. Чтобы правильно представить HATEOAS, представьте веб сайт из статических страниц. Вы открывайте главную страницу, а там уже ссылки на все остальное. Чтобы зайти на веб сайт и что-то найти там, нет необходимости прочитать какой-то документ по данному веб сайту, что-то вроде документа по API. Опять же, мое субъективное мнение по необходимости веб-сервиса поддерживать HATEOAS довольно пессимистично.
Если ваш сервис соответствует уровню 3, то его можно уже называть RESTful ну и конечно стариком с хорошим опытом.
Заключение
Если вы читаете эти строки значит либо прочитали всю статью и дошли до заключения, либо по причине недостатка во времени пролистали основную статью и читайте только заключение.
Поскольку второй случай более распространенный чем первый, приведу основные концепции: