JavaRush /Java Blog /Random-TL /Mga serbisyo sa web. Hakbang 1. Ano ang isang serbisyo sa...
eGarmin
Antas

Mga serbisyo sa web. Hakbang 1. Ano ang isang serbisyo sa web at kung paano ito gagawin?

Nai-publish sa grupo
Ang pamagat ng paksa ay talagang isang katanungan, dahil... Ako mismo ay hindi alam kung ano ito at sa unang pagkakataon susubukan kong magtrabaho kasama ito sa loob ng balangkas ng artikulong ito. Ang tanging bagay na maaari kong garantiya ay gagana ang code na ipinakita sa ibaba, ngunit ang aking mga parirala ay magiging mga pagpapalagay at hula lamang tungkol sa kung paano ko mismo naiintindihan ang lahat ng ito. Kaya, tayo na... Mga serbisyo sa web.  Hakbang 1. Ano ang isang serbisyo sa web at kung paano ito gagawin?  - 1

Panimula

Kailangan nating magsimula sa kung bakit nilikha ang konsepto ng mga serbisyo sa web. Sa oras na lumitaw ang konseptong ito sa mundo, umiral na ang mga teknolohiya na nagpapahintulot sa mga application na makipag-ugnayan sa malayo, kung saan ang isang programa ay maaaring tumawag ng ilang pamamaraan sa isa pang programa, na maaaring ilunsad sa isang computer na matatagpuan sa ibang lungsod o kahit na bansa. Ang lahat ng ito ay dinaglat bilang RPC (Remote Procedure Calling). Kasama sa mga halimbawa ang mga teknolohiya ng CORBA, at para sa Java - RMI (Remote Method Invoking). At mukhang maganda ang lahat sa kanila, lalo na sa CORBA, dahil... Maaari mong gamitin ito sa anumang programming language, ngunit may kulang pa rin. Naniniwala ako na ang kawalan ng CORBA ay gumagana ito sa pamamagitan ng ilan sa sarili nitong mga protocol ng network sa halip na simpleng HTTP, na akma sa anumang firewall. Ang ideya ng serbisyo sa web ay lumikha ng isang RPC na ilalagay sa mga HTTP packet. Kaya nagsimula ang pagbuo ng pamantayan. Ano ang mga pangunahing konsepto ng pamantayang ito:
  1. SABON . Bago tumawag sa isang malayuang pamamaraan, kailangan mong ilarawan ang tawag na ito sa isang XML file sa SOAP na format. Ang SOAP ay isa lamang sa maraming XML markup na ginagamit sa mga serbisyo sa web. Lahat ng gusto naming ipadala sa isang lugar sa pamamagitan ng HTTP ay unang na-convert sa isang paglalarawan ng XML SOAP, pagkatapos ay pinalamanan sa isang HTTP packet at ipinadala sa isa pang computer sa network sa pamamagitan ng TCP/IP.
  2. WSDL . Mayroong serbisyo sa web, i.e. isang programa na ang mga pamamaraan ay maaaring tawagan nang malayuan. Ngunit ang pamantayan ay nangangailangan na ang program na ito ay sinamahan ng isang paglalarawan na nagsasabing "oo, tama ka - ito ay talagang isang serbisyo sa web at maaari mong tawagan ang mga ganoong paraan mula dito." Ang paglalarawang ito ay kinakatawan ng isa pang XML file, na may ibang format, katulad ng WSDL. Yung. Ang WSDL ay isang XML file lamang na naglalarawan sa isang serbisyo sa web at wala nang iba pa.
Bakit ang ikli mong tanong? Hindi ka ba maaaring maging mas tiyak? Posible ito, ngunit para magawa ito kailangan mong bumaling sa mga aklat tulad ng T. Mashnin, "Java Web Services." Doon, sa unang 200 mga pahina, mayroong isang detalyadong paglalarawan ng bawat tag ng mga pamantayan ng SOAP at WSDL. Ito ba ay nagkakahalaga ng paggawa? Sa aking palagay, hindi, dahil... lahat ng ito ay awtomatikong nilikha sa Java, at kailangan mo lamang na isulat ang mga nilalaman ng mga pamamaraan na dapat na tinatawag na malayuan. Kaya, lumitaw ang isang API tulad ng JAX-RPC sa Java. Kung sinuman ang hindi nakakaalam, kapag sinabi nila na ang Java ay may ganito at ganoong API, nangangahulugan ito na mayroong isang pakete na may isang hanay ng mga klase na sumasaklaw sa teknolohiyang pinag-uusapan. Ang JAX-RPC ay umunlad sa paglipas ng panahon mula sa bersyon hanggang sa bersyon at kalaunan ay naging JAX-WS. Ang WS ay malinaw na kumakatawan sa WebService at maaari mong isipin na ito ay simpleng pagpapalit ng pangalan ng RPC bilang isang sikat na buzzword sa mga araw na ito. Hindi ito totoo, dahil Ngayon ang mga serbisyo sa web ay lumayo mula sa orihinal na ideya at nagbibigay-daan sa iyo hindi lamang na tumawag sa mga malalayong pamamaraan, kundi pati na rin upang magpadala lamang ng mga mensahe ng dokumento sa SOAP na format. Hindi ko alam kung bakit kailangan pa ito; malabong ang sagot dito ay "kung sakaling kailanganin." Ako mismo ay nais na matuto mula sa mas maraming karanasan na mga kasama. At sa wakas, lumitaw ang JAX-RS para sa tinatawag na RESTful web services, ngunit ito ang paksa ng isang hiwalay na artikulo. Ang pagpapakilala ay maaaring magtapos dito, dahil... Susunod, matututunan nating magtrabaho kasama ang JAX-WS.

Pangkalahatang diskarte

Sa mga serbisyo sa web palaging mayroong isang kliyente at isang server. Ang server ay ang aming serbisyo sa web at kung minsan ay tinatawag na endpoint (tulad ng sa, ang end point kung saan naaabot ang mga SOAP na mensahe mula sa kliyente). Kailangan nating gawin ang mga sumusunod:
  1. Ilarawan ang interface ng aming serbisyo sa web
  2. Ipatupad ang interface na ito
  3. Ilunsad ang aming serbisyo sa web
  4. Sumulat ng isang kliyente at malayuang tawagan ang nais na paraan ng serbisyo sa web
Maaari kang maglunsad ng serbisyo sa web sa iba't ibang paraan: ilarawan ang isang klase na may pamamaraan mainat direktang ilunsad ang serbisyo sa web bilang isang server, o i-deploy ito sa isang server tulad ng Tomcat o anumang iba pa. Sa pangalawang kaso, kami mismo ay hindi naglulunsad ng isang bagong server at hindi nagbubukas ng isa pang port sa computer, ngunit sabihin lamang sa lalagyan ng servlet ng Tomcat na "kami ay nagsulat ng mga klase ng serbisyo sa web dito, mangyaring i-publish ang mga ito upang ang lahat na makipag-ugnay sa iyo ay maaari gamitin ang aming paggamit ng serbisyo sa web." Anuman ang paraan ng paglulunsad ng serbisyo sa web, magkakaroon kami ng parehong kliyente.

server

Ilunsad natin ang IDEA at gumawa ng bagong proyekto Lumikha ng Bagong Proyekto . Tukuyin ang pangalang HelloWebService at i-click ang Next button , pagkatapos ay ang Finish button . Sa src folder gagawa kami ng package ru.javarush.ws . Sa package na ito gagawa kami ng interface 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);
}
Sa code na ito, ang mga klase ay tinatawag na mga anotasyon WebServiceat WebMethodwalang ginagawa kundi markahan ang aming interface at ang pamamaraan nito bilang isang serbisyo sa web. Ang parehong naaangkop sa klase SOAPBinding. Ang pagkakaiba lang ay isa SOAPBindingitong anotasyon na may mga parameter. Sa kasong ito, ang isang parameter ay ginagamit stylena may isang halaga na nagsasaad na ang serbisyo sa web ay gagana hindi sa pamamagitan ng mga mensahe ng dokumento, ngunit bilang isang klasikong RPC, i.e. upang tumawag ng isang pamamaraan. Ipatupad natin ang aming interface logic at lumikha ng klase sa aming package HelloWebServiceImpl. Sa pamamagitan ng paraan, tandaan ko na ang pagtatapos ng isang klase na may Impl ay isang kombensyon sa Java, ayon sa kung saan ang pagpapatupad ng mga interface ay itinalaga (Impl - mula sa salitang pagpapatupad, i.e. pagpapatupad). Hindi ito kinakailangan at malaya kang pangalanan ang klase kung ano ang gusto mo, ngunit kailangan ito ng mabuting asal:
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 + "!";
    }
}
Ilunsad natin ang aming serbisyo sa web bilang isang independiyenteng server, ibig sabihin. nang walang paglahok ng anumang Tomcat at mga server ng application (ito ay isang paksa para sa isang hiwalay na talakayan). Upang gawin ito, sa istraktura ng proyekto sa src folder, gagawa kami ng isang package ru.javarush.endpoint, at sa loob nito ay gagawa kami ng isang klase HelloWebServicePublisherna may pamamaraan 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());
    }
}
Ngayon, patakbuhin natin ang klase na ito sa pamamagitan ng pagpindot sa Shift+F10 . Walang lalabas sa console, ngunit tumatakbo ang server. Maaari mong i-verify ito sa pamamagitan ng pag-type ng linyang http://localhost:1986/wss/hello?wsdl sa iyong browser . Ang pahinang bubukas, sa isang banda, ay nagpapatunay na mayroon kaming isang web server (http://) na tumatakbo sa port 1986 sa aming computer (localhost), at, sa kabilang banda, ay nagpapakita ng isang paglalarawan ng WSDL ng aming serbisyo sa web. Kung ihihinto mo ang application, ang paglalarawan ay magiging hindi magagamit, pati na rin ang web service mismo, kaya hindi namin gagawin ito, ngunit magpatuloy sa pagsulat ng kliyente.

Kliyente

Sa folder ng proyekto src gagawa kami ng isang pakete ru.javarush.client, at sa loob nito ay isang klase HelloWebServiceClientna may pamamaraan 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"));
    }
}
Nagbigay ako ng maximum na mga komento sa code sa listahan. Wala akong idadagdag, kaya't tumakbo tayo (Shift+F10). Dapat nating makita ang teksto sa console: Hello, JavaRush!Kung hindi mo ito nakita, malamang na nakalimutan mong simulan ang serbisyo sa web.

Konklusyon

Ang paksang ito ay nagbigay ng maikling ekskursiyon sa mga serbisyo sa web. Muli, sasabihin ko na ang karamihan sa aking isinulat ay ang aking hula sa kung paano ito gumagana, at samakatuwid ay hindi ka dapat magtiwala sa akin nang labis. Magpapasalamat ako kung itinutuwid ako ng mga taong may kaalaman, dahil may matutunan ako. UPD. Ituloy natin ang usapan
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION