JavaRush /Java блогы /Random-KK /Веб қызметтері. Қадам 1. Веб-сервис дегеніміз не және оны...
eGarmin
Деңгей

Веб қызметтері. Қадам 1. Веб-сервис дегеніміз не және онымен қалай жұмыс істеу керек?

Топта жарияланған
Тақырып тақырыбы шынымен сұрақ, өйткені... Мен мұның не екенін білмеймін және бірінші рет осы мақаланың аясында онымен жұмыс істеуге тырысамын. Мен кепілдік бере алатын жалғыз нәрсе - төменде келтірілген code жұмыс істейді, бірақ менің сөз тіркестерім мұның бәрін қалай түсінетінім туралы болжамдар мен болжамдар ғана болады. Ендеше, кеттік... Веб қызметтері.  Қадам 1. Веб-сервис дегеніміз не және онымен қалай жұмыс істеу керек?  - 1

Кіріспе

Біз веб-қызметтердің тұжырымдамасы неліктен құрылғанынан бастауымыз керек. Бұл тұжырымдама әлемде пайда болған кезде, қолданбалардың қашықтықта әрекеттесуге мүмкіндік беретін технологиялар бұрыннан бар еді, мұнда бір бағдарлама басқа бағдарламада қандай да бір әдісті шақыра алады, оны басқа қалада немесе тіпті елде орналасқан компьютерде іске қосуға болады. Мұның бәрі RPC (Remote Procedure Calling) деп қысқартылған. Мысалдарға CORBA технологиялары және Java үшін - RMI (Remote Method Invoking) жатады. Оларда бәрі жақсы сияқты, әсіресе КОРБА-да, өйткені... Сіз онымен кез келген бағдарламалау тілінде жұмыс істей аласыз, бірақ әлі де бірдеңе жетіспеді. Менің ойымша, CORBA кемшілігі оның кез келген брандмауэр арқылы өтетін қарапайым 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 уақыт өте нұсқадан нұсқаға дамып, ақырында JAX-WS болды. WS анық WebService дегенді білдіреді және сіз бұл жай ғана RPC атауын қазіргі кезде танымал танымал сөз ретінде өзгерту деп ойлауыңыз мүмкін. Бұл дұрыс емес, өйткені Енді веб-қызметтері бастапқы идеядан алыстап, қашықтағы әдістерді шақыруға ғана емес, сонымен қатар SOAP пішімінде құжат хабарламаларын жіберуге мүмкіндік береді. Бұл не үшін қажет екенін әлі білмеймін; бұл жерде жауап «қажет болған жағдайда» болуы екіталай. Мен өзім тәжірибелі жолдастардан үйренгім келеді. Соңында, JAX-RS RESTful веб-қызметтері үшін пайда болды, бірақ бұл бөлек мақаланың тақырыбы. Кіріспе осы жерде аяқталуы мүмкін, өйткені... Әрі қарай JAX-WS-пен жұмыс істеуді үйренеміз.

Жалпы көзқарас

Веб-қызметтерде әрқашан клиент пен server болады. Сервер біздің веб-қызметіміз болып табылады және кейде соңғы нүкте деп аталады (мысалы, клиенттен SOAP хабарламалары жететін соңғы нүкте). Бізге келесі әрекеттерді орындау керек:
  1. Біздің веб-қызметіміздің интерфейсін сипаттаңыз
  2. Бұл интерфейсті іске асырыңыз
  3. Біздің веб-қызметімізді іске қосыңыз
  4. Клиентті жазыңыз және қалаған веб-қызмет әдісіне қашықтан қоңырау шалыңыз
Веб-қызметті әртүрлі жолдармен іске қосуға болады: әдіспен сыныпты сипаттаңыз mainжәне веб-қызметті тікелей server ретінде іске қосыңыз немесе оны Tomcat немесе кез келген басқа serverге орналастырыңыз. Екінші жағдайда, біз өзіміз жаңа serverді іске қоспаймыз және компьютерде басқа портты ашпаймыз, бірақ жай ғана Tomcat сервлет контейнеріне «біз осында веб-сервис сабақтарын жаздық, оларды сізбен байланысатын барлық адамдар жасай алатындай етіп жариялаңыз. біздің веб-қызметімізді пайдаланыңыз». Веб-қызметті іске қосу әдісіне қарамастан, бізде бірдей клиент болады.

Сервер

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біздің интерфейс пен оның әдісін веб-қызмет ретінде белгілеуден басқа ештеңе жасамайды. Бұл сыныпқа да қатысты SOAPBinding. Жалғыз айырмашылығы - бұл SOAPBindingпараметрлері бар annotation. styleБұл жағдайда веб-қызмет құжат хабарламалары арқылы емес, классикалық RPC ретінде жұмыс істейтінін көрсететін мәнмен параметр пайдаланылады , яғни. әдісті шақыру. Интерфейс логикасын жүзеге асырып, пакетімізде класс жасайық HelloWebServiceImpl. Айтпақшы, сыныпты Impl-пен аяқтау Java тіліндегі конвенция екенін ескертемін, оған сәйкес интерфейстерді іске асыру осылай белгіленеді (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 сипаттамасын көрсетеді. Қолданбаны тоқтатсаңыз, веб-қызметтің өзі сияқты сипаттама қолжетімсіз болады, сондықтан біз мұны жасамаймыз, бірақ клиентті жазуға көшеміз.

Клиент

Жоба қалтасында src біз буманы , ал оның ішінде әдісі бар ru.javarush.clientкласс жасаймыз : HelloWebServiceClientmain
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