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...
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:- 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.
- 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.
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:- Ilarawan ang interface ng aming serbisyo sa web
- Ipatupad ang interface na ito
- Ilunsad ang aming serbisyo sa web
- Sumulat ng isang kliyente at malayuang tawagan ang nais na paraan ng serbisyo sa web
main
at 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 interfaceHelloWebService
:
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 WebService
at WebMethod
walang 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 SOAPBinding
itong anotasyon na may mga parameter. Sa kasong ito, ang isang parameter ay ginagamit style
na 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 HelloWebServicePublisher
na 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 paketeru.javarush.client
, at sa loob nito ay isang klase HelloWebServiceClient
na 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.
GO TO FULL VERSION