Сарлавҳаи мавзӯъ воқеан савол аст, зеро... Ман худам намедонам, ки ин чист ва бори аввал ман кӯшиш мекунам, ки дар доираи ин мақола бо он кор кунам. Ягона чизе, ки ман кафолат дода метавонам, ин аст, ки рамзи дар зер овардашуда кор хоҳад кард, аммо ибораҳои ман танҳо тахминҳо ва тахминҳо хоҳанд буд, ки ман худам ин ҳамаро чӣ гуна мефаҳмам. Пас, биёед...
Муқаддима
Мо бояд аз он оғоз кунем, ки чаро мафҳуми хидматҳои веб сохта шудааст. То замоне, ки ин консепсия дар ҷаҳон пайдо шуд, технологияҳое вуҷуд доштанд, ки имкон медоданд, ки замимаҳо дар масофаи дур амал кунанд, ки дар он як барнома метавонист ягон усулро дар барномаи дигар даъват кунад, ки онро дар компютери воқеъ дар дигар шаҳр ё ҳатто кишвар оғоз кардан мумкин аст. Ҳамаи ин ҳамчун RPC (Remote Procedure Calling) ихтисор карда мешавад. Намунаҳо технологияҳои CORBA ва барои Java - RMI (Remote Method Invoking) мебошанд. Ва дар онҳо ҳама чиз хуб ба назар мерасад, махсусан дар КОРБА, зеро... Шумо метавонед бо он дар ҳама гуна забони барномасозӣ кор кунед, аммо чизе ҳанӯз намерасид. Ман боварӣ дорам, ки нуқсони CORBA дар он аст, ки он тавассути баъзе протоколҳои шабакавии худ ба ҷои HTTP оддӣ кор мекунад, ки тавассути ҳама гуна девори девор мувофиқ аст. Идеяи хидмати веб эҷод кардани RPC буд, ки ба пакетҳои HTTP ворид карда шавад. Ҳамин тариқ, таҳияи стандарт оғоз ёфт. Мафҳумҳои асосии ин стандарт кадомҳоянд:- СОБУН . Пеш аз занг задан ба тартиби дурдаст, шумо бояд ин зангро дар файли XML дар формати SOAP тавсиф кунед. SOAP танҳо яке аз аломатҳои зиёди XML мебошад, ки дар хидматҳои веб истифода мешаванд. Ҳар чизе ки мо мехоҳем ба ҷое тавассути HTTP ирсол кунем, аввал ба тавсифи SOAP XML табдил дода мешавад, сипас ба пакети HTTP пур карда мешавад ва тавассути TCP/IP ба компютери дигари шабака фиристода мешавад.
- WSDL . Як хидмати веб вуҷуд дорад, яъне. барномае, ки усулҳояшро метавон аз фосилаи дур даъват кард. Аммо стандарт талаб мекунад, ки ин барнома бо тавсифе ҳамроҳ шавад, ки мегӯяд, ки "бале, шумо дуруст мегӯед - ин воқеан хидмати веб аст ва шумо метавонед аз он фалон усулҳоро даъват кунед." Ин тавсиф бо файли дигари XML, ки формати дигар дорад, яъне WSDL, муаррифӣ мешавад. Онхое. WSDL танҳо як файли XML аст, ки хидмати вебро тавсиф мекунад ва чизи дигаре нест.
Муносибати умумӣ
Дар хидматҳои веб ҳамеша муштарӣ ва server мавҷуд аст. Сервер хидмати веби мост ва баъзан нуқтаи ниҳоӣ номида мешавад (ба мисли нуқтаи ниҳоӣ, ки паёмҳои SOAP аз муштарӣ дастрас мешаванд). Мо бояд корҳои зеринро иҷро кунем:- Интерфейси хидмати веби моро тавсиф кунед
- Ин интерфейсро амалӣ кунед
- Хидмати веби моро оғоз кунед
- Муштариро нависед ва ба усули хидматрасонии веби дилхоҳ занг занед
main
ва хидмати вебро мустақиман ҳамчун server оғоз кунед ё онро дар server ба монанди Tomcat ё ягон дигар ҷойгир кунед. Дар ҳолати дуюм, мо худамон 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, синфҳо ба истилоҳ эзоҳҳо мебошанд WebService
ва WebMethod
ҳеҷ коре намекунанд, ба истиснои қайд кардани интерфейси мо ва усули он ҳамчун хидмати веб. Ин ба синф дахл дорад SOAPBinding
. Ягона фарқият дар он аст, ки SOAPBinding
он эзоҳ бо параметрҳост. Дар ин ҳолат, параметр 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
ва дар он мо синфро 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());
}
}
Акнун биёед ин синфро тавассути пахш кардани Shift+F10 иҷро кунем . Ҳеҷ чиз дар консол пайдо намешавад, аммо server кор мекунад. Шумо метавонед инро тавассути ворид кардани сатри http://localhost:1986/wss/hello?wsdl дар браузери худ санҷед . Саҳифае, ки кушода мешавад, аз як тараф исбот мекунад, ки мо serverи веб (http://) дар порти 1986 дар компютери мо (localhost) кор мекунад ва аз тарафи дигар, тавсифи WSDL-и хидмати веби моро нишон медиҳад. Агар шумо барномаро қатъ кунед, тавсиф ва инчунин худи хидмати веб дастнорас мешавад, аз ин рӯ мо ин корро намекунем, балки ба навиштани муштарӣ мегузарем.
Мизоҷ
Дар папкаи лоиҳа src мо бастаеро эҷод мекунемru.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!
Агар шумо онро надида бошед, пас шумо эҳтимол оғоз кардани хидмати вебро фаромӯш кардаед.
GO TO FULL VERSION