SOAP - Simple Object ACCESS PROTOCOL
- SOAP – это целое семейство протоколов и стандартов, откуда напрямую вытекает, что это более тяжеловесный и сложный вариант с точки зрения машинной обработки. Поэтому REST работает быстрее.
- SOAP используют HTTP как транспортный протокол, в то время как REST базируется на нем. Это означает, что все существующие наработки на базе протокола HTTP, такие как кеширование на уровне сервера, масштабирование, продолжают так же работать в REST архитектуре, а для SOAP необходимо искать другие средства.
- Есть мнение, что разработка RESTful сервисов намного проще. Наверное, это правда, если использовать Notepad в качестве основной среды разработки, но вот с использованием наших чудесных средств разработки, я позволю себе усомниться в верности этого утверждения.
- В первом гугловском результате по запросу «REST vs SOAP» акцентируется внимание на том, что ответ REST может быть представлен в различных форматах, а SOAP привязан к XML. Это действительно важный фактор, достаточно представить себе вызов сервиса из javascript, ответ на который мы определенно хотим получать в JSON.
- «REST vs SOAP» можно перефразировать в «Простота vs Стандарты», что проявляется в том, что для SOAP мы имеем протокол WSDL для исчерпывающего описания веб-сервиса, который с использованием все тех же чудесных средств разработки прото-таки волшебным образом делает почти всю работу за нас. Со стороны REST мы имеем загадочный и неиспользуемый протокол WADL, который, в принципе, и не нужен – он мешает простоте.
- Второй аспект предыдущего пункта – обработка ошибок. В SOAP она полностью стандартизована, а REST может использовать давно известные коды ошибок HTTP (если здесь Вас посетила мысль, что это же очевидно и зачем я это пишу, то значит Вы внимательно читаете статью).
- То, с чего можно было бы начать, но я припас напоследок. Это одна из ключевых мыслей. SOAP работает с операциями, а REST – с ресурсами. Этот факт в совокупности с отсутствием клиентского состояния у RESTful сервисов приводит нас к тому, что такие вещи как транзакции или другая сложная логика должна реализовываться «SOAP-но».
Веб-сервис(endpoint) — содержит всю логику с которой вы будете работать, именно через него активируются запросы в базу данных, обработка данных и т.д.
Паблишер(publisher) — сервис который загружает веб-сервис в сеть для общего к нему доступа.
Клиент(client) — сервис который обращается к веб-сервису для получения того или иного результата.
Паблишер(publisher) — сервис который загружает веб-сервис в сеть для общего к нему доступа.
Клиент(client) — сервис который обращается к веб-сервису для получения того или иного результата.
Пишем наш веб-сервис.
Для начала нам надо сделать интерфейс который описывает скелет будущей функциональности веб-сервиса:
Для начала нам надо сделать интерфейс который описывает скелет будущей функциональности веб-сервиса:
1
2
3
4
5
6
7
8
9
10
11
12
13
| package dev.bay.ws; import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; @WebService @SOAPBinding (style = SOAPBinding.Style.DOCUMENT) public interface SayHello { @WebMethod String hi(); } |
Как вы можете видеть, это интерфейс похож на сотни других, веб-сервисом его делают аннотации, которые мы к нему дописали. Основной аннотацией является @WebService, именно указывает что интерфейс на который мы смотрим является веб-сервисом. Аннотация @SoapBinding служит для определения к какому стилю принадлежит веб-сервис и как он отображается в wsdl файл. Style=Document/Use=Literal является стандартными параметрами и когда вы будете писать свои собственные веб-сервисы и вас будут удовлетворять стандартные установки, вам не надо будет это прописывать. Аннотация @WebMethod служит для корректного отображения метода в wsdl(xml-подобные формат в в который отображаются веб-сервисы) файле. @WebMethod содержит такие аргументы: perationName — отвечает за имя операции, action — этот атрибут отвечает за значения поля soapAction (стандартным значением этого атрибута является пустая строка), exclude — определяет должен ли метод отображаться в wsdl файле или нет.
Теперь пилим реализацию нашего веб-сервиса.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| package dev.bay.ws; import javax.jws.WebService; @WebService (endpointInterface = "dev.bay.ws.SayHello" ) public class SayHelloImpl implements SayHello{ @Override public String hi() { return "Hey there, sweety!" ; } @Override public void printOut() { System.out.println( "Is that what you wanted to see?" ); } } |
Демон — он в деталях, обратите внимание на уже знакомую аннотацию @WebService, но смысл ее кардинально иной за счет атрибута endpointInterface = «dev.bay.ws.SayHello», этот атрибут говорит нам, что этой реализации отвечает имеет этот веб-сервис.
Согласно нашей небольшой диаграмме представленной в начале статьи, мы уже знаем, что после того как мы заполучили сервис, нам надо его запустить для общего доступа в сеть иначе смысла в нем немного. Для этого нам нужен паблишер.
1
2
3
4
5
6
7
8
9
10
11
12
13
| package dev.bay.ws.publisher; import dev.bay.ws.SayHelloImpl; import dev.bay.ws.SayRPCImpl; import javax.xml.ws.Endpoint; public class Publisher { public static void main(String[] args) { } } |
Вас может удивить простота приведенного выше кода, но не обольщайтесь, это самая примитивная реализация и обычно функцию паблишинга берет на себя сервлет контейнер. http://localhost:9999/ws/hello — это url на который будет запаблишен наш веб-сервис (мы его прописываем сами).
После того как вы запаблишили наш веб-сервис нам надо к нему как-то стучаться, для этого пишем клиент.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| package dev.bay.ws.client; import dev.bay.ws.SayHello; import javax.xml.namespace.QName; import javax.xml.ws.Service; import java.net.MalformedURLException; import java.net.URL; public class Client { public static void main(String[] args) throws MalformedURLException { Service service = Service.create(url,name); SayHello sayHello = service.getPort(SayHello. class ); System.out.println(sayHello.hi()); } } |
Первостепенная задача клиента — это достучаться до веб-сервиса. Поскольку наш веб-сервис уже имеет адресс в сети(http://localhost:9999/ws/hello) мы его и прописываем. Первая непонятная деталь состоит в приписке к нашему url адресу: ?wsdl. Не поленитесь и зайдите по этому адресу, то что вы увидите и есть наш wsdl файл который является точным отображением нашего веб-сервиса в xml-формате. Дальше идет QName, откуда мы берем значение для него? Ответ мы найдем в wsdl файле который мы только что просматривали. Обратите внимание на атрибуты targetNamespace=»http://ws.bay.dev/»и на соседний с ним атрибут name=»SayHelloImplService».
И так, алгоритм запуска приложения:
1) Запускаем паблишер;
2) Запускаем клиент.
При удачном исходе, в консоле клиента мы должны получить следующее: «Hey there, sweety!».
Все, успех!;)
1) Запускаем паблишер;
2) Запускаем клиент.
При удачном исходе, в консоле клиента мы должны получить следующее: «Hey there, sweety!».
Все, успех!;)
Комментариев нет:
Отправить комментарий