Пишем наш веб-сервис.
Для начала нам надо сделать интерфейс который описывает скелет будущей функциональности веб-сервиса:
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!».
Все, успех!;)