JavaRush /Java blogi /Random-UZ /Veb-xizmatlar. 1-qadam. Veb-xizmat nima va u bilan qanday...
eGarmin
Daraja

Veb-xizmatlar. 1-qadam. Veb-xizmat nima va u bilan qanday ishlash kerak?

Guruhda nashr etilgan
Mavzu sarlavhasi haqiqatan ham savol, chunki... Men o'zim bu nima ekanligini bilmayman va birinchi marta ushbu maqola doirasida u bilan ishlashga harakat qilaman. Men kafolat bera oladigan yagona narsa shundaki, quyida keltirilgan kod ishlaydi, ammo mening iboralarim bularning barchasini o'zim qanday tushunganim haqidagi taxminlar va taxminlar bo'ladi. Xo'sh, ketaylik ... Veb-xizmatlar.  1-qadam. Veb-xizmat nima va u bilan qanday ishlash kerak?  - 1

Kirish

Biz veb-xizmatlar tushunchasi nima uchun yaratilganidan boshlashimiz kerak. Ushbu kontseptsiya dunyoda paydo bo'lgan vaqtga kelib, ilovalarning masofadan o'zaro ta'sirini ta'minlaydigan texnologiyalar allaqachon mavjud edi, bu erda bir dastur boshqa dasturda biron bir usulni chaqirishi mumkin, bu boshqa shaharda yoki hatto mamlakatda joylashgan kompyuterda ishga tushirilishi mumkin. Bularning barchasi RPC (Remote Procedure Calling) deb qisqartiriladi. Masalan, CORBA texnologiyalari va Java uchun - RMI (Remote Method Invoking). Va ularda hamma narsa yaxshi ko'rinadi, ayniqsa CORBAda, chunki ... Siz u bilan har qanday dasturlash tilida ishlashingiz mumkin, ammo nimadir etishmayotgan edi. Menimcha, CORBA ning kamchiligi shundaki, u har qanday xavfsizlik devoriga mos keladigan oddiy HTTP o'rniga o'zining ba'zi tarmoq protokollari orqali ishlaydi. Veb-xizmatning g'oyasi HTTP paketlariga kiritiladigan RPC yaratish edi. Shunday qilib, standartni ishlab chiqish boshlandi. Ushbu standartning asosiy tushunchalari qanday:
  1. Sovun . Masofaviy protsedurani chaqirishdan oldin, siz ushbu qo'ng'iroqni SOAP formatidagi XML faylida tasvirlashingiz kerak. SOAP veb-xizmatlarda qo'llaniladigan ko'plab XML belgilaridan biridir. Biz HTTP orqali biror joyga yubormoqchi bo'lgan hamma narsa avval XML SOAP tavsifiga aylantiriladi, so'ngra HTTP paketiga to'ldiriladi va TCP/IP orqali tarmoqdagi boshqa kompyuterga yuboriladi.
  2. WSDL . Veb-xizmat mavjud, ya'ni. usullarini masofadan chaqirish mumkin bo'lgan dastur. Ammo standart ushbu dasturga "ha, siz haqsiz - bu haqiqatan ham veb-xizmat va siz undan falon usullarni chaqirishingiz mumkin" degan tavsif bilan birga bo'lishini talab qiladi. Ushbu tavsif boshqa formatga ega bo'lgan boshqa XML fayli, ya'ni WSDL bilan ifodalanadi. Bular. WSDL shunchaki veb-xizmatni tavsiflovchi XML fayli va boshqa hech narsa emas.
Nega bunchalik qisqacha so'rayapsiz? Aniqroq gapira olmaysizmi? Ehtimol, bu mumkin, ammo buning uchun siz T. Mashnin, "Java Web Services" kabi kitoblarga murojaat qilishingiz kerak bo'ladi. U erda birinchi 200 sahifada SOAP va WSDL standartlarining har bir tegining batafsil tavsifi mavjud. Buni qilishga arziydimi? Menimcha, yo'q, chunki ... bularning barchasi Java-da avtomatik ravishda yaratiladi va siz faqat masofadan chaqirilishi kerak bo'lgan usullarning mazmunini yozishingiz kerak. Shunday qilib, Java-da JAX-RPC kabi API paydo bo'ldi. Agar kimdir bilmasa, Java-da falon API borligini aytishsa, bu ko'rib chiqilayotgan texnologiyani o'z ichiga olgan sinflar to'plamiga ega paket mavjudligini anglatadi. JAX-RPC vaqt o'tishi bilan versiyadan versiyaga rivojlandi va oxir-oqibat JAX-WS ga aylandi. WS, shubhasiz, WebService degan ma'noni anglatadi va siz bu RPC nomini hozirgi kunda mashhur so'z sifatida o'zgartirish deb o'ylashingiz mumkin. Bu haqiqat emas, chunki Endi veb-xizmatlar asl g'oyadan uzoqlashdi va sizga nafaqat masofaviy usullarga qo'ng'iroq qilish, balki SOAP formatida hujjat xabarlarini yuborish imkonini beradi. Bu nima uchun kerakligini hali bilmayman; bu erda javob "kerak bo'lganda" bo'lishi dargumon. Men o'zim ham tajribali o'rtoqlardan o'rganmoqchiman. Va nihoyat, keyin JAX-RS RESTful veb-xizmatlari uchun paydo bo'ldi, ammo bu alohida maqola mavzusi. Kirish shu yerda tugashi mumkin, chunki... Keyinchalik JAX-WS bilan ishlashni o'rganamiz.

Umumiy yondashuv

Veb-xizmatlarda har doim mijoz va server mavjud. Server bizning veb-xizmatimiz bo'lib, ba'zan so'nggi nuqta deb ataladi (masalan, mijozdan SOAP xabarlari yetib boradigan so'nggi nuqta). Biz quyidagilarni qilishimiz kerak:
  1. Veb-xizmatimizning interfeysini tasvirlab bering
  2. Ushbu interfeysni amalga oshiring
  3. Veb-xizmatimizni ishga tushiring
  4. Mijoz yozing va kerakli veb-xizmat usuliga masofadan qo'ng'iroq qiling
Siz veb-xizmatni turli yo'llar bilan ishga tushirishingiz mumkin: sinfni usul bilan tavsiflang mainva veb-xizmatni to'g'ridan-to'g'ri server sifatida ishga tushiring yoki uni Tomcat yoki boshqa har qanday serverga o'rnating. Ikkinchi holda, biz o'zimiz yangi serverni ishga tushirmaymiz va kompyuterda boshqa portni ochmaymiz, shunchaki Tomcat servlet konteyneriga aytamiz: "Biz bu erda veb-xizmat darslarini yozdik, iltimos, siz bilan bog'langan har bir kishi mumkin bo'lishi uchun ularni nashr qiling. bizning veb-xizmatimizdan foydalaning." Veb-xizmatni ishga tushirish usulidan qat'i nazar, bizda bir xil mijoz bo'ladi.

Server

Keling, IDEA ni ishga tushiramiz va yangi loyiha yaratamiz Yangi loyiha yaratish . HelloWebService nomini belgilang va Keyingi tugmasini , so'ngra Finish tugmasini bosing . Src papkasida biz paketni yaratamiz ru.javarush.ws . Ushbu paketda biz interfeys yaratamiz 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);
}
Ushbu kodda sinflar izohlar deb ataladi WebServiceva WebMethodbizning interfeysimiz va uning usulini veb-xizmat sifatida belgilashdan boshqa hech narsa qilmaydi. Xuddi shu narsa sinfga ham tegishli SOAPBinding. Yagona farq shundaki, SOAPBindingbu parametrlarga ega annotatsiya. styleBunday holda, veb-xizmat hujjat xabarlari orqali emas, balki klassik RPC sifatida ishlashini ko'rsatadigan qiymat bilan parametr ishlatiladi , ya'ni. usulni chaqirish. Keling, interfeys mantiqimizni amalga oshiramiz va paketimizda sinf yaratamiz HelloWebServiceImpl. Aytgancha, Impl bilan sinfni tugatish Java-dagi konventsiya bo'lib, unga ko'ra interfeyslarni amalga oshirish shunday belgilanadi (Impl - amalga oshirish so'zidan, ya'ni amalga oshirish). Bu shart emas va siz sinfga xohlagancha nom berishingiz mumkin, ammo yaxshi odob-axloq buni talab qiladi:
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 + "!";
    }
}
Keling, veb-xizmatimizni mustaqil server sifatida ishga tushiraylik, ya'ni. har qanday Tomcat va dastur serverlarining ishtirokisiz (bu alohida muhokama uchun mavzu). Buning uchun src papkasidagi loyiha strukturasida biz paket yaratamiz va unda metod bilan ru.javarush.endpointsinf yaratamiz : 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());
    }
}
Endi Shift+F10 tugmalarini bosib ushbu sinfni ishga tushiramiz . Konsolda hech narsa ko'rinmaydi, lekin server ishlamoqda. Buni brauzeringizda http://localhost:1986/wss/hello?wsdl qatorini kiritish orqali tekshirishingiz mumkin . Ochilgan sahifa, bir tomondan, bizning kompyuterimizda (localhost) 1986-portda ishlaydigan veb-server (http://) mavjudligini isbotlaydi va boshqa tomondan, veb-xizmatimizning WSDL tavsifini ko'rsatadi. Agar siz dasturni to'xtatsangiz, veb-xizmatning o'zi kabi tavsif mavjud bo'lmaydi, shuning uchun biz buni qilmaymiz, lekin mijozni yozishga o'tamiz.

Mijoz

Loyiha papkasida src biz paketni yaratamiz ru.javarush.clientva unda HelloWebServiceClientusul bilan sinf yaratamiz 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"));
    }
}
Men ro'yxatdagi kodga maksimal izoh berdim. Menda qo'shadigan hech narsa yo'q, shuning uchun ishga tushamiz (Shift + F10). Biz konsolda matnni ko'rishimiz kerak: Hello, JavaRush!Agar siz uni ko'rmagan bo'lsangiz, ehtimol siz veb-xizmatni ishga tushirishni unutgansiz.

Xulosa

Ushbu mavzu veb-xizmatlarga qisqacha ekskursiyani taqdim etdi. Yana bir bor aytamanki, men yozganlarimning ko'pchiligi bu qanday ishlashi haqida mening taxminlarimdir va shuning uchun menga juda ko'p ishonmasligingiz kerak. Agar bilimdonlar meni tuzatsa, men minnatdor bo'lardim, chunki o'shanda men nimanidir o'rganaman. UPD. Keling, suhbatni davom ettiramiz
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION