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 ...
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:- 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.
- 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.
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:- Veb-xizmatimizning interfeysini tasvirlab bering
- Ushbu interfeysni amalga oshiring
- Veb-xizmatimizni ishga tushiring
- Mijoz yozing va kerakli veb-xizmat usuliga masofadan qo'ng'iroq qiling
main
va 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 yaratamizHelloWebService
:
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 WebService
va WebMethod
bizning interfeysimiz va uning usulini veb-xizmat sifatida belgilashdan boshqa hech narsa qilmaydi. Xuddi shu narsa sinfga ham tegishli SOAPBinding
. Yagona farq shundaki, SOAPBinding
bu parametrlarga ega annotatsiya. style
Bunday 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.endpoint
sinf yaratamiz : 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());
}
}
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 yaratamizru.javarush.client
va unda HelloWebServiceClient
usul 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.
GO TO FULL VERSION