SOAP Web Services Tutorial: Mikä on SOAP-protokolla? ESIMERKKI
Mikä on SOAP?
SOAP on XML-pohjainen protokolla verkkopalveluihin pääsemiseen HTTP:n kautta. Siinä on joitain määrityksiä, joita voidaan käyttää kaikissa sovelluksissa.
SOAP tunnetaan nimellä Simple Object Access Protocol, mutta myöhempinä aikoina se vain lyhennettiin SOAP v1.2:ksi. SOAP on protokolla tai toisin sanoen määritelmä siitä, kuinka verkkopalvelut puhuvat keskenään tai puhuvat niitä kutsuvien asiakassovellusten kanssa.
SOAP kehitettiin välikieleksi, jotta eri ohjelmointikielille rakennetut sovellukset voisivat puhua helposti keskenään ja välttää äärimmäistä kehitystyötä.
SOAP Johdanto
Nykymaailmassa on valtava määrä sovelluksia, jotka on rakennettu eri ohjelmointikielille. Siellä voi olla esimerkiksi web-sovellus, joka on suunniteltu sisään Java, toinen .Netissä ja toinen sisään PHP.
Tietojen vaihto sovellusten välillä on ratkaisevan tärkeää nykypäivän verkottuneessa maailmassa. Mutta tiedonvaihto näiden heterogeenisten sovellusten välillä olisi monimutkaista. Niin on myös koodin monimutkaisuus tämän tiedonvaihdon suorittamiseksi.
Yksi menetelmistä tämän monimutkaisuuden torjumiseksi on käyttää XML:ää (Extensible Markup Language) välikielenä tietojen vaihtamiseen sovellusten välillä.
Jokainen ohjelmointikieli voi ymmärtää XML-kuvauskielen. Tästä syystä XML:ää käytettiin tiedonvaihdon taustalla.
XML:n käytölle ei kuitenkaan ole standardispesifikaatioita kaikissa ohjelmointikielissä tiedonvaihtoa varten. Siellä SOAP-ohjelmisto tulee mukaan.
SOAP on suunniteltu toimimaan XML:n kanssa HTTP:n kautta, ja sillä on jonkinlainen määrittely, jota voidaan käyttää kaikissa sovelluksissa. Tarkastelemme lisätietoja SOAP-protokollasta seuraavissa luvuissa.
SOAPin edut
SOAP on protokolla, jota käytetään tietojen vaihtoon sovellusten välillä. Alla on joitain syitä, miksi SOAP:ia käytetään.
- SOAP-pohjaisia verkkopalveluita kehitettäessä tarvitset jonkin verran kieltä, jota voidaan käyttää verkkopalveluissa asiakassovellusten kanssa kommunikoimiseen. SOAP on täydellinen väline, joka on kehitetty tämän tarkoituksen saavuttamiseksi. Tätä protokollaa suosittelee myös W3C-konsortio, joka on kaikkien verkkostandardien hallintoelin.
- SOAP on kevyt protokolla, jota käytetään tietojen vaihtoon sovellusten välillä. Huomaa avainsana 'valo.' Koska SOAP-ohjelmointi perustuu XML-kieleen, joka itsessään on kevyt tiedonsiirtokieli, joten SOAP protokollana kuuluu myös samaan kategoriaan.
- SOAP on suunniteltu alustariippumattomaksi ja se on suunniteltu myös käyttöjärjestelmästä riippumattomaksi. Joten SOAP-protokolla voi toimia millä tahansa ohjelmointikielipohjaisilla sovelluksilla molemmissa Windows ja Linux alustalla.
- Se toimii HTTP-protokollalla – SOAP toimii HTTP-protokollalla, joka on oletusprotokolla, jota kaikki verkkosovellukset käyttävät. Näin ollen ei tarvita minkäänlaista räätälöintiä, jotta SOAP-protokollalle rakennettuja verkkopalveluita voidaan käyttää World Wide Webissä.
SOAP-rakennuspalikat
SOAP-spesifikaatio määrittelee jotain, joka tunnetaan nimellä "SOAP viesti”, joka lähetetään verkkopalveluun ja asiakassovellukseen.
Alla oleva SOAP-arkkitehtuurin kaavio näyttää SOAP-viestin eri rakennuspalikoita.
SOAP-sanoma ei ole muuta kuin pelkkä XML-dokumentti, joka sisältää alla olevat komponentit.
- Envelope-elementti, joka tunnistaa XML-dokumentin SOAP-sanomaksi – Tämä on SOAP-sanoman sisältämä osa, ja sitä käytetään kapseloimaan kaikki SOAP-sanoman yksityiskohdat. Tämä on SOAP-viestin juurielementti.
- Otsikkoelementti, joka sisältää otsikkotiedot – Otsikkoelementti voi sisältää tietoja, kuten todennustiedot, joita kutsuva sovellus voi käyttää. Se voi myös sisältää määritelmän monimutkaisista tyypeistä, joita voidaan käyttää SOAP-sanomassa. Oletuksena SOAP-sanoma voi sisältää parametreja, jotka voivat olla yksinkertaisia, kuten merkkijonoja ja numeroita, mutta voivat olla myös monimutkaisia objektityyppiä.
Alla on esimerkki monimutkaisen tyypin SOAP-palvelusta.
Oletetaan, että halusimme lähettää strukturoidun tietotyypin, jossa on yhdistelmä "Tutorial Name" ja "Tutorial Descriptioni”, niin määrittelemme kompleksin tyypin alla esitetyllä tavalla.
Kompleksityyppi määritellään elementtitunnisteen avulla . Kaikki tarvittavat rakenteen elementit ja niiden vastaavat tietotyypit määritellään sitten monimutkaisessa tyyppikokoelmassa.
<xsd:complexType> <xsd:sequence> <xsd:element name="Tutorial Name" type="string"/> <xsd:element name="Tutorial Description" type="string"/> </xsd:sequence> </xsd:complexType>
- Body-elementti, joka sisältää soitto- ja vastaustiedot – Tämä elementti sisältää todelliset tiedot, jotka on lähetettävä verkkopalvelun ja kutsuvan sovelluksen välillä. Alla on esimerkki SOAP-verkkopalvelusta SOAP-rungosta, joka itse asiassa toimii otsikkoosiossa määritellyllä kompleksilla. Tässä on opetusohjelman nimen ja opetusohjelman vastaus Descriptioni, joka lähetetään kutsuvaan sovellukseen, joka kutsuu tätä verkkopalvelua.
<soap:Body> <GetTutorialInfo> <TutorialName>Web Services</TutorialName> <TutorialDescription>All about web services</TutorialDescription> </GetTutorialInfo> </soap:Body>
SOAP-viestirakenne
Yksi huomioitava asia on, että verkkopalvelu luo SOAP-viestit yleensä automaattisesti, kun sitä kutsutaan.
Aina kun asiakassovellus kutsuu menetelmää verkkopalvelussa, verkkopalvelu luo automaattisesti SOAP-viestin, jossa on tarvittavat tiedot tiedoista, jotka lähetetään verkkopalvelusta asiakassovellukseen.
Kuten tämän SOAP-opetusohjelman edellisessä aiheessa keskusteltiin, yksinkertaisessa SOAP-viestissä on seuraavat elementit:
- Kirjekuori-elementti
- Otsikkoelementti ja
- Kehon elementti
- Vika-elementti (valinnainen)
Katsotaanpa alla esimerkkiä yksinkertaisesta SOAP-viestistä ja katsotaan, mitä elementti todella tekee.
- Kuten yllä olevasta SOAP-sanomasta nähdään, SOAP-sanoman ensimmäinen osa on kirjekuorielementti, jota käytetään kapseloimaan koko SOAP-viesti.
- Seuraava elementti on SOAP-runko, joka sisältää varsinaisen viestin tiedot.
- Viestimme sisältää verkkopalvelun, jonka nimi on "Guru99WebService".
- "Guru99Webservice" hyväksyy parametrin, jonka tyyppi on "int", ja sen nimi on TutorialID.
Nyt yllä oleva SOAP-sanoma välitetään verkkopalvelun ja asiakassovelluksen välillä.
Näet kuinka hyödyllisiä yllä olevat tiedot ovat asiakassovellukselle. SOAP-sanoma kertoo asiakassovellukselle, mikä on verkkopalvelun nimi, ja myös mitä parametreja se odottaa ja myös minkä tyyppisiä verkkopalvelussa otetut parametrit ovat.
SOAP-kirjekuorielementti
Rakennuspalkin ensimmäinen osa on SOAP Envelope.
SOAP Envelopea käytetään SOAP-sanomien kaikkien tarvittavien yksityiskohtien kapseloimiseen, joita vaihdetaan verkkopalvelun ja asiakassovelluksen välillä.
SOAP-kirjekuorielementtiä käytetään osoittamaan SOAP-sanoman alun ja lopun. Näin verkkopalveluun soittava asiakassovellus tietää, milloin SOAP-viesti päättyy.
Seuraavat kohdat voidaan merkitä SOAP-kirjekuorielementtiin.
- Jokaisessa SOAP-sanomassa on oltava root Envelope -elementti. SOAP-viestissä on ehdottomasti oltava kirjekuorielementti.
- Jokaisessa Envelope-elementissä on oltava vähintään yksi saippuan runko-osa.
- Jos Envelope-elementti sisältää otsikkoelementin, se ei saa sisältää enempää kuin yksi, ja sen tulee esiintyä Envelope-elementin ensimmäisenä alaosana ennen body-elementtiä.
- Kirjekuori muuttuu, kun SOAP-versiot vaihtuvat.
- V1.1-yhteensopiva SOAP-prosessori luo vian vastaanottaessaan v1.2-kirjekuoren nimitilan sisältävän sanoman.
- V1.2-yhteensopiva SOAP-suoritin luo Version Mismatch -virheen, jos se vastaanottaa sanoman, joka ei sisällä v1.2-kirjekuoren nimiavaruutta.
Alla on esimerkki SOAP-sovellusliittymästä SOAP-kirjekuorielementin versiosta 1.2.
<?xml version="1.0"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2001/12/soap-envelope" SOAP-ENV:encodingStyle=" http://www.w3.org/2001/12/soap-encoding"> <soap:Body> <Guru99WebService xmlns="http://tempuri.org/"> <TutorialID>int</TutorialID> </Guru99WebService> </soap:Body> </SOAP-ENV:Envelope>
Vika-viesti
Kun pyyntö tehdään SOAP-verkkopalveluun, palautettava vastaus voi olla joko kahdessa muodossa, jotka ovat onnistunut vastaus tai virhevastaus. Kun onnistuminen on luotu, vastaus palvelimelta on aina SOAP-viesti. Mutta jos SOAP-virheitä syntyy, ne palautetaan "HTTP 2" -virheinä.
SOAP Fault -viesti koostuu seuraavista elementeistä.
- – Tämä on koodi, joka määrittää virheen koodin. Vikakoodi voi olla mikä tahansa alla olevista arvoista
- SOAP-ENV:VersionMismatch – Tämä tapahtuu, kun SOAP Envelope -elementille havaitaan virheellinen nimiavaruus.
- SOAP-ENV:MustUnderstand – Otsikko-elementin välitöntä alielementtiä, jonka mustUnderstand-attribuutti on "1", ei ymmärretty.
- SOAP-ENV:Client – Viesti oli muotoiltu väärin tai se sisälsi vääriä tietoja.
- SOAP-ENV:Palvelin – Palvelimessa oli ongelma, joten viestiä ei voitu jatkaa.
- – Tämä on tekstiviesti, joka antaa yksityiskohtaisen kuvauksen virheestä.
- (Valinnainen)– Tämä on tekstimerkkijono, joka ilmaisee vian aiheuttajan.
- (Valinnainen) – Tämä on sovelluskohtaisten virheilmoitusten elementti. Joten sovelluksella voi olla erityinen virheilmoitus eri liiketoimintalogiikkaskenaarioille.
Esimerkki vikailmoituksesta
Alla on esimerkki vikailmoituksesta. Virhe syntyy, jos skenaario, jossa asiakas yrittää käyttää menetelmää nimeltä TutorialID luokassa GetTutorial.
Alla oleva vikaviesti generoidaan, jos menetelmää ei ole määritellyssä luokassa.
<?xml version='1.0' encoding='UTF-8'?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode xsi:type="xsd:string">SOAP-ENV:Client</faultcode> <faultstring xsi:type="xsd:string"> Failed to locate method (GetTutorialID) in class (GetTutorial) </faultstring> </SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
lähtö:
Kun suoritat yllä olevan koodin, se näyttää virheen, kuten "Menetelin (GetTutorialID) paikantaminen epäonnistui luokassa (GetTutorial)"
SOAP-viestintämalli
Kaikki SOAP-viestintä tapahtuu HTTP-protokollan kautta. Ennen SOAPia, paljon verkkopalvelut käytti standardin mukaista RPC-tyyliä (Remote Procedure Call) viestintään. Tämä oli yksinkertaisin viestintätyyppi, mutta sillä oli paljon rajoituksia.
Tarkastellaan nyt tässä SOAP API -opetusohjelmassa alla olevaa kaaviota nähdäksesi kuinka tämä viestintä toimii. Tässä esimerkissä oletetaan, että palvelin isännöi verkkopalvelua, joka tarjosi kaksi menetelmää as
- Hanki Työntekijä – Tämä saisi kaikki työntekijätiedot
- SetEmployee – Tämä asettaisi yksityiskohtien, kuten työntekijöiden osaston, palkan jne., arvon vastaavasti.
Normaalissa RPC-tyylisessä viestinnässä asiakas vain kutsuu pyynnössään olevia menetelmiä ja lähettää tarvittavat parametrit palvelimelle, jonka jälkeen palvelin lähettää halutun vastauksen.
Yllä olevalla viestintämallilla on seuraavat vakavat rajoitukset
- Ei kieliriippumaton – Palvelin, joka isännöi menetelmiä, olisi tietyllä ohjelmointikielellä ja normaalisti kutsut palvelimelle olisivat vain tällä ohjelmointikielellä.
- Ei vakioprotokolla – Kun soitetaan etätoimintoon, puhelua ei soiteta vakioprotokollan kautta. Tämä oli ongelma, koska enimmäkseen kaikki verkon yli tapahtuva viestintä piti tehdä HTTP-protokollan kautta.
- palomuurit – Koska RPC-kutsut eivät kulje normaalin protokollan kautta, palvelimella on oltava auki erilliset portit, jotta asiakas voi kommunikoida palvelimen kanssa. Normaalisti kaikki palomuurit estäisivät tämänkaltaisen liikenteen, ja yleensä vaadittiin paljon konfigurointia varmistaakseen, että tällainen viestintä asiakkaan ja palvelimen välillä toimisi.
Voittaakseen kaikki edellä mainitut rajoitukset SOAP käyttäisi sitten alla olevaa viestintämallia
- Asiakas muotoilee prosessikutsua ja mahdollisia argumentteja koskevat tiedot SOAP-viestiksi ja lähettää sen palvelimelle osana HTTP-pyyntöä. Tämä prosessi tietojen kapseloimiseksi SOAP-viestiksi tunnettiin nimellä Järjestys.
- Palvelin purkaa sitten asiakkaan lähettämän viestin, näkisi mitä asiakas pyysi ja lähettää sitten asianmukaisen vastauksen takaisin asiakkaalle SOAP-viestinä. Asiakkaan lähettämän pyynnön purkamistapa tunnetaan nimellä Demarshalling.
Käytännön SOAP-esimerkki
Katsotaan nyt tässä SoapUI-opetusohjelmassa käytännöllinen SOAP-esimerkki,
Todennäköisesti yksi parhaista tavoista nähdä, kuinka SOAP-viestejä syntyy, on nähdä verkkopalvelu toiminnassa.
Tässä aiheessa tarkastellaan Microsoft.Net-kehys ASMX-verkkopalvelun rakentamiseen. Tämän tyyppinen verkkopalvelu tukee sekä SOAP-versiota 1.1 että versiota 1.2.
ASMX-verkkopalvelut luovat automaattisesti Web Service Definition Language (WSDL) asiakirja. Kutsuva asiakassovellus vaatii tämän WSDL-dokumentin, jotta sovellus tietää, mihin verkkopalvelu pystyy.
Esimerkissämme aiomme luoda yksinkertaisen verkkopalvelun, jota käytetään palauttamaan merkkijono verkkopalvelua kutsuvalle sovellukselle.
Tätä verkkopalvelua isännöidään Asp.Net verkkosovellus. Tämän jälkeen käynnistämme verkkopalvelun ja näemme verkkopalvelun palauttaman tuloksen.
Visual Studio näyttää myös, mitä SOAP-viestiä verkkopalvelun ja kutsuvan sovelluksen välillä välitetään.
Ensimmäinen ennakkoedellytys verkkopalvelusovelluksemme asentamiselle, joka voidaan tehdä seuraamalla alla olevia ohjeita.
Varmista, että järjestelmääsi on asennettu Visual Studio 2013 tätä esimerkkiä varten.
Vaihe 1) Ensimmäinen askel on luoda tyhjä ASP.Net-verkkosovellus. Napsauta Visual Studio 2013:ssa valikkovaihtoehtoa Tiedosto-> Uusi projekti.
Kun napsautat Uusi projekti -vaihtoehtoa, Visual Studio antaa sinulle toisen valintaikkunan, jossa voit valita projektin tyypin ja antaa tarvittavat tiedot projektista. Tämä selitetään seuraavassa vaiheessa.
Vaihe 2) Tässä vaiheessa
- Varmista, että valitset ensin C# ASP.NET-verkkosovelluksen web-malli. Projektin on oltava tämän tyyppinen SOAP-palveluprojektin luomiseksi. Valitsemalla tämän vaihtoehdon Visual Studio suorittaa sitten tarvittavat vaiheet minkä tahansa verkkopohjaisen sovelluksen vaatimien tiedostojen lisäämiseksi.
- Anna projektillesi nimi, joka meidän tapauksessamme on annettu nimellä webservice.asmx. Varmista sitten, että annat sijainti, johon projektitiedostot tallennetaan.
Kun olet valmis, näet Visual Studio 2013:n Solution Explorerissa luodun projektitiedoston.
Vaihe 3) Tässä vaiheessa
Aiomme lisätä verkkopalvelutiedoston projektiimme
- Napsauta ensin hiiren kakkospainikkeella projektitiedostoa alla olevan kuvan mukaisesti
- Kun napsautat projektitiedostoa hiiren kakkospainikkeella, voit valita vaihtoehdon "Lisää->Web Service (ASMX) lisätäksesi verkkopalvelutiedoston. Anna verkkopalvelun nimitiedostolle Tutorial Servicen nimi.
Vaihe 4) Lisää seuraava koodi Tutorial Service asmx-tiedostoosi.
Koodin selitys:
- Tämä koodirivi antaa nimen verkkopalvelutiedostollesi. Tämä on tärkeä askel, koska sen avulla asiakassovellus voi soittaa verkkopalveluun verkkopalvelun nimen kautta.
- Normaalisti luokkatiedostoa käytetään kapseloimaan verkkopalvelun toimivuus. Joten luokkatiedostossa on kaikkien verkkomenetelmien määritelmä, jotka tarjoavat joitain toimintoja asiakassovellukselle.
- Tässä [WebMethod] tunnetaan attribuuttina, joka kuvaa funktiota. Seuraava vaihe luo funktion nimeltä "Guru99WebService", mutta tämän [WebMethod]-attribuutin lisäämisen vaiheen sisällyttäminen varmistaa, että asiakassovellus voi kutsua tämän menetelmän. Jos tämä attribuutti ei ole paikallaan, asiakassovellus ei voi koskaan kutsua menetelmää.
- Tässä määrittelemme funktion nimeltä 'Guru99WebService', jota käytetään palauttamaan merkkijono kutsuvalle asiakassovellukselle. Tämä toiminto on verkkopalvelu, jota voi kutsua mikä tahansa asiakassovellus.
- Käytämme return-lausetta palauttaaksemme merkkijonon "Tämä on Guru99-verkkopalvelu" asiakassovellukseen.
Jos koodi suoritetaan onnistuneesti, seuraava tulos näytetään, kun suoritat koodin selaimessa.
lähtö:
- Tulos osoittaa selvästi, että verkkopalvelumme nimi on "Guru99 Web Service", joka on seurausta verkkopalvelullemme nimen antamisesta.
- Voimme myös nähdä, että voimme kutsua verkkopalvelun. Jos napsautamme Invoke-painiketta, saamme alla olevan vastauksen verkkoselaimeen.
Yllä oleva tulos,
- Se osoittaa selvästi, että kutsumalla web-menetelmää merkkijono "Tämä on Guru99-verkkopalvelu" palautetaan.
- Visual Studion avulla voit myös tarkastella SOAP-viestipyyntöä ja vastausta, joka syntyy, kun yllä olevaa verkkopalvelua kutsutaan.
Alla näkyy SOAP-pyyntö, joka syntyy, kun verkkopalvelua kutsutaan.
Koodin selitys:
- SOAP-sanoman ensimmäinen osa on kirjekuorielementti, jota käsiteltiin edellisissä luvuissa. Tämä on kapseloiva elementti, joka on läsnä jokaisessa SOAP-sanomassa.
- SOAP Body on seuraava elementti ja sisältää SOAP-sanoman todelliset tiedot.
- Kolmas osa on elementti, joka määrittää, että haluamme kutsua palvelua nimeltä "Guru99WebService".
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soap:Body> <Guru99WebServiceResponse xmlns="http://tempuri.org/"> <Guru99WebServiceResult>string</Guru99WebServiceResult> </Guru99WebServiceResponse> </soap:Body> </soap:Envelope>
Koodin selitys:
- SOAP-sanoman ensimmäinen osa on kirjekuorielementti, jota käsiteltiin edellisissä luvuissa. Tämä on kapseloiva elementti, joka on läsnä jokaisessa SOAP-sanomassa.
- SOAP Body on seuraava elementti ja sisältää SOAP-sanoman todelliset tiedot.
- Mielenkiintoinen osa, jonka näet nyt, on "string"-attribuutti. Tämä kertoo asiakassovellukselle, että kutsuttava verkkopalvelu palauttaa merkkijonon tyyppisen objektin. Tämä on erittäin hyödyllistä, koska jos asiakassovellus, joka ei muuten tietäisi, mitä verkkopalvelu palauttaa.
Yhteenveto
- SOAP on protokolla, jota käytetään tietojen vaihtamiseen eri sovelluksille rakennettujen sovellusten välillä ohjelmointikielet.
- SOAP on rakennettu XML-spesifikaatiolle ja toimii HTTP-protokollan kanssa. Tämä tekee siitä täydellisen käytettäväksi verkkosovelluksissa.
- SOAP-rakennuspalikat koostuvat SOAP-viestistä. Jokainen SOAP-sanoma koostuu kirjekuorielementistä, otsikosta ja runko-osasta.
- Kirjekuorielementti on pakollinen elementti SOAP-sanomassa, ja sitä käytetään kapseloimaan kaikki SOAP-sanoman tiedot.
- Otsikkoelementtiä voidaan käyttää sisältämään tietoja, kuten todennustietoja tai monimutkaisten tietotyyppien määrittelyä.
- Runkoelementti on pääelementti, joka sisältää verkkomenetelmien määritelmän sekä tarvittaessa parametritiedot.