JavaRush /Блоги Java /Random-TG /Хидматҳои веб. Қадами 1. Хизматрасонии веб чист ва бо он ...
eGarmin
Сатҳи

Хидматҳои веб. Қадами 1. Хизматрасонии веб чист ва бо он чӣ гуна бояд кор кард?

Дар гурӯҳ нашр шудааст
Сарлавҳаи мавзӯъ воқеан савол аст, зеро... Ман худам намедонам, ки ин чист ва бори аввал ман кӯшиш мекунам, ки дар доираи ин мақола бо он кор кунам. Ягона чизе, ки ман кафолат дода метавонам, ин аст, ки рамзи дар зер овардашуда кор хоҳад кард, аммо ибораҳои ман танҳо тахминҳо ва тахминҳо хоҳанд буд, ки ман худам ин ҳамаро чӣ гуна мефаҳмам. Пас, биёед... Хидматҳои веб.  Қадами 1. Хизматрасонии веб чист ва бо он чӣ гуна бояд кор кард?  - 1

Муқаддима

Мо бояд аз он оғоз кунем, ки чаро мафҳуми хидматҳои веб сохта шудааст. То замоне, ки ин консепсия дар ҷаҳон пайдо шуд, технологияҳое вуҷуд доштанд, ки имкон медоданд, ки замимаҳо дар масофаи дур амал кунанд, ки дар он як барнома метавонист ягон усулро дар барномаи дигар даъват кунад, ки онро дар компютери воқеъ дар дигар шаҳр ё ҳатто кишвар оғоз кардан мумкин аст. Ҳамаи ин ҳамчун RPC (Remote Procedure Calling) ихтисор карда мешавад. Намунаҳо технологияҳои CORBA ва барои Java - RMI (Remote Method Invoking) мебошанд. Ва дар онҳо ҳама чиз хуб ба назар мерасад, махсусан дар КОРБА, зеро... Шумо метавонед бо он дар ҳама гуна забони барномасозӣ кор кунед, аммо чизе ҳанӯз намерасид. Ман боварӣ дорам, ки нуқсони CORBA дар он аст, ки он тавассути баъзе протоколҳои шабакавии худ ба ҷои HTTP оддӣ кор мекунад, ки тавассути ҳама гуна девори девор мувофиқ аст. Идеяи хидмати веб эҷод кардани RPC буд, ки ба пакетҳои HTTP ворид карда шавад. Ҳамин тариқ, таҳияи стандарт оғоз ёфт. Мафҳумҳои асосии ин стандарт кадомҳоянд:
  1. СОБУН . Пеш аз занг задан ба тартиби дурдаст, шумо бояд ин зангро дар файли XML дар формати SOAP тавсиф кунед. SOAP танҳо яке аз аломатҳои зиёди XML мебошад, ки дар хидматҳои веб истифода мешаванд. Ҳар чизе ки мо мехоҳем ба ҷое тавассути HTTP ирсол кунем, аввал ба тавсифи SOAP XML табдил дода мешавад, сипас ба пакети HTTP пур карда мешавад ва тавассути TCP/IP ба компютери дигари шабака фиристода мешавад.
  2. WSDL . Як хидмати веб вуҷуд дорад, яъне. барномае, ки усулҳояшро метавон аз фосилаи дур даъват кард. Аммо стандарт талаб мекунад, ки ин барнома бо тавсифе ҳамроҳ шавад, ки мегӯяд, ки "бале, шумо дуруст мегӯед - ин воқеан хидмати веб аст ва шумо метавонед аз он фалон усулҳоро даъват кунед." Ин тавсиф бо файли дигари XML, ки формати дигар дорад, яъне WSDL, муаррифӣ мешавад. Онхое. WSDL танҳо як файли XML аст, ки хидмати вебро тавсиф мекунад ва чизи дигаре нест.
Чаро ин қадар кӯтоҳ мепурсед? Оё шумо мушаххастар гуфта наметавонед? Эҳтимол имконпазир аст, аммо барои ин шумо бояд ба китобҳое мисли Т.Машнин, "Java Web Services" муроҷиат кунед. Дар он ҷо, беш аз 200 саҳифаи аввал, тавсифи муфассали ҳар як барчаспҳои стандартҳои SOAP ва WSDL мавҷуд аст. Оё меарзад? Ба назари ман, не, зеро... ҳамаи ин ба таври худкор дар Java сохта мешавад ва шумо танҳо бояд мундариҷаи усулҳоеро нависед, ки бояд дурдаст даъват карда шаванд. Ҳамин тавр, дар Java API ба монанди JAX-RPC пайдо шуд. Агар касе намедонад, вақте ки онҳо мегӯянд, ки Java чунин ва чунин API дорад, ин маънои онро дорад, ки бастаи дорои маҷмӯи синфҳо мавҷуд аст, ки технологияи мавриди назарро фаро мегирад. JAX-RPC бо мурури замон аз version ба version табдил ёфт ва дар ниҳоят JAX-WS шуд. WS бешубҳа барои WebService аст ва шумо шояд фикр кунед, ки ин танҳо тағир додани номи RPC ҳамчун калимаи маъмул дар ин рӯзҳост. Ин дуруст нест, зеро Ҳоло хидматҳои веб аз идеяи аслӣ дур шудаанд ва ба шумо имкон медиҳанд, ки на танҳо ба усулҳои дурдаст занг занед, балки инчунин паёмҳои ҳуҷҷатиро дар формати SOAP ирсол кунед. Ман намедонам, ки чаро ин ҳоло лозим аст; гумон аст, ки ҷавоб дар ин ҷо "танҳо дар ҳолати зарурӣ" бошад. Худи ман мехостам аз рафикони пуртачриба ибрат гирам. Ва ниҳоят, JAX-RS барои хидматҳои ба истилоҳ RESTful веб пайдо шуд, аммо ин мавзӯи мақолаи алоҳида аст. Муқаддима метавонад дар ин ҷо хотима ёбад, зеро... Минбаъд мо кор карданро бо JAX-WS меомӯзем.

Муносибати умумӣ

Дар хидматҳои веб ҳамеша муштарӣ ва server мавҷуд аст. Сервер хидмати веби мост ва баъзан нуқтаи ниҳоӣ номида мешавад (ба мисли нуқтаи ниҳоӣ, ки паёмҳои SOAP аз муштарӣ дастрас мешаванд). Мо бояд корҳои зеринро иҷро кунем:
  1. Интерфейси хидмати веби моро тавсиф кунед
  2. Ин интерфейсро амалӣ кунед
  3. Хидмати веби моро оғоз кунед
  4. Муштариро нависед ва ба усули хидматрасонии веби дилхоҳ занг занед
Шумо метавонед хидмати вебро бо роҳҳои гуногун оғоз кунед: ё синфро бо усул тавсиф кунед 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!Агар шумо онро надида бошед, пас шумо эҳтимол оғоз кардани хидмати вебро фаромӯш кардаед.

Хулоса

Ин мавзӯъ як экскурсияи мухтасар ба хидматҳои вебро пешниҳод кард. Бори дигар мегӯям, ки бисёре аз он чизе, ки ман навиштаам, тахмини ман дар бораи он, ки он чӣ гуна кор мекунад ва аз ин рӯ шумо набояд ба ман аз ҳад зиёд бовар кунед. Агар одамони донишманд маро ислох кунанд, миннатдор мешудам, зеро он вакт ман чизе меомузам. UPD. Биёед сӯҳбатро идома диҳем
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION