JavaRush /Java Blogu /Random-AZ /Veb xidmətləri. Addım 1. Veb xidməti nədir və onunla necə...
eGarmin
Səviyyə

Veb xidmətləri. Addım 1. Veb xidməti nədir və onunla necə işləmək olar?

Qrupda dərc edilmişdir
Mövzunun adı həqiqətən sualdır, çünki... Mən özüm bunun nə olduğunu bilmirəm və ilk dəfə bu məqalə çərçivəsində onunla işləməyə çalışacağam. Zəmanət verə biləcəyim yeganə şey, aşağıda təqdim olunan kodun işləyəcəyidir, lakin mənim ifadələrim yalnız bütün bunları necə başa düşdüyümlə bağlı fərziyyələr və təxminlər olacaq. Elə isə gedək... Veb xidmətləri.  Addım 1. Veb xidməti nədir və onunla necə işləmək olar?  - 1

Giriş

Veb xidmətləri konsepsiyasının niyə yaradıldığı ilə başlamalıyıq. Bu konsepsiya dünyada meydana çıxanda, tətbiqlərin məsafədən qarşılıqlı əlaqədə olmasına imkan verən texnologiyalar artıq mövcud idi, burada bir proqram başqa bir proqramda hansısa metodu çağıra bilər, onu başqa bir şəhərdə və hətta ölkədə yerləşən kompüterdə işə salmaq olar. Bütün bunlar RPC (Remote Procedure Calling) kimi qısaldılmışdır. Nümunələrə CORBA texnologiyaları və Java üçün - RMI (Remote Method Invoking) daxildir. Onlarda hər şey yaxşı görünür, xüsusən də CORBA-da, çünki... Onunla istənilən proqramlaşdırma dilində işləyə bilərsiniz, lakin hələ də bir şey çatışmırdı. İnanıram ki, CORBA-nın dezavantajı hər hansı bir firewall vasitəsilə uyğunlaşacaq sadə HTTP əvəzinə bəzi öz şəbəkə protokolları ilə işləməsidir. Veb xidmətinin ideyası HTTP paketlərinə daxil ediləcək RPC yaratmaq idi. Beləliklə, standartın inkişafı başladı. Bu standartın əsas anlayışları hansılardır:
  1. SABUN . Uzaqdan bir prosedura zəng etməzdən əvvəl bu çağırışı SOAP formatında XML faylında təsvir etməlisiniz. SOAP sadəcə veb xidmətlərində istifadə olunan bir çox XML işarələmələrindən biridir. HTTP vasitəsilə harasa göndərmək istədiyimiz hər şey əvvəlcə XML SOAP təsvirinə çevrilir, sonra HTTP paketinə doldurulur və TCP/IP vasitəsilə şəbəkədəki başqa kompüterə göndərilir.
  2. WSDL . Veb xidməti var, yəni. metodları uzaqdan çağırıla bilən proqram. Lakin standart tələb edir ki, bu proqram “bəli, siz haqlısınız – bu, həqiqətən bir veb xidmətidir və siz ondan filan metodları çağıra bilərsiniz” deyən təsvirlə müşayiət olunsun. Bu təsvir fərqli formata malik olan başqa bir XML faylı, yəni WSDL ilə təmsil olunur. Bunlar. WSDL sadəcə veb xidmətini təsvir edən XML faylıdır və başqa heç nə yoxdur.
Niyə belə qısaca soruşursunuz? Daha konkret ola bilməzsiniz? Bu, yəqin ki, mümkündür, lakin bunu etmək üçün T. Mashnin, “Java Web Services” kimi kitablara müraciət etməli olacaqsınız. Orada, ilk 200 səhifədə SOAP və WSDL standartlarının hər bir etiketinin ətraflı təsviri var. Etməyə dəyərmi? Məncə, yox, çünki... bütün bunlar Java-da avtomatik olaraq yaradılır və yalnız uzaqdan çağırılmalı olan metodların məzmununu yazmaq lazımdır. Beləliklə, Java-da JAX-RPC kimi bir API meydana çıxdı. Kimsə bilmirsə, Java-da belə və belə bir API olduğunu söylədikdə, bu, sözügedən texnologiyanı əhatə edən siniflər dəsti ilə bir paketin olduğunu göstərir. JAX-RPC zamanla versiyadan versiyaya inkişaf etdi və nəticədə JAX-WS oldu. WS açıq-aydın WebService mənasını verir və siz düşünə bilərsiniz ki, bu, sadəcə olaraq RPC-nin bu günlərdə məşhur söz kimi dəyişdirilməsidir. Bu doğru deyil, çünki İndi veb-servislər orijinal ideyadan uzaqlaşıb və sizə nəinki uzaq metodlara zəng etmək, həm də sadəcə olaraq SOAP formatında sənəd mesajları göndərmək imkanı verir. Bunun nə üçün lazım olduğunu hələ bilmirəm; burada cavabın “yalnız lazım olduğu halda” olacağı ehtimalı azdır. Mən özüm daha təcrübəli yoldaşlardan öyrənmək istərdim. Və nəhayət, JAX-RS sözdə RESTful veb xidmətləri üçün ortaya çıxdı, lakin bu ayrıca məqalənin mövzusudur. Giriş burada bitə bilər, çünki... Sonra JAX-WS ilə işləməyi öyrənəcəyik.

Ümumi yanaşma

Veb xidmətlərində həmişə bir müştəri və bir server var. Server bizim veb xidmətimizdir və bəzən son nöqtə adlanır (məsələn, müştəridən gələn SOAP mesajlarının çatdığı son nöqtə). Biz aşağıdakıları etməliyik:
  1. Veb xidmətimizin interfeysini təsvir edin
  2. Bu interfeysi həyata keçirin
  3. Veb xidmətimizi işə salın
  4. Müştəri yazın və istədiyiniz veb xidməti metoduna uzaqdan zəng edin
Siz müxtəlif yollarla veb xidmətini işə sala bilərsiniz: ya metodu olan bir sinfi təsvir edin mainvə veb xidmətini birbaşa server kimi işə salın, ya da Tomcat və ya başqa bir serverə yerləşdirin. İkinci halda, biz özümüz yeni server işə salmırıq və kompüterdə başqa port açmırıq, sadəcə olaraq Tomcat servlet konteynerinə deyirik ki, “biz burada veb xidmət dərsləri yazmışıq, zəhmət olmasa onları dərc edin ki, sizinlə əlaqə saxlayan hər kəs veb xidmətimizdən istifadə edin." Veb xidmətin işə salınma üsulundan asılı olmayaraq, bizim eyni müştərimiz olacaq.

Server

Gəlin IDEA-nı işə salaq və yeni layihə yaradaq Yeni Layihə Yarat . HelloWebService adını göstərin və Next düyməsini , sonra Finish düyməsini basın . Src qovluğunda biz paket yaradacağıq ru.javarush.ws . Bu paketdə biz interfeys yaradacağıq 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);
}
Bu kodda siniflər annotasiya adlanır WebServiceWebMethodinterfeysimizi və onun metodunu veb xidməti kimi qeyd etməkdən başqa heç nə etmir. Eyni şey sinifə də aiddir SOAPBinding. Yeganə fərq odur ki, SOAPBindingo, parametrləri olan annotasiyadır. Bu halda, styleveb xidmətin sənəd mesajları vasitəsilə deyil, klassik RPC kimi işləyəcəyini göstərən dəyərlə parametr istifadə olunur, yəni. metodu çağırmaq. İnterfeys məntiqimizi tətbiq edək və paketimizdə bir sinif yaradaq HelloWebServiceImpl. Yeri gəlmişkən, qeyd edirəm ki, Impl ilə sinfi bitirmək Java-da bir konvensiyadır, ona görə interfeyslərin həyata keçirilməsi belə təyin olunur (Impl - həyata keçirmək sözündən, yəni həyata keçirmək). Bu tələb deyil və siz sinfi istədiyiniz kimi adlandırmaqda sərbəstsiniz, lakin yaxşı davranış bunu tələb edir:
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 + "!";
    }
}
Gəlin veb xidmətimizi müstəqil server kimi işə salaq, yəni. heç bir Tomcat və proqram serverlərinin iştirakı olmadan (bu ayrıca müzakirə mövzusudur). Bunun üçün src qovluğunda olan layihə strukturunda paket yaradacağıq və orada metodla ru.javarush.endpointsinif yaradacağıq : 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());
    }
}
İndi Shift+F10 düymələrini basaraq bu sinfi işə salaq . Konsolda heç nə görünməyəcək, lakin server işləyir. Bunu brauzerinizdə http://localhost:1986/wss/hello?wsdl sətrini yazmaqla yoxlaya bilərsiniz . Açılan səhifə, bir tərəfdən kompüterimizdə (localhost) 1986-cı portda işləyən veb serverimizin (http://) olduğunu sübut edir, digər tərəfdən isə veb xidmətimizin WSDL təsvirini göstərir. Tətbiqi dayandırsanız, təsvir, veb xidmətin özü kimi əlçatmaz olacaq, buna görə də biz bunu etməyəcəyik, lakin müştərini yazmağa davam edəcəyik.

Müştəri

Layihə qovluğunda src paketi yaradacağıq ru.javarush.clientvə onun içərisində HelloWebServiceClientmetodu olan bir sinif yaradacağıq 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"));
    }
}
Siyahıdakı kodla bağlı maksimum şərh verdim. Əlavə edəcəyim heç nə yoxdur, ona görə də işə başlayaq (Shift+F10). Konsolda mətni görməliyik: Hello, JavaRush!Əgər onu görməmisinizsə, o zaman, yəqin ki, veb xidmətini işə salmağı unutmusunuz.

Nəticə

Bu mövzu veb xidmətlərə qısa ekskursiya təqdim etdi. Bir daha deyim ki, yazdıqlarımın çoxu onun necə işlədiyinə dair təxminlərimdir və buna görə də mənə çox güvənməməlisiniz. Bilikli insanlar məni islah etsə, minnətdar olaram, çünki o zaman nəsə öyrənərəm. UPD. Söhbətə davam edək
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION