wsdl-taal. Klaar voor WSDL voor webservice met boekenlijst. Zo ziet een webserviceverzoek eruit

In dit artikel zal ik vertellen wat een WSDL-bestand is, waarom het nodig is en hoe je ermee kunt werken.

Artikel kaart

Wat is WSDL

WSDL is een beschrijvingstaal voor webservices met een XML-structuur. Het belangrijkste doel van een WSDL-bestand is als een interface voor toegang tot servicefuncties en retourgegevenstypen; pad naar de server die verzoeken verwerkt, enz.

Het pad naar het wsdl-bestand ziet er meestal als volgt uit: http://host/services/wsdl/gbdar-v2-2.wsdl

Er zijn veel tools en bibliotheken die zijn ontworpen om een ​​WSDL-bestand te lezen.

ZeepUi

Eén zo'n tool is soapUi(). Door een distributie te installeren die voor uw platform is ontworpen, kunt u nieuw project door het File/New SoapUi-projectteam. Laat in het dialoogvenster voor het aanmaken van een nieuw project het selectievakje Voorbeeldaanvragen aanmaken ingeschakeld

Query's uitvoeren

In het nieuwe project worden automatisch aanvraagsjablonen voor de dienst aangemaakt, waarvan de beschrijving in het wsdl-bestand staat. Aan de linkerkant van de boom ziet u een lijst met functies in het WSDL-bestand. Ik zal de replicatiefunctie blootleggen. Daarin bevindt zich een verzoek Request1, door te dubbelklikken waarop we een dialoogvenster met een verzoeksjabloon zullen zien, in plaats van de standaardparameters zullen er vraagtekens zijn. Om de functie correct uit te voeren, moet u alle parameters invullen die niet zijn gemarkeerd met de optionele tag en vervolgens op de groene driehoek in de linkerbovenhoek van het dialoogvenster klikken.

Als alle parameters correct zijn opgegeven, verschijnt het antwoord van de service op het verzoek aan de rechterkant.

SoapUi biedt de mogelijkheid om de parameters van een WSDL-bestand te bekijken; hiervoor moet u dubbelklikken op de interfacenaam (gemarkeerd met een groen pictogram in de WSDL-bestandsboom, voor mij - gdbar-v2-2SOAP). In het dialoogvenster vindt u:

  • Tabblad Overzicht - beschrijving algemene parameters WSDL, een lijst met functies en bijbehorende serveracties
  • Tabblad Service-eindpunten — pad naar de server en andere parameters
  • WSDL-inhoud - bestandsnavigatieboom
  • WS-I-naleving — hier kunt u een WS-I-rapport op de interface maken

Documentatie genereren

Met SoapUi kunnen we WSDL-functiedocumentatie genereren. Om dit te doen, klikt u op klik met de rechtermuisknop via de interface en roep het commando op Documentatie genereren. Als resultaat ontvangen wij een gedetailleerde handleiding in html-formaat.

Dat is alles, abonneer u op nieuwe berichten, laat opmerkingen achter, doe suggesties om het artikel te verbeteren.

Elke webservice biedt een WSDL-document (Web Service Description Language) waarin alles wordt beschreven wat de klant nodig heeft om met deze service te kunnen werken. Een WSDL-document biedt een ontwikkelaar een eenvoudige en consistente manier om de syntaxis te specificeren voor het aanroepen van een webmethode. Bovendien staat dit document het gebruik toe van automatische tools voor het genereren van proxyklassen, vergelijkbaar met die in de raamwerken Visuele studio.NET en .NET Framework. Dankzij deze tools is het gebruik van een webservice net zo eenvoudig als het gebruik van een lokale klasse.

Het WSDL-document is gebaseerd op XML-formaat, volgens welke informatie in vijf groepen is verdeeld. De eerste drie groepen zijn abstracte definities die onafhankelijk zijn van platform-, netwerk- of taalspecificaties, terwijl de overige twee groepen concrete beschrijvingen bevatten.

zeep protocol

De communicatie tussen webservices en hun klanten vindt plaats via berichten in XML-formaat.

SOAP (Simple Object Access Protocol) is een berichtenprotocol voor het selecteren van webservices.

Het hoofdidee van de SOAP-standaard is dat berichten gecodeerd moeten worden in een gestandaardiseerd XML-formaat.

Naast SOAP-berichten kunt u de GET- en POST-protocol HTTP.

Voordelen van het gebruik van het SOAP-formaat ten opzichte van andere formaten voor gegevensoverdracht:

    Het coderen van datastructuren en datasets in XML met behulp van SOAP is net zo eenvoudig als het coderen van eenvoudige scalaire gegevenstypen.

    Wanneer u SOAP-berichten gebruikt, extra gereedschap, waardoor u bijvoorbeeld eenvoudig beveiligings- of traceringsfuncties kunt toevoegen.

    Er zijn SOAP-toolkits voor verschillende programmeertalen (en zelfs eerdere). Microsoft-versies C++ en Visual Basic). Anders, om communicatie met de dienst mogelijk te maken via GET-methoden en HTTP POST, moet u uiteraard zelf de querystring samenstellen en vervolgens het antwoord parseren.

Disco-standaard

De DISCO-standaard biedt de eenvoudigste manier om toegang te krijgen tot manifestbestanden, waardoor u verwijzingen naar webservices kunt groeperen.

DISCO-bestand kan bestanden van verschillende webservers bevatten en ondersteunt "dynamisch zoeken" - automatisch zoeken map met webservicebestanden op de server.

Manifestbestanden zijn nuttig omdat ze meerdere webservices combineren in één lijst, maar klanten niet toestaan ​​om naar een specifiek type webservice te zoeken zonder de naam op te geven van het bedrijf dat deze heeft ontwikkeld.

uddi-specificatie

De UDDI-specificatie (Universal Description, Discovery, and Integration) vermijdt deze problemen door gebruik te maken van een speciale opslagplaats (repository) waar bedrijven en organisaties gegevens kunnen plaatsen over de diensten die zij leveren. Meer dan 100 bedrijven hebben pionierswerk verricht bij het creëren van UDDI-technologie (een volledige lijst is te vinden op http://www.uddi.org/community.html), waaronder Sun en Microsoft. Samen ontwikkelden deze bedrijven een concept-UDDI-specificatie, die na 18 maanden werd gestandaardiseerd.

De informatie in deze repository moet handmatig worden bijgewerkt. Daartoe onderhouden sommige "knooppuntoperatoren" identieke kopieën van de UDDI-repository. Deze bedrijven bieden opslag van de opgegeven repository en gratis toegang daartoe om webservices populair te maken. Bovendien heeft Microsoft een versie van UDDI in de software opgenomen Windows-server.NET voor gebruik op bedrijfsintranetten.

De UDDI-winkel bevat informatie over de bedrijven die webservices leveren, het type van elke service en relaties met informatie en specificaties met betrekking tot die services. De UDDI-interface zelf is een webservice. Om u te registreren of een dienst te zoeken, moet u een SOAP-bericht verzenden.

De belangrijkste nadelen van webservices zijn lagere prestaties en grotere omvang netwerk verkeer vergeleken met technologieën zoals RMI, CORBA, DCOM vanwege het gebruik van XML-tekstberichten.

De topictitel is eigenlijk een vraag, want... Ik weet zelf niet wat het is en voor het eerst zal ik proberen ermee te werken in het kader van dit artikel. Het enige dat ik kan garanderen is dat de onderstaande code zal werken, maar mijn zinnen zullen slechts aannames en gissingen zijn over hoe ik dit zelf allemaal begrijp. Dus laten we gaan...

Invoering

We moeten beginnen met de reden waarom het concept van webservices is ontstaan. Tegen de tijd dat dit concept in de wereld verscheen, bestonden er al technologieën die het mogelijk maakten dat applicaties op afstand konden communiceren, waarbij het ene programma een methode in een ander programma kon aanroepen, dat kon worden gelanceerd op een computer in een andere stad of zelfs een ander land. Dit alles wordt afgekort als RPC (Remote Procedure Calling). Voorbeelden zijn onder meer CORBA-technologieën en voor Java - RMI (Remote Method Invoking). En alles lijkt goed te zijn in hen, vooral in CORBA, omdat... Je kunt er in elke programmeertaal mee werken, maar er ontbrak nog iets. Ik denk dat het nadeel van CORBA is dat het via een aantal van zijn eigen middelen werkt netwerkprotocollen in plaats van eenvoudige HTTP, die door elke firewall past. Het idee van de webservice was om een ​​RPC te maken die in HTTP-pakketten zou worden ingevoegd. Zo begon de ontwikkeling van de standaard. Wat zijn de basisconcepten van deze standaard:
  1. ZEEP. Voordat u een externe procedure oproept, moet u deze oproep beschrijven XML-bestand e SOAP-formaat. SOAP is slechts een van de vele XML-opmaak, dat wordt gebruikt in webservices. Alles wat we ergens via HTTP naartoe willen sturen, wordt eerst omgezet XML-beschrijving SOAP, vervolgens in een HTTP-pakket gestopt en via TCP/IP naar een andere computer op het netwerk verzonden.
  2. WSDL. Er is een webservice, d.w.z. een programma waarvan de methoden op afstand kunnen worden aangeroepen. Maar de standaard vereist dat dit programma vergezeld gaat van een beschrijving die zegt: "Ja, je hebt gelijk - dit is echt een webservice en je kunt er bepaalde methoden uit oproepen." Deze beschrijving wordt weergegeven door een ander XML-bestand, dat een ander formaat heeft, namelijk WSDL. Die. WSDL is slechts een XML-bestand dat een webservice beschrijft en niets meer.
Waarom zo kort vraag je? Kun je niet specifieker zijn? Het is waarschijnlijk mogelijk, maar om dit te doen zul je boeken moeten raadplegen zoals T. Mashnin, “Java Web Services.” Daar is het gedurende de eerste 200 pagina's gedetailleerde beschrijving elke tag van de SOAP- en WSDL-standaarden. Is het de moeite waard om te doen? Volgens mij niet, want... dit alles wordt automatisch in Java gemaakt en u hoeft alleen de inhoud te schrijven van de methoden die op afstand moeten worden aangeroepen. Er verscheen dus een API zoals JAX-RPC in Java. Als iemand het niet weet, als hij zegt dat Java een bepaalde API heeft, betekent dit dat er een pakket is met een reeks klassen die de betreffende technologie inkapselen. JAX-RPC evolueerde in de loop van de tijd van versie naar versie en werd uiteindelijk JAX-WS. WS staat duidelijk voor WebService en je zou kunnen denken dat dit tegenwoordig simpelweg een nieuwe naam is voor RPC als een populair modewoord. Dit is niet waar, omdat Nu hebben webservices afstand genomen van het oorspronkelijke idee en kunt u niet alleen externe methoden aanroepen, maar ook eenvoudigweg documentberichten in SOAP-formaat verzenden. Ik weet nog niet waarom dit nodig is; het is onwaarschijnlijk dat het antwoord hier zal zijn ‘voor het geval dat het nodig is’. Zelf zou ik graag willen leren van meer ervaren kameraden. En als laatste verscheen JAX-RS voor zogenaamde RESTful-webservices, maar dit is het onderwerp van een apart artikel. De introductie kan hier eindigen, want... Vervolgens gaan we leren werken met JAX-WS.

Algemene benadering

Bij webservices is er altijd een client en een server. De server is onze webservice en wordt soms het eindpunt genoemd (zoals in het eindpunt waar SOAP-berichten van de client aankomen). We moeten het volgende doen:
  1. Beschrijf de interface van onze webservice
  2. Implementeer deze interface
  3. Lanceer onze webservice
  4. Schrijf een klant en bel op afstand gewenste methode webservice
De webservice kan worden gestart verschillende manieren: beschrijf een klasse met een hoofdmethode en voer de webservice rechtstreeks uit als een server, of implementeer deze op een server zoals Tomcat of een andere. In het tweede geval lanceren we onszelf niet nieuwe server en we openen geen andere poort op de computer, maar vertellen eenvoudigweg aan de Tomcat-servletcontainer dat "we hier webserviceklassen hebben geschreven, publiceer ze alstublieft zodat iedereen die contact met u opneemt, onze webservice kan gebruiken." Ongeacht de manier waarop de webservice wordt gestart, we hebben dezelfde klant.

Server

Laten we IDEA lanceren en een nieuw project maken Nieuw project maken. Laten we de naam aangeven HalloWebService en druk op de knop Volgende en vervolgens op de knop Finish. In map src laten we een pakket maken ru.javarush.ws. In dit pakket maken we de HelloWebService-interface: package ru. Javarush. ws; // dit zijn annotaties, d.w.z. een manier om onze klassen en methoden te markeren, // met betrekking tot webservicetechnologie Javax importeren. jws. WebMethode; Javax importeren. jws. WebService; Javax importeren. jws. zeep. ZEEPbinden; // we zeggen dat onze interface zal werken als een webservice@WebService // we zeggen dat de webservice zal worden gebruikt om methoden aan te roepen@SOAPBinding (stijl = SOAPBinding. Stijl. RPC) openbare interface HelloWebService ( // we zeggen dat deze methode op afstand kan worden aangeroepen@WebMethod public String getHelloString(Stringnaam) ; ) In deze code zijn de klassen WebService en WebMethod zogenaamde annotaties en doen ze niets anders dan onze interface en de bijbehorende methode markeren als een webservice. Hetzelfde geldt voor de klasse SOAPBinding. Het enige verschil is dat SOAPBinding een annotatie met parameters is. IN in dit geval de stijlparameter wordt gebruikt met een waarde die aangeeft dat de webservice niet via documentberichten werkt, maar als een klassieke RPC, d.w.z. om de methode aan te roepen. Laten we onze interfacelogica implementeren en een HelloWebServiceImpl-klasse in ons pakket maken. Overigens merk ik op dat het beëindigen van een klasse met Impl een conventie is in Java, volgens welke de implementatie van interfaces zo wordt aangeduid (Impl - van het woord implementatie, d.w.z. implementatie). Dit is geen vereiste en je bent vrij om de klasse een naam te geven die je wilt, maar goede manieren vereisen het: pakket ru. Javarush. ws; // dezelfde annotatie als bij het beschrijven van de interface, Javax importeren. jws. WebService; // maar hier wordt het gebruikt met de parameter endpointInterface, // wijzend op voor-en achternaam interfaceklasse van onze webservice@WebService(endpointInterface= "ru.javarush.ws.HelloWebService") public class HelloWebServiceImpl implementeert HelloWebService ( @Override public String getHelloString (String-naam) ( // beantwoord gewoon de begroeting return "Hallo, " + naam + "!" ; ) ) Laten we onze webservice lanceren als zelfstandige server, d.w.z. zonder de deelname van Tomcat en applicatieservers (dit is een onderwerp voor een aparte discussie). Om dit te doen, in de projectstructuur in de map src Laten we een pakket ru.javarush.endpoint maken, en daarin zullen we een HelloWebServicePublisher-klasse maken met de hoofdmethode: pakket ru. Javarush. eindpunt; // klasse voor het draaien van een webserver met webservices Javax importeren. xml. ws. Eindpunt; // klasse van onze webservice import ru. Javarush. ws. HalloWebServiceImpl; public class HelloWebServicePublisher ( public static void main (String... args) ( // start de webserver op poort 1986 // en naar het adres dat is opgegeven in het eerste argument, // start de webservice die in het tweede argument is doorgegeven Eindpunt. publiceren( "http://localhost:1986/wss/hello", nieuwe HelloWebServiceImpl () ); ) ) Laten we nu deze klasse uitvoeren door te klikken Shift+F10. Er verschijnt niets in de console, maar de server draait. U kunt dit verifiëren door de regel http://localhost:1986/wss/hello?wsdl in uw browser te typen. De pagina die wordt geopend, bewijst enerzijds dat we een webserver (http://) hebben die op poort 1986 op onze computer draait (localhost), en toont anderzijds een WSDL-beschrijving van onze webservice. Als u de applicatie stopt, is de beschrijving niet meer beschikbaar, evenals de webservice zelf. We doen dit dus niet, maar gaan verder met het schrijven van de client.

Cliënt

In de projectmap src Laten we een pakket ru.javarush.client maken en daarin de klasse HelloWebServiceClient met de hoofdmethode: pakket ru. Javarush. cliënt; // nodig om de wsdl-beschrijving op te halen en er doorheen te gaan // bereik de webservice zelf java importeren. netto. URL; // deze uitzondering treedt op als u met een URL-object werkt java importeren. netto. MisvormdeURLException; // klassen om XML te parseren met wsdl-beschrijving // en bereik de servicetag erin Javax importeren. xml. naamruimte. QNaam; Javax importeren. xml. ws. Dienst; // interface van onze webservice (we hebben meer nodig) import ru. Javarush. ws. HalloWebService; public class HelloWebServiceClient ( public static void main (String args) gooit MalformedURLException ( // maak een link naar de wsdl-beschrijving URL-URL= nieuwe URL ( "http://localhost:1986/wss/hello?wsdl") ; // We kijken naar de parameters van de volgende constructor in de allereerste tag van de WSDL-beschrijving - definities // kijk naar het eerste argument in het targetNamespace-attribuut // kijk naar het tweede argument in het naamattribuut QName qname = nieuwe QName ("http://ws.site/" , "HelloWebServiceImplService" ); // Nu kunnen we de servicetag bereiken wsdl-beschrijving, Dienstverlening= Dienst. create (url, qname) ; // en dan naar de poorttag die erin is genest, zodat // ontvang een link naar een webserviceobject op afstand van ons HalloWebService hallo = service. getPort(HelloWebService.class); // Hoera! Nu kunt u bellen methode op afstand Systeem. uit. println (hallo. getHelloString ("JavaRush") ); ) ) Ik heb zoveel mogelijk commentaar gegeven op de code in de aanbieding. Ik heb niets toe te voegen, dus laten we rennen (Shift+F10). We zouden de tekst in de console moeten zien: Hallo, JavaRush! Als je het niet hebt gezien, ben je waarschijnlijk vergeten de webservice te starten.

Conclusie

In dit onderwerp werd gepresenteerd korte excursie naar webservices. Nogmaals, ik zal zeggen dat veel van wat ik schreef mijn inschatting is van hoe het werkt, en daarom moet je mij niet te veel vertrouwen. Ik zou dankbaar zijn als deskundige mensen Ze zullen mij corrigeren, want dan leer ik iets. UPD.

In hoofdstuk 2 hebben we besproken dat nadat je een webservice op de server hebt gemaakt als een servlet, JSP-pagina, JWS-bestand, EJB of ander object, je de samenstelling en mogelijkheden van de webservice in een platformonafhankelijke taal moet beschrijven. besturingssysteem, het programmeersysteem dat wordt gebruikt om de webservice te maken. Deze beschrijving wordt geregistreerd op een openbaar toegankelijke locatie op internet, zoals een UDDI- of ebXML-register, of opgeslagen op een webserviceserver. De beschrijving moet volledige en bevatten exacte informatie over alle diensten die door de webdienst worden aangeboden, methoden voor het verkrijgen van diensten, de inhoud van het verzoek om de dienst, het formaat van de verstrekte informatie.

Eén van de middelen om webservices accuraat en uniform te beschrijven is de WSDL-taal, ontwikkeld door het W3C-consortium. Deze taal is een andere implementatie van XML. De nieuwste aanbevolen specificatie wordt altijd op de pagina gepubliceerd http://www.w3.org/TR/wsdI. Op het moment dat dit boek werd geschreven, was de WSDL-versie 1.2, die we in dit hoofdstuk zullen beschrijven.

Samenstelling van een WSDL-document

Het rootelement van het XML-document – ​​de WSDL-beschrijving – is het element . In dit element kun je het optionele name attribuut gebruiken om de omschrijving een naam te geven. Het is ook een handige plek om de naamruimten te introduceren die in de beschrijving worden gebruikt.

WSDL-definities maken uitgebreid gebruik van verschillende naamruimten. Naast eigennamen gebruikt WSDL vaak elementnamen in type- en declaratietaal XSD-schema's(zie hoofdstuk 1) en taalnamen SOAP-protocol. De WSDL-naamruimte wordt vaak omschreven als de standaardnaamruimte. De naamruimte-ID van de nieuwste versie van WSDL 1.2 was op het moment van schrijven gelijk aan http://www.w3.org/2002/07/wsdl. De doelnaamruimte waarvan de identificatie wordt gespecificeerd door het attribuut, wordt gewoonlijk voorafgegaan door tns (doelnaamruimte).

Naar het rootelement elementen van zes basis- en twee extra soorten. Alle elementen zijn optioneel, er kan een willekeurig aantal zijn, met uitzondering van het element , die slechts één keer in een document kan voorkomen. Elk element heeft een naam, bepaald door het vereiste naamattribuut. Elementen verwijzen naar elkaar met deze namen. Dit zijn de elementen die zijn genest in het hoofdelement

? - Definieert de complexe typen die door de webservice worden gebruikt met behulp van XSD of een andere typedefinitietaal. Dit element is niet nodig als de webservice alleen gebruik maakt van eenvoudige soorten, beschreven in de XSD-taal.

? - beschrijft elk SOAP-bericht: verzoek, antwoord, documentoverdracht. Dit element bevat elementen Het beschrijven van delen van de boodschap die ondeelbaar zijn vanuit het oogpunt van WSDL. Voor berichten van het procedurele type is elk element Kan de naam en het type van een enkel verzoekargument of het type van een retourwaarde beschrijven. Voor berichten type document elementen Kan elk deel van het bericht 'meerdere delen/gerelateerd' beschrijven. Deze abstracte beschrijving wordt vervolgens ingevuld met elementen .

? Beschrijft de interface van een webservice, het eindpunt of de aankomstpoort van een bericht in WSDL genoemd. Het wordt beschreven als een reeks webservices genaamd WSDL-operaties. Als je deze beschrijving naar een programmeertaal vertaalt, kun je zien dat de poort goed aansluit bij de Java-interface, en dat elke bewerking goed aansluit bij een methode in deze interface. Bewerkingen worden beschreven door geneste elementen , die elk beschrijven aparte dienst. De service wordt beschreven door acties die zijn onderverdeeld in vier typen. Dat zijn er twee eenvoudige stappen: “een bericht ontvangen”, “een antwoord verzenden”, en twee gecombineerde acties: “een bericht verzenden - een antwoord ontvangen” of, omgekeerd, “een bericht ontvangen – een antwoord verzenden”. Ontvangen en verzenden worden op hun beurt beschreven door geneste elementen En , en de foutmelding is het element . Ontvangen en verzonden berichten moeten al door elementen worden beschreven , elementen , EN raadpleeg HEN MET HUN berichtattribuut.

? - geeft geneste elementen weer Een reeks poorten die zijn gekoppeld aan een enkele webservice. Dezelfde poort kan aan meerdere services worden gekoppeld.

? - beschrijft het specifieke formaat voor het verzenden van een bericht: protocollen zoals SOAP of HTTP, methoden voor het verpakken van het bericht, het type inhoud: HTML, XML of een ander MIME-berichttype. Elk element kan aan meerdere van dergelijke elementen worden gekoppeld, één voor elke doorstuurmethode. Dit element bevat elementen die zijn gedefinieerd in het geselecteerde protocolschema.

? < service >- specificeert de locatie van de webservice als een of meer poorten. Elke poort wordt beschreven door een genest element Bevat het adres van de webservice-interface, gespecificeerd volgens de regels die in het element zijn geselecteerd verzendmethode.

Naast deze zes hoofdelementen zijn er nog twee hulpelementen.

? - bevat een WSDL-beschrijving XSD-bestand of een ander WSDL-bestand.

Een reactie. Het kan in elk element worden opgenomen

WSDL-beschrijvingen.

We kunnen zeggen dat de elementen , En Ze laten zien WAT de beschreven webservice heeft, welke services deze biedt, hoe de services zijn georganiseerd en welke soorten gegevens deze services hebben.

Elementen leg uit HOE de webservice is geïmplementeerd, wat het protocol voor berichtoverdracht is: HTTP, SMTP of iets anders, en specificeert ook specificaties dataoverdracht.

Tenslotte de elementen laat zien WAAR de webservice zich bevindt door de beschrijving te koppelen met specifieke webserviceadressen.

De structuur van een WSDL-document wordt weergegeven in Listing 4.1. Tekens tussen vierkante haakjes zijn niet opgenomen in het document. Ze tonen de herhaling van een element of attribuut in een webservicebeschrijving:

Het teken [?] betekent dat het element of attribuut nul of één keer in het document mag voorkomen;

Het [*]-symbool betekent dat het element nul of meerdere keren mag voorkomen;

Het [+] symbool betekent dat het element één of meerdere keren mag voorkomen;

Het ontbreken van een teken tussen vierkante haken betekent dat het attribuut precies één keer moet voorkomen.

j Lijst 4.1. WSDL-documentschema

targetNamespace="nfleH l ra«iij

locatie = "URI-aflpec" /> [*]

Gratis commentaar

Beschrijvingen van complexe en niet-standaard typen.

[*]

[*]

[? ]

Een abstracte beschrijving van een SOAP-bericht als een reeks samenstellende delen.

[*]

Een abstracte beschrijving van een webservice als een reeks bewerkingen (services).

[*]

Omschrijving van de dienst als het ontvangen (invoer) en verzenden (uitvoer, storings)meldingen.

[?]

Bericht ontvangen.

[?] [?]

Verstuurd

message="nMH corresponderend element "> [*] [?]

Het foutbericht dat moet worden verzonden.

[*]

[+]

type="MMH van het overeenkomstige element "> [*]

[?]

Specifieke protocoldetails. Ze zijn gedefinieerd in het schema

dit protocol. ->

[*]

[?]

Elementen die details beschrijven, worden hier geschreven

specifieke operatie. ->

[?]

Elementen die beschrijven

details van het specifieke ontvangen bericht. ->

[?]

[?]

Elementen die beschrijven

details van het specifieke bericht dat wordt verzonden. ->

[*]

[?]

Elementen die beschrijven

details van het specifieke foutbericht. ->

serviceType="MMH van het overeenkomstige element "> [*]

Beschrijving van de webservice-interface als een set poorten.

binding="nMH van het overeenkomstige element "> [*]

[?]

Het verplichte en enige adres van de webservice-interface wordt hier geschreven, geschreven volgens de regels

protocol gespecificeerd in het element . ->

Elk specifiek protocol voor berichtoverdracht - SOAP, HTTP, FTP, SMTP - voegt zijn eigen aanvullende elementen toe aan de zes hoofd- en twee hulpelementen van de WSDL-taal, en beschrijft de kenmerken van dit protocol.

Laten we een eenvoudig voorbeeld geven. In Listing 3.14 hebben we een eenvoudige webservice geschreven als een Java-klasse die het verzonden verzoek retourneert zonder enige verwerking:

openbare klasse EchoService(

public String getEcho(String req) ( return req;

Listing 4.2 beschrijft deze webservice in WSDL met behulp van het SOAP-protocol.

Lijst 4.2. Beschrijving van de EchoService-webservice

versie = "1.0" codering = "UTF-8" ?>

targetNamespace="http://echoservice.com/echoservice.wsdl" xmlns="http://www.w3.org/2002/07/wsdl" xmlns:tns="http://echoservice.com/echoservice.wsdl " xmlns:soap="http://www.w3.org/2002/07/wsdl/soapl2" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

transport = "http://schemas.xmlsoap.org/soap/http" />

"http://schemas.xmlsoap.org/soap/encoding/"

naamruimte = "http://echoservice.ccm/echcservice.wsdl" use = "gecodeerd" />

^oapKbocy enccdingStyle=

"http: //schemas .xmlsoap.org/soap/encoding/" namespace= "http: //echoservice. c^/ech^service .wsdl" use="encoded" />

naam = "EchoServService">

Binding = "tns: EchoServiceSoapBinding" naam = "EchoService"> locatie=

"http://localhost:8080/axis/EchoService.jws" />

In Listing 4.2 bevinden we ons in het element we hebben de voorvoegsels gedefinieerd van alle naamruimten die we nodig hebben. Vervolgens hebben we het verzoek en het antwoord in twee elementen beschreven . We hebben ze de namen "getEchoRequest" EN "getEchoResponse" gegeven. Het verzoek bevat één argument van het type xsd: string. Dit type is gedefinieerd in de XSD-taal. We hebben het argument de naam req gegeven, wat hetzelfde is als de argumentnaam van de getEcho() -methode. We hebben de waarde die wordt geretourneerd door de methode return genoemd, het type is ook xsd: string.

De namen "getEchoRequest" EN "getEchoResponse" WORDEN GEBRUIKT IN HET VOLGENDE ELEMENT Om de invoer- en uitvoerparameters van een webservice op te geven. Het bevat één element . Dit betekent dat de webservice één service levert waarvan de naam "getEcho" dezelfde is als de naam van de methode die die service uitvoert. Het element specificeert de invoer en vrije dag serviceparameters. Dan element we hebben één manier aangegeven om berichten te verzenden: SOAP-berichten naar procedurele stijl, verstuurd door HTTP-protocol, waar het element naar verwijst

txarspcrt^=^"ht:tp^://?chepas^.>plscap^.c^rc^/?cap^/ht:tp^" />

Als de SOAP-documentstijl wordt gebruikt, wordt het stijlattribuut ingesteld op "document".

Eindelijk in het element genest element Het element koppelen met element

, waarmee het adres wordt aangegeven waar de webservice zich bevindt.

In Listing 4.2 specificeerden namen voorafgegaan door soap de beschrijving van het bericht en hoe het werd verzonden. Laten we eens kijken welke specifieke protocollen de WSDL 1.2-specificatie biedt.

Literatuur:

Khabibullin I. Sh. Ontwikkeling van webservices met behulp van Java. - St. Petersburg: BHV-Petersburg, 2003. - 400 p.: ill.

De topictitel is eigenlijk een vraag, want... Ik weet zelf niet wat het is en voor het eerst zal ik proberen ermee te werken in het kader van dit artikel. Het enige dat ik kan garanderen is dat de onderstaande code zal werken, maar mijn zinnen zullen slechts aannames en gissingen zijn over hoe ik dit zelf allemaal begrijp. Dus laten we gaan...

Invoering

We moeten beginnen met de reden waarom het concept van webservices is ontstaan. Tegen de tijd dat dit concept in de wereld verscheen, bestonden er al technologieën die het mogelijk maakten dat applicaties op afstand konden communiceren, waarbij het ene programma een methode in een ander programma kon aanroepen, dat kon worden gelanceerd op een computer in een andere stad of zelfs een ander land. Dit alles wordt afgekort als RPC (Remote Procedure Calling). Voorbeelden hiervan zijn CORBA-technologieën en voor Java - RMI (Remote Method Invoking). En alles lijkt goed te zijn in hen, vooral in CORBA, omdat... Je kunt er in elke programmeertaal mee werken, maar er ontbrak nog iets. Ik denk dat het nadeel van CORBA is dat het via een aantal van zijn eigen netwerkprotocollen werkt in plaats van via eenvoudige HTTP, die door elke firewall past. Het idee van de webservice was om een ​​RPC te maken die in HTTP-pakketten zou worden ingevoegd. Zo begon de ontwikkeling van de standaard. Wat zijn de basisconcepten van deze standaard:
  1. ZEEP. Voordat u een procedure op afstand aanroept, moet u deze aanroep beschrijven in een XML-bestand in SOAP-formaat. SOAP is simpelweg een van de vele XML-markeringen die in webservices worden gebruikt. Alles wat we via HTTP ergens heen willen sturen, wordt eerst omgezet in een XML SOAP-beschrijving, vervolgens in een HTTP-pakket gestopt en via TCP/IP naar een andere computer op het netwerk verzonden.
  2. WSDL. Er is een webservice, d.w.z. een programma waarvan de methoden op afstand kunnen worden aangeroepen. Maar de standaard vereist dat dit programma vergezeld gaat van een beschrijving die zegt: "Ja, je hebt gelijk - dit is echt een webservice en je kunt er bepaalde methoden uit oproepen." Deze beschrijving wordt weergegeven door een ander XML-bestand, dat een ander formaat heeft, namelijk WSDL. Die. WSDL is slechts een XML-bestand dat een webservice beschrijft en niets meer.
Waarom zo kort vraag je? Kun je niet specifieker zijn? Het is waarschijnlijk mogelijk, maar om dit te doen zul je boeken moeten raadplegen zoals T. Mashnin, “Java Web Services.” Daar vindt u op de eerste 200 pagina's een gedetailleerde beschrijving van elke tag van de SOAP- en WSDL-standaarden. Is het de moeite waard om te doen? Volgens mij niet, want... dit alles wordt automatisch in Java gemaakt en u hoeft alleen de inhoud te schrijven van de methoden die op afstand moeten worden aangeroepen. Er verscheen dus een API zoals JAX-RPC in Java. Als iemand het niet weet, als hij zegt dat Java een bepaalde API heeft, betekent dit dat er een pakket is met een reeks klassen die de betreffende technologie inkapselen. JAX-RPC evolueerde in de loop van de tijd van versie naar versie en werd uiteindelijk JAX-WS. WS staat duidelijk voor WebService en je zou kunnen denken dat dit tegenwoordig simpelweg een nieuwe naam is voor RPC als een populair modewoord. Dit is niet waar, omdat Nu hebben webservices afstand genomen van het oorspronkelijke idee en kunt u niet alleen externe methoden aanroepen, maar ook eenvoudigweg documentberichten in SOAP-formaat verzenden. Ik weet nog niet waarom dit nodig is; het is onwaarschijnlijk dat het antwoord hier zal zijn ‘voor het geval dat het nodig is’. Zelf zou ik graag willen leren van meer ervaren kameraden. En als laatste verscheen JAX-RS voor zogenaamde RESTful-webservices, maar dit is het onderwerp van een apart artikel. De introductie kan hier eindigen, want... Vervolgens gaan we leren werken met JAX-WS.

Algemene benadering

Bij webservices is er altijd een client en een server. De server is onze webservice en wordt soms het eindpunt genoemd (zoals in het eindpunt waar SOAP-berichten van de client aankomen). We moeten het volgende doen:
  1. Beschrijf de interface van onze webservice
  2. Implementeer deze interface
  3. Lanceer onze webservice
  4. Schrijf een client en roep op afstand de gewenste webservicemethode aan
U kunt een webservice op verschillende manieren starten: beschrijf een klasse met de hoofdmethode en start de webservice rechtstreeks als server, of implementeer deze op een server zoals Tomcat of een andere. In het tweede geval lanceren we zelf geen nieuwe server en openen we geen andere poort op de computer, maar vertellen we eenvoudigweg aan de Tomcat-servletcontainer dat “we hier webserviceklassen hebben geschreven, publiceer ze alstublieft zodat iedereen die contact met u opneemt, kan gebruik onze webservice." Ongeacht de manier waarop de webservice wordt gestart, we hebben dezelfde klant.

Server

Laten we IDEA lanceren en een nieuw project maken Nieuw project maken. Laten we de naam aangeven HalloWebService en druk op de knop Volgende en vervolgens op de knop Finish. In map src laten we een pakket maken ru.javarush.ws. In dit pakket maken we de HelloWebService-interface: package ru. Javarush. ws; // dit zijn annotaties, d.w.z. een manier om onze klassen en methoden te markeren, // met betrekking tot webservicetechnologie Javax importeren. jws. WebMethode; Javax importeren. jws. WebService; Javax importeren. jws. zeep. ZEEPbinden; // we zeggen dat onze interface zal werken als een webservice@WebService // we zeggen dat de webservice zal worden gebruikt om methoden aan te roepen@SOAPBinding (stijl = SOAPBinding. Stijl. RPC) openbare interface HelloWebService ( // we zeggen dat deze methode op afstand kan worden aangeroepen@WebMethod public String getHelloString(Stringnaam) ; ) In deze code zijn de klassen WebService en WebMethod zogenaamde annotaties en doen ze niets anders dan onze interface en de bijbehorende methode markeren als een webservice. Hetzelfde geldt voor de klasse SOAPBinding. Het enige verschil is dat SOAPBinding een annotatie met parameters is. In dit geval wordt de parameter style gebruikt met een waarde die aangeeft dat de webservice niet via documentberichten werkt, maar als een klassieke RPC, d.w.z. om de methode aan te roepen. Laten we onze interfacelogica implementeren en een HelloWebServiceImpl-klasse in ons pakket maken. Overigens merk ik op dat het beëindigen van een klasse met Impl een conventie is in Java, volgens welke de implementatie van interfaces zo wordt aangeduid (Impl - van het woord implementatie, d.w.z. implementatie). Dit is geen vereiste en je bent vrij om de klasse een naam te geven die je wilt, maar goede manieren vereisen het: pakket ru. Javarush. ws; // dezelfde annotatie als bij het beschrijven van de interface, Javax importeren. jws. WebService; // maar hier wordt het gebruikt met de parameter endpointInterface, // geeft de volledige naam aan van de interfaceklasse van onze webservice@WebService(endpointInterface= "ru.javarush.ws.HelloWebService") public class HelloWebServiceImpl implementeert HelloWebService ( @Override public String getHelloString (String-naam) ( // beantwoord gewoon de begroeting return "Hallo, " + naam + "!" ; ) ) Laten we onze webservice lanceren als een onafhankelijke server, d.w.z. zonder de deelname van Tomcat en applicatieservers (dit is een onderwerp voor een aparte discussie). Om dit te doen, in de projectstructuur in de map src Laten we een pakket ru.javarush.endpoint maken, en daarin zullen we een HelloWebServicePublisher-klasse maken met de hoofdmethode: pakket ru. Javarush. eindpunt; // klasse voor het draaien van een webserver met webservices Javax importeren. xml. ws. Eindpunt; // klasse van onze webservice import ru. Javarush. ws. HalloWebServiceImpl; public class HelloWebServicePublisher ( public static void main (String... args) ( // start de webserver op poort 1986 // en naar het adres dat is opgegeven in het eerste argument, // start de webservice die in het tweede argument is doorgegeven Eindpunt. publiceren( "http://localhost:1986/wss/hello", nieuwe HelloWebServiceImpl () ); ) ) Laten we nu deze klasse uitvoeren door te klikken Shift+F10. Er verschijnt niets in de console, maar de server draait. U kunt dit verifiëren door de regel http://localhost:1986/wss/hello?wsdl in uw browser te typen. De pagina die wordt geopend, bewijst enerzijds dat we een webserver (http://) hebben die op poort 1986 op onze computer draait (localhost), en toont anderzijds een WSDL-beschrijving van onze webservice. Als u de applicatie stopt, is de beschrijving niet meer beschikbaar, evenals de webservice zelf. We doen dit dus niet, maar gaan verder met het schrijven van de client.

Cliënt

In de projectmap src Laten we een pakket ru.javarush.client maken en daarin de klasse HelloWebServiceClient met de hoofdmethode: pakket ru. Javarush. cliënt; // nodig om de wsdl-beschrijving op te halen en er doorheen te gaan // bereik de webservice zelf java importeren. netto. URL; // deze uitzondering treedt op als u met een URL-object werkt java importeren. netto. MisvormdeURLException; // klassen om XML te parseren met wsdl-beschrijving // en bereik de servicetag erin Javax importeren. xml. naamruimte. QNaam; Javax importeren. xml. ws. Dienst; // interface van onze webservice (we hebben meer nodig) import ru. Javarush. ws. HalloWebService; public class HelloWebServiceClient ( public static void main (String args) gooit MalformedURLException ( // maak een link naar de wsdl-beschrijving URL-URL = nieuwe URL ( "http://localhost:1986/wss/hello?wsdl") ; // We kijken naar de parameters van de volgende constructor in de allereerste tag van de WSDL-beschrijving - definities // kijk naar het eerste argument in het targetNamespace-attribuut // kijk naar het tweede argument in het naamattribuut QName qname = nieuwe QName ("http://ws.javarush.ru/" , "HelloWebServiceImplService" ); // Nu kunnen we de servicetag in de wsdl-beschrijving bereiken, Servicedienst = Service. create (url, qname) ; // en dan naar de poorttag die erin is genest, zodat // ontvang een link naar een webserviceobject op afstand van ons HalloWebService hallo = service. getPort(HelloWebService.class); // Hoera! U kunt nu de externe methode aanroepen Systeem. uit. println (hallo. getHelloString ("JavaRush") ); ) ) Ik heb zoveel mogelijk commentaar gegeven op de code in de aanbieding. Ik heb niets toe te voegen, dus laten we rennen (Shift+F10). We zouden de tekst in de console moeten zien: Hallo, JavaRush! Als je het niet hebt gezien, ben je waarschijnlijk vergeten de webservice te starten.

Conclusie

Dit onderwerp bood een korte excursie naar webservices. Nogmaals, ik zal zeggen dat veel van wat ik schreef mijn inschatting is van hoe het werkt, en daarom moet je mij niet te veel vertrouwen. Ik zou dankbaar zijn als deskundige mensen mij corrigeren, want dan leer ik iets. UPD.