Теманын аталышы чындап эле суроо, анткени... Мен өзүм бул эмне экенин билбейм жана биринчи жолу ушул макаланын алкагында аны менен иштөөгө аракет кылам. Мен кепилдик бере ала турган бир гана нерсе, төмөндө келтирилген code иштейт, бирок менин сөз айкаштарым мен мунун баарын кантип түшүнөм деген божомолдор жана божомолдор гана болот. Ошентип, кетели...
Киришүү
Биз веб-кызмат концепциясы эмне үчүн түзүлгөндөн башташыбыз керек. Бул концепция дүйнөдө пайда болгон учурда, тиркемелерди аралыкта өз ара аракеттенүүгө мүмкүндүк берген технологиялар бар болчу, мында бир программа башка программада кандайдыр бир ыкманы чакыра алат, ал башка шаарда же ал тургай өлкөдө жайгашкан компьютерде ишке киргизorши мүмкүн. Мунун баары RPC (Remote Procedure Calling) деп кыскартылган. Мисалдар CORBA технологияларын камтыйт, жана Java үчүн - RMI (Remote Method Invoking). Жана аларда баары жакшы окшойт, айрыкча CORBA, анткени... Аны менен каалаган программалоо тorнде иштей аласыз, бирок дагы эле бир нерсе жок болчу. Мен CORBAнын кемчorги бул жөнөкөй HTTP эмес, өзүнүн айрым тармактык протоколдору аркылуу иштеши деп эсептейм, ал каалаган брандмауэр аркылуу туура келет. Желе кызматынын идеясы HTTP пакеттерине киргизиле турган RPC түзүү болгон. Ошентип стандартты иштеп чыгуу башталды. Бул стандарттын негизги түшүнүктөрү кайсылар:- САМЫН . Алыскы proceduresаны чакыруудан мурун, сиз бул чалууну SOAP форматындагы XML файлында сүрөттөшүңүз керек. SOAP жөн гана желе кызматтарында колдонулган көптөгөн XML белгилөөлөрдүн бири. HTTP аркылуу кайсы бир жерге жөнөткүбүз келген нерселердин баары алгач XML SOAP сүрөттөмөсүнө айландырылат, андан кийин HTTP пакетине толтурулат жана TCP/IP аркылуу тармактагы башка компьютерге жөнөтүлөт.
- WSDL . Интернет кызматы бар, б.а. методдорун алыстан чакыра турган программа. Бирок стандарт бул программага "ооба, сиз туура айтасыз - бул чындап эле веб-сервис жана сиз андан тигил же бул ыкмаларды чакырсаңыз болот" деген сыпаттама менен коштолушун талап кылат. Бул сүрөттөмө башка форматка ээ башка XML файлы менен берилген, атап айтканда WSDL. Ошол. WSDL бул жөн гана желе кызматын сүрөттөгөн XML файлы жана башка эч нерсе эмес.
Жалпы мамиле
Веб кызматтарда дайыма кардар жана server болот. Сервер биздин веб-кызматыбыз жана кээде акыркы чекит деп аталат (мисалы, кардардан келген SOAP билдирүүлөрү жеткен акыркы чекит). Биз төмөнкүлөрдү кылышыбыз керек:- Биздин веб-кызматтын интерфейсин сүрөттөп бериңиз
- Бул интерфейсти ишке ашыруу
- Биздин веб-кызматты ишке киргизиңиз
- Кардар жазып, каалаган веб-кызмат ыкмасына алыстан чалыңыз
main
, веб-кызматты түздөн-түз server катары ишке киргизиңиз, же аны Tomcat же башка serverге жайгаштырыңыз. Экинчи учурда, биз өзүбүз жаңы serverди ишке киргизбейбиз жана компьютерде башка портту ачпайбыз, бирок жөн гана Tomcat сервлет контейнерине "биз бул жерде веб-сервис класстарын жаздык, аларды сиз менен байланышкандардын бардыгына жарыялоо үчүн жарыялаңыз" деп айтабыз. биздин веб-кызматты колдонуңуз." Веб-кызматты ишке киргизүү ыкмасына карабастан, бизде бир эле кардар болот.
Server
Келгиле, IDEA ишке киргизип, жаңы долбоорду түзөлү Жаңы долбоор түзүү . HelloWebService атын көрсөтүңүз жана Кийинки баскычын , андан кийин Аяктоо баскычын басыңыз . src папкасында биз пакетти түзөбүз ru.javarush.ws . Бул пакетте биз интерфейсти түзөбүзHelloWebService
:
package ru.javarush.ws;
// это аннотации, т.е. способ отметить наши классы и методы,
// How связанные с веб-сервисной технологией
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
// говорим, что наш интерфейс будет работать How веб-сервис
@WebService
// говорим, что веб-сервис будет использоваться для вызова методов
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface HelloWebService {
// говорим, что этот метод можно вызывать удаленно
@WebMethod
public String getHelloString(String name);
}
Бул codeдо класстар annotationлар деп аталат WebService
жана WebMethod
биздин интерфейсти жана анын методун веб-кызмат катары белгилөөдөн башка эч нерсе жасаbyte. Ошол эле класска тиешелүү SOAPBinding
. Бир гана айырмасы - SOAPBinding
бул параметрлери бар annotation. style
Бул учурда, веб-кызмат documentтик билдирүүлөр аркылуу эмес, классикалык RPC катары иштей турганын көрсөткөн мааниге ээ параметр колдонулат , б.а. ыкмасын чакыруу. Интерфейс логикабызды ишке ашыралы жана пакетибизде класс түзөлү HelloWebServiceImpl
. Айтмакчы, классты Impl менен аяктоо Java тorндеги конвенция экенин белгилеймин, ага ылайык интерфейстердин ишке ашырылышы ушундайча белгиленген (Impl – ишке ашыруу деген сөздөн, б.а. ишке ашыруу). Бул талап эмес жана классты каалагандай атай аласыз, бирок адептүүлүк муну талап кылат:
package ru.javarush.ws;
// таже annotation, что и при описании интерфейса,
import javax.jws.WebService;
// но здесь используется с параметром endpointInterface,
// указывающим полное Name класса интерфейса нашего веб-сервиса
@WebService(endpointInterface = "ru.javarush.ws.HelloWebService")
public class HelloWebServiceImpl implements HelloWebService {
@Override
public String getHelloString(String name) {
// просто возвращаем приветствие
return "Hello, " + name + "!";
}
}
Биздин веб-сервисти көз карандысыз server катары ишке киргизели, б.а. эч кандай Tomcat жана тиркеме serverлеринин катышуусуз (бул өзүнчө талкуу үчүн тема). Бул үчүн, src папкасындагы долбоордун структурасында пакетти түзөбүз жана анда метод менен ru.javarush.endpoint
класс түзөбүз : HelloWebServicePublisher
main
package ru.javarush.endpoint;
// класс, для запуска веб-serverа с веб-сервисами
import javax.xml.ws.Endpoint;
// класс нашего веб-сервиса
import ru.javarush.ws.HelloWebServiceImpl;
public class HelloWebServicePublisher {
public static void main(String... args) {
// запускаем веб-server на порту 1986
// и по addressу, указанному в первом аргументе,
// запускаем веб-сервис, передаваемый во втором аргументе
Endpoint.publish("http://localhost:1986/wss/hello", new HelloWebServiceImpl());
}
}
Эми Shift+F10 баскычтарын басып, бул классты иштетели . Консолдо эч нерсе көрүнбөйт, бирок server иштеп жатат. Муну браузериңизге http://localhost:1986/wss/hello?wsdl линиясын терүү менен текшерсеңиз болот . Ачылган барак, бир жагынан, биздин компьютерде (localhost) 1986 портунда иштеген веб-server (http://) бар экенин далилдейт, экинчи жагынан, веб-кызматынын WSDL сүрөттөмөсүн көрсөтөт. Эгер сиз тиркемени токтотсоңуз, сүрөттөмө же веб-кызматтын өзү сыяктуу эле жеткorксиз болуп калат, андыктан биз муну кылбайбыз, бирок кардарды жазууга өтөбүз.
Кардар
Долбоордун папкасында srcru.javarush.client
биз пакетти жана анда HelloWebServiceClient
методу бар классты түзөбүз main
:
package ru.javarush.client;
// нужно, чтобы получить wsdl описание и через него
// дотянуться до самого веб-сервиса
import java.net.URL;
// такой эксепшн возникнет при работе с an objectом URL
import java.net.MalformedURLException;
// классы, чтобы пропарсить xml-ку c wsdl описанием
// и дотянуться до тега service в нем
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
// интерфейс нашего веб-сервиса (нам больше и нужно)
import ru.javarush.ws.HelloWebService;
public class HelloWebServiceClient {
public static void main(String[] args) throws MalformedURLException {
// создаем ссылку на wsdl описание
URL url = new URL("http://localhost:1986/wss/hello?wsdl");
// Параметры следующего конструктора смотрим в самом первом теге WSDL описания - definitions
// 1-ый аргумент смотрим в атрибуте targetNamespace
// 2-ой аргумент смотрим в атрибуте name
QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");
// Теперь мы можем дотянуться до тега service в wsdl описании,
Service service = Service.create(url, qname);
// а далее и до вложенного в него тега port, чтобы
// получить ссылку на удаленный от нас an object веб-сервиса
HelloWebService hello = service.getPort(HelloWebService.class);
// Ура! Теперь можно вызывать удаленный метод
System.out.println(hello.getHelloString("JavaRush"));
}
}
Мен тизмедеги code боюнча максималдуу комментарий бердим. Менде эч нерсе жок, андыктан чуркайлы (Shift+F10). Биз консолдо текстти көрүшүбүз керек: Hello, JavaRush!
Эгер сиз аны көргөн жоксуз, анда сиз веб-кызматты баштоону унутуп калгансыз.
GO TO FULL VERSION