JavaRush /Java блогу /Random-KY /Веб кызматтары. Кадам 1. Веб сервис деген эмне жана аны м...
eGarmin
Деңгээл

Веб кызматтары. Кадам 1. Веб сервис деген эмне жана аны менен кантип иштөө керек?

Группада жарыяланган
Теманын аталышы чындап эле суроо, анткени... Мен өзүм бул эмне экенин билбейм жана биринчи жолу ушул макаланын алкагында аны менен иштөөгө аракет кылам. Мен кепилдик бере ала турган бир гана нерсе, төмөндө келтирилген code иштейт, бирок менин сөз айкаштарым мен мунун баарын кантип түшүнөм деген божомолдор жана божомолдор гана болот. Ошентип, кетели... Веб кызматтары.  Кадам 1. Веб сервис деген эмне жана аны менен кантип иштөө керек?  - 1

Киришүү

Биз веб-кызмат концепциясы эмне үчүн түзүлгөндөн башташыбыз керек. Бул концепция дүйнөдө пайда болгон учурда, тиркемелерди аралыкта өз ара аракеттенүүгө мүмкүндүк берген технологиялар бар болчу, мында бир программа башка программада кандайдыр бир ыкманы чакыра алат, ал башка шаарда же ал тургай өлкөдө жайгашкан компьютерде ишке киргизorши мүмкүн. Мунун баары RPC (Remote Procedure Calling) деп кыскартылган. Мисалдар CORBA технологияларын камтыйт, жана Java үчүн - RMI (Remote Method Invoking). Жана аларда баары жакшы окшойт, айрыкча CORBA, анткени... Аны менен каалаган программалоо тorнде иштей аласыз, бирок дагы эле бир нерсе жок болчу. Мен CORBAнын кемчorги бул жөнөкөй HTTP эмес, өзүнүн айрым тармактык протоколдору аркылуу иштеши деп эсептейм, ал каалаган брандмауэр аркылуу туура келет. Желе кызматынын идеясы HTTP пакеттерине киргизиле турган RPC түзүү болгон. Ошентип стандартты иштеп чыгуу башталды. Бул стандарттын негизги түшүнүктөрү кайсылар:
  1. САМЫН . Алыскы proceduresаны чакыруудан мурун, сиз бул чалууну SOAP форматындагы XML файлында сүрөттөшүңүз керек. SOAP жөн гана желе кызматтарында колдонулган көптөгөн XML белгилөөлөрдүн бири. HTTP аркылуу кайсы бир жерге жөнөткүбүз келген нерселердин баары алгач XML SOAP сүрөттөмөсүнө айландырылат, андан кийин HTTP пакетине толтурулат жана TCP/IP аркылуу тармактагы башка компьютерге жөнөтүлөт.
  2. WSDL . Интернет кызматы бар, б.а. методдорун алыстан чакыра турган программа. Бирок стандарт бул программага "ооба, сиз туура айтасыз - бул чындап эле веб-сервис жана сиз андан тигил же бул ыкмаларды чакырсаңыз болот" деген сыпаттама менен коштолушун талап кылат. Бул сүрөттөмө башка форматка ээ башка XML файлы менен берилген, атап айтканда WSDL. Ошол. WSDL бул жөн гана желе кызматын сүрөттөгөн XML файлы жана башка эч нерсе эмес.
Эмнеге мынча кыска сурайсың? Такыраак айта албайсызбы? Мүмкүн болсо керек, бирок бул үчүн Т. Машнин, «Java Web Services» сыяктуу китептерге кайрылууга туура келет. Ал жерде, биринчи 200 беттеринде, SOAP жана WSDL стандарттарынын ар бир тегинин толук сүрөттөлүшү бар. Бул кылууга татыктуубу? Менин оюмча, жок, анткени... Мунун баары Java-да автоматтык түрдө түзүлөт жана сиз алыстан чакырылышы керек болгон ыкмалардын мазмунун гана жазышыңыз керек. Ошентип, Java-да JAX-RPC сыяктуу API пайда болду. Эгер кимдир бирөө билбесе, алар Java-да мындай жана мындай API бар деп айтышса, бул сөз болуп жаткан технологияны камтыган класстар топтому бар пакет бар экенин билдирет. JAX-RPC убакыттын өтүшү менен versionдан versionга өзгөрүп, акыры JAX-WS болуп калды. WS, албетте, WebService дегенди билдирет жана сиз бул RPCтин атын ушул күндөрү популярдуу сөз катары өзгөртүү деп ойлошуңуз мүмкүн. Бул туура эмес, анткени Азыр веб-кызматтар баштапкы идеядан алыстап, алыскы ыкмаларды чакырууга гана эмес, ошондой эле SOAP форматында document билдирүүлөрүн жөнөтүүгө мүмкүнчүлүк берет. Бул эмне үчүн керек экенин мен азырынча билбейм; бул жерде жооп "керек болгондо эле" болушу күмөн. Мен өзүм дагы тажрыйбалуу жолдоштордон үйрөнгүм келет. Акырында, JAX-RS RESTful веб-кызматтары үчүн пайда болду, бирок бул өзүнчө макаланын темасы. Киришүү ушул жерден бүтүшү мүмкүн, анткени... Кийинки биз JAX-WS менен иштөөнү үйрөнөбүз.

Жалпы мамиле

Веб кызматтарда дайыма кардар жана server болот. Сервер биздин веб-кызматыбыз жана кээде акыркы чекит деп аталат (мисалы, кардардан келген SOAP билдирүүлөрү жеткен акыркы чекит). Биз төмөнкүлөрдү кылышыбыз керек:
  1. Биздин веб-кызматтын интерфейсин сүрөттөп бериңиз
  2. Бул интерфейсти ишке ашыруу
  3. Биздин веб-кызматты ишке киргизиңиз
  4. Кардар жазып, каалаган веб-кызмат ыкмасына алыстан чалыңыз
Сиз веб-кызматты ар кандай жолдор менен ишке киргизсеңиз болот: классты метод менен сүрөттөп 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класс түзөбүз : HelloWebServicePublishermain
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!Эгер сиз аны көргөн жоксуз, анда сиз веб-кызматты баштоону унутуп калгансыз.

Корутунду

Бул тема веб-кызматтарга кыскача экскурсия берди. Дагы бир жолу айта кетейин, мен жазгандарымдын көбү анын кандай иштээри тууралуу менин божомолум, андыктан мага көп ишенбешиңиз керек. Илимдүү адамдар мени оңдоп коюшса ыраазы болмокмун, анткени ошондо бир нерсе үйрөнөм. UPD. Маекти уланталы
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION