Çfarë është SOAP? Për shembull, ekziston një shërbim i hapur në internet i quajtur belavia.

Këtu në LeaseWeb, ne punojmë shumë me shërbimet e internetit SOAP për të integruar aplikacionet tona të brendshme me njëri-tjetrin. Sidomos gjatë zhvillimit dhe testimit të aplikacioneve tona pasi na duhet aftësia për të praktikuar me SOAP API.

$ curl -sS http://leaseweb.github.io/php-soap-client/installer | php

Kjo do të shkarkojë skedarin phar në drejtorinë aktuale të punës dhe do ta bëjë atë të ekzekutueshëm, në mënyrë që të mund ta përdorni, filloni ta përdorni menjëherë duke thirrur:

$ ./soap_client

Për të instaluar versionin më të fundit master, mund ta merrni kodin burim direkt nga GitHub, të paketoni skedarin tuaj .phar dhe ta instaloni - duke përdorur GNU Make.
Në mënyrë që të mund të krijoni skedarin .phar duhet të keni të instaluar kompozitorin. Për të lexuar më shumë rreth kompozitorit, referojuni dokumentacionit të tyre të shkëlqyer.

# Instalo klientin e sapunit php $ klon git https://github.com/LeaseWeb/php-soap-client.git $ cd php-soap-client $ composer.phar instalo $ bëj $ sudo bëj instalimin

Nëse po merrni një përjashtim të Dështuar në përpilimin e phar gjatë ekzekutimit, duhet të vendosni phar.readonly = Off në php.ini tuaj. Në një makinë zhvillimi kjo është mirë të bëhet, por ju lutemi të jeni të vetëdijshëm për rreziqet e sigurisë kur vendosni phar.readonly në Off.

Komanda e mësipërme make install do të instalojë aplikacionin soap_client në /usr/local/bin dhe do ta bëjë atë të ekzekutueshëm në mënyrë që ta quani lehtësisht si kjo:

$ soap_client php-soap-client version 2.1.3 Përdorimi: komanda Opsionet: ... Komandat e disponueshme: telefononi Telefononi shërbimin në distancë me "metodën" të specifikuar dhe nxirrni përgjigjen në stdout. ndihmë Shfaq ndihmën për një listë komande Lista e komandave metoda-metoda Merrni një listë të metodave të disponueshme për të thirrur në telekomandë. kërkesa Gjeneroni një kërkesë SOAP të formatuar xml për metodën e dhënë dhe dalje në stdout. wsdl Merrni WSDL-në e një shërbimi sapuni.

Nga kjo pikë e tutje ne supozojmë se keni instaluar soap_client.phar në sistemin tuaj në /usr/local/bin/soap_client dhe se drejtoria /urs/local/bin është në $PATH tuaj.

Le të themi se do të donim të shihnim se cilat metoda janë të disponueshme në shërbimin në distancë http://www.webservicex.net/ConvertTemperature.asmx. Ne mund të lëshojmë komandën e mëposhtme:

Metodat e listës $ soap_client --endpoint="http://www.webservicex.net/ConvertTemperature.asmx?WSDL"

Që do të nxjerrë sa vijon:

ConvertTemp

Nëse e ekzekutoni komandën e mësipërme me opsionin -vvv, do të merrni rezultate më të hollësishme.
Në këtë rast, metoda e vetme e disponueshme është ConvertTemp. Le të shohim se si duket një kërkesë SOAP XML për këtë metodë:

$ soap_client --endpoint="http://www.webservicex.net/ConvertTemperature.asmx?WSDL" kërkesë ConvertTemp 0

Nëse dëshironi të bëni një kërkesë SOAP në metodën ConvertTemp në shërbimin në distancë, përdorni nënkomandën e thirrjes:

$ soap_client --endpoint="http://www.webservicex.net/ConvertTemperature.asmx?WSDL" thirrje --redaktor ConvertTemp

Vini re opsionin --editor pas nënkomandës së thirrjes. Nëse përdorni flamurin --editor, soap_client do të hapë redaktorin e specifikuar në variablin e mjedisit tuaj $EDITOR, në mënyrë që të jeni në gjendje të modifikoni kërkesën XML përpara se ta dërgoni.

Nëse lëshoni të njëjtën kërkesë disa herë, mund të ruani një kërkesë sapuni si një skedar XML lokal dhe ta kaloni atë te /dev/stdin e komandës së thirrjes soap_client:

# Merrni kërkesën xml dhe ruajeni atë në nivel lokal $ soap_client --endpoint="http://www.webservicex.net/ConvertTemperature.asmx?WSDL" kërkesa ConvertTemp > my_sample_request.xml # Tani modifikoni my_sample_request.xml # Tani mund të telefononi Metoda ConvertTemp me këtë kërkesë të parapërgatitur $ soap_client --endpoint="http://www.webservicex.net/ConvertTemperature.asmx?WSDL" telefononi ConvertTemp< my_sample_request.xml

Meqenëse do të përsërisni shpesh komandat e soap_client në një kohë të shkurtër gjatë eksplorimit të një shërbimi ueb në distancë, mund t'i kurseni vetes pak kohë duke vendosur një variabël mjedisi SOAPCLIENT_ENDPOINT që përmban URL-në e WSDL. Kur vendoset kjo ndryshore e mjedisit, mund të hiqni opsionin e linjës komanduese --endpoint. Le ta bëjmë këtë tani dhe të thërrasim metodën ConvertTemp:

$ eksporto SOAPCLIENT_ENDPOINT="http://www.webservicex.net/ConvertTemperature.asmx?WSDL" $ thirrja e klientit të sapunit ConvertTemp< my_sample_request.xml

Doja të dija se sa është 107.6 gradë Fahrenheit në Celsius, kështu që my_sample_request.xml përmban:

$ cat my_sample_request.xml 107.6 gradë Fahrenheit gradë Celsius

$ soap_client telefononi ConvertTemp< my_sample_request.xml stdClass Object ( => 42)

Përgjigja është 42.

Nëse më mirë i shihni përgjigjet në formatin XML, mund të përdorni opsionin e linjës së komandës --xml:

thirrje $ soap_client --xml ConvertTemp< my_sample_request.xml 42

Ky tutorial duhet t'ju japë informacion të mjaftueshëm për të filluar me eksplorimin, testimin dhe/ose zhvillimin e SOAP API-ve.
Në një postim të ardhshëm në blog, do të vazhdoj temën e klientit të sapunit php. Aktualisht jemi duke punuar në paketimin e arkivit .phar për ueb.

  • Tutorial

Pershendetje te gjitheve!
Kështu ndodhi që kohët e fundit fillova të zhvilloj shërbime në internet. Por sot tema nuk ka të bëjë me mua, por se si mund të shkruajmë shërbimin tonë në internet XML bazuar në protokollin SOAP 1.2.

Shpresoj që pasi të keni lexuar temën do të jeni në gjendje të:

  • shkruani zbatimin e serverit tuaj të një aplikacioni në internet;
  • shkruani zbatimin tuaj të klientit të një aplikacioni në internet;
  • shkruani përshkrimin tuaj të shërbimit të internetit (WSDL);
  • dërgoni vargjet e klientit të të njëjtit lloj të dhënash në server.
Siç mund ta keni marrë me mend, e gjithë magjia do të bëhet duke përdorur PHP dhe klasat e integruara SoapClient dhe SoapServer. Lepuri ynë do të jetë një shërbim për dërgimin e mesazheve SMS.

1 Deklarata e problemit

1.1 Kufijtë

Në fillim, unë propozoj të merremi me rezultatin që do të arrijmë në fund të temës. Siç u njoftua më lart, do të shkruajmë një shërbim për dërgimin e mesazheve SMS dhe më saktë do të marrim mesazhe nga burime të ndryshme përmes protokollit SOAP. Pas së cilës, ne do të shqyrtojmë se në çfarë forme vijnë në server. Procesi i radhës së mesazheve për dërgim të mëtejshëm te ofruesi, për fat të keq, është përtej qëllimit të këtij postimi për shumë arsye.

1.2 Çfarë të dhënash do të ndryshojmë?

E shkëlqyeshme, ne kemi vendosur për kufijtë! Hapi tjetër që duhet të ndërmerret është të vendosim se çfarë të dhënash do të shkëmbejmë ndërmjet serverit dhe klientit. Në këtë temë, unë sugjeroj të mos i ndani flokët për një kohë të gjatë dhe t'i përgjigjeni menjëherë pyetjeve kryesore për veten tuaj:
  • Çfarë të dhënash minimale duhet t'i dërgohen serverit për t'i dërguar një mesazh SMS një pajtimtari?
  • Çfarë të dhënash minimale duhet të dërgohen nga serveri për të kënaqur nevojat e klientit?
Diçka më thotë se për këtë ju duhet të dërgoni sa vijon:
  • numrin e telefonit celular dhe
  • tekstin e mesazhit SMS.
Në parim, këto dy karakteristika janë të mjaftueshme për të dërguar, por unë imagjinoj menjëherë rastin e një SMS me urime për ditëlindjen që ju vjen në orën 3 të mëngjesit, ose 4! Në këtë moment, do t'u jem shumë mirënjohës të gjithëve që nuk më kanë harruar! Prandaj, ne gjithashtu do të dërgojmë në server dhe
  • data e dërgimit të mesazhit SMS.
Gjëja tjetër që do të doja t'i dërgoja serverit është:
  • Lloji i mesazhit.
Ky parametër nuk është i detyrueshëm, por mund të jetë shumë i dobishëm për ne nëse shpejt duhet t'i tregojmë shefit se sa prej klientëve tanë kemi "kënaqur" me lajmet tona, dhe gjithashtu të nxjerrim disa statistika të bukura për këtë çështje.

E megjithatë, harrova diçka! Nëse reflektojmë pak më shumë, vlen të theksohet se klienti mund të dërgojë në server ose një mesazh SMS ose një numër prej tyre në të njëjtën kohë. Me fjalë të tjera, një paketë e të dhënave mund të përmbajë mesazhe nga një deri në pafundësi.

Si rezultat, marrim se për të dërguar një mesazh SMS na duhen të dhënat e mëposhtme:

  • Numrin e telefonit celular,
  • Teksti i mesazhit SMS,
  • koha e dërgimit të mesazhit SMS tek pajtimtari,
  • lloji i mesazhit.

Ne i jemi përgjigjur pyetjes së parë, tani duhet t'i përgjigjemi pyetjes së dytë. Dhe ndoshta do ta lejoj veten të ngatërroj pak. Prandaj, nga serveri do të dërgojmë vetëm të dhëna Boolean, kuptimi i të cilave ka këtë kuptim:

  • E VËRTETË – paketa arriti me sukses te serveri, kaloi vërtetimin dhe ra në radhë për t'u dërguar te ofruesi i SMS-ve
  • E rreme - në të gjitha rastet e tjera

Kjo përfundon përshkrimin e deklaratës së problemit! Dhe së fundi, le të zbresim në pjesën argëtuese - le të kuptojmë se çfarë lloj bishë e çuditshme është ky sapun!

2 Çfarë është SOAP?

Në përgjithësi, fillimisht nuk kisha në plan të shkruaja asgjë për atë që është SOAP dhe doja të kufizohesha në lidhjet në faqen e internetit w3.org me specifikimet e nevojshme, si dhe lidhjet me Wikipedia. Por në fund vendosa të shkruaj një shënim të shkurtër për këtë protokoll.

Dhe unë do ta filloj historinë time me faktin se ky protokoll i shkëmbimit të të dhënave i përket një nëngrupi të protokolleve të bazuara në të ashtuquajturën paradigmë RPC (Remote Procedure Call), antipodi i së cilës është REST (Representational State Transfer). Mund të lexoni më shumë rreth kësaj në Wikipedia; lidhjet me artikujt janë në fund të temës. Nga këta artikuj, duhet të kuptojmë sa vijon: “Qasja RPC lejon përdorimin e një numri të vogël burimesh rrjeti me një numër të madh metodash dhe një protokoll kompleks. Me qasjen REST, numri i metodave dhe kompleksiteti i protokollit janë rreptësisht të kufizuara, që do të thotë se numri i burimeve individuale mund të jetë i madh.” Kjo do të thotë, në lidhje me ne, kjo do të thotë që në rastin e qasjes RPC në sit do të ketë gjithmonë një hyrje (lidhje) në shërbim dhe çfarë procedure të thërrasim për të përpunuar të dhënat hyrëse që transferojmë së bashku me të dhënat, ndërsa me qasjen REST në faqen tonë Faqja ka shumë hyrje (lidhje), secila prej të cilave pranon dhe përpunon vetëm të dhëna të caktuara. Nëse dikush që lexon e di se si ta shpjegojë ndryshimin në këto qasje edhe më thjesht, sigurohuni që të shkruani në komente!

Gjëja tjetër që duhet të dimë për SOAP është se ky protokoll përdor të njëjtin XML si transport, i cili nga njëra anë është shumë i mirë, sepse Arsenali ynë përfshin menjëherë fuqinë e plotë të një grumbulli teknologjish të bazuara në këtë gjuhë shënjimi, përkatësisht XML-Schema - një gjuhë për përshkrimin e strukturës së një dokumenti XML (faleminderit Wikipedia!), e cila lejon vërtetimin automatik të të dhënave të marra nga serveri nga klientët.

Dhe kështu, tani e dimë se SOAP është një protokoll i përdorur për të zbatuar thirrjet e procedurave në distancë dhe përdor XML si një transport! Nëse e lexoni artikullin në Wikipedia, mund të mësoni gjithashtu nga atje se ai mund të përdoret mbi çdo protokoll të nivelit të aplikacionit, dhe jo vetëm në kombinim me HTTP (për fat të keq, në këtë temë do të shqyrtojmë vetëm SOAP mbi HTTP). Dhe e dini se çfarë më pëlqen më shumë nga e gjithë kjo? Nëse nuk ka supozime, atëherë do të jap një sugjerim - SOAP!... Ende nuk ka supozime?... Jeni i sigurt që e keni lexuar artikullin në Wikipedia?... Në përgjithësi, nuk do t'ju torturoj më tej. Prandaj, do të shkoj drejtpërsëdrejti te përgjigjja: "SOAP (nga Protokolli anglisht i qasjes së objekteve të thjeshta - i thjeshtë protokoll aksesi në objekte; deri në specifikimin 1.2)". Gjëja më e shquar në lidhje me këtë rresht është në kursive! Nuk e di se çfarë përfundimesh keni nxjerrë nga e gjithë kjo, por shoh sa vijon - pasi ky protokoll nuk mund të quhet në asnjë mënyrë "i thjeshtë" (dhe me sa duket edhe w3 pajtohet me këtë), atëherë nga versioni 1.2 ai pushoi së deshifruari disi ! Dhe u bë i njohur si SOAP, vetëm SOAP, pikë.

Epo, mirë, ju lutem më falni, u anova pak. Siç shkrova më herët, XML përdoret si transport, dhe paketat që udhëtojnë midis klientit dhe serverit quhen zarfe SOAP. Nëse keni parasysh strukturën e përgjithshme të zarfit, do t'ju duket shumë e njohur, sepse... i ngjan strukturës së një faqe HTML. Ajo ka një seksion kryesor - mbështjell, i cili përfshin seksione Kreu Dhe Trupi, ose Faji. NË Trupi të dhënat transmetohen dhe është pjesë e detyrueshme e zarfit, ndërsa Kreuështë fakultative. NË Kreu autorizimi ose çdo e dhënë tjetër që nuk lidhet drejtpërdrejt me të dhënat hyrëse të procedurave të shërbimit të internetit mund të transmetohet. Rreth Faji nuk ka asgjë të veçantë për të thënë, përveç që vjen tek klienti nga serveri në rast të ndonjë gabimi.

Këtu përfundon historia ime e rishikimit në lidhje me protokollin SOAP (ne do t'i shikojmë vetë zarfet dhe strukturën e tyre në mënyrë më të detajuar kur klienti dhe serveri ynë më në fund të mësojnë t'i ekzekutojnë ato me njëri-tjetrin) dhe fillon një i ri - në lidhje me shoqëruesin SOAP të quajtur WSDL(Gjuha e përshkrimit të shërbimeve të internetit). Po, po, kjo është pikërisht ajo gjë që na frikëson shumë prej nesh nga përpjekjet për të zbatuar API-në tonë në këtë protokoll. Si rezultat, ne zakonisht rishpikim timonin tonë me JSON si transport. Pra, çfarë është WSDL? WSDL është një gjuhë për përshkrimin e shërbimeve në internet dhe aksesin në to, bazuar në gjuhën XML (c) Wikipedia. Nëse ky përkufizim nuk ju bën të qartë të gjithë kuptimin e shenjtë të kësaj teknologjie, atëherë do të përpiqem ta përshkruaj me fjalët e mia!

WSDL është krijuar për të lejuar klientët tanë të komunikojnë normalisht me serverin. Për ta bërë këtë, skedari me shtesën "*.wsdl" përshkruan informacionin e mëposhtëm:

  • Cilat hapësira emrash janë përdorur?
  • Cilat skema të të dhënave janë përdorur?
  • Çfarë lloj mesazhesh pret shërbimi në internet nga klientët?
  • Cilat të dhëna u përkasin procedurave të shërbimit në internet,
  • Çfarë procedurash përmban shërbimi në internet?
  • Si duhet të thërrasë klienti procedurat e shërbimit në internet,
  • Në cilën adresë duhet të dërgohen telefonatat e klientëve?
Siç mund ta shihni, ky skedar është i gjithë shërbimi në internet. Duke specifikuar adresën e skedarit WSDL në klient, ne do të dimë gjithçka për çdo shërbim në internet! Si rezultat, nuk kemi nevojë të dimë absolutisht asgjë se ku ndodhet vetë shërbimi në internet. Gjithçka që duhet të dini është vendndodhja e skedarit të tij WSDL! Së shpejti do të zbulojmë se SOAP-i nuk është aq i frikshëm sa thonë fjalët e urta ruse.

3 Hyrje në XML-Skema

Tani ne dimë shumë për atë që është SOAP, çfarë është brenda tij dhe kemi një përmbledhje të grumbullit të teknologjisë që e rrethon atë. Meqenëse, para së gjithash, SOAP është një metodë ndërveprimi midis një klienti dhe një serveri, dhe gjuha e shënjimit XML përdoret si një transport për të, në këtë seksion do të kuptojmë pak se si ndodh vërtetimi automatik i të dhënave duke përdorur skemat XML.

Detyra kryesore e diagramit është të përshkruajë strukturën e të dhënave që do të përpunojmë. Të gjitha të dhënat në skemat XML ndahen në thjeshtë(skalar) dhe komplekse(strukturat) llojet. Llojet e thjeshta përfshijnë llojet e mëposhtme:

  • linjë,
  • numri,
  • vlera boolean,
  • datën e.
Diçka shumë e thjeshtë që nuk ka zgjatime brenda. Antipodi i tyre është i llojeve komplekse komplekse. Shembulli më i thjeshtë i një lloji kompleks që vjen në mendjen e të gjithëve janë objektet. Për shembull, një libër. Libri përbëhet nga vetitë: autor, Emri, çmimi, Numri ISBN etj. Dhe këto veti, nga ana tjetër, mund të jenë ose lloje të thjeshta ose komplekse. Dhe detyra e skemës XML është të përshkruajë këtë.

Unë sugjeroj të mos shkoni larg dhe të shkruani një skemë XML për mesazhin tonë SMS! Më poshtë është përshkrimi xml i mesazhit SMS:

71239876543 Mesazh testues 2013-07-20T12:00:00 12
Diagrami ynë kompleks i tipit do të duket si ky:


Kjo hyrje lexohet si më poshtë: Ne kemi një ndryshore " mesazh"type" Mesazh"dhe ekziston një lloj kompleks i quajtur" Mesazh", i cili përbëhet nga një grup elementësh vijues" telefon"type varg, « teksti"type varg, « datë"type dataKoha, « lloji"type dhjetore. Këto lloje janë të thjeshta dhe janë përcaktuar tashmë në përshkrimin e skemës. urime! Ne sapo shkruam skemën tonë të parë XML!

Unë mendoj se kuptimi i elementeve " element"Dhe" kompleks Lloji"Gjithçka është bërë pak a shumë e qartë për ju, kështu që ne nuk do të përqendrohemi më tek ata dhe le të kalojmë drejtpërdrejt te elementi i kompozitorit" sekuencë" Kur përdorim elementin kompozitor " sekuencë“Ju informojmë se elementët e përfshirë në të duhet të jenë gjithmonë të vendosura në sekuencën e përcaktuar në diagram dhe të gjithë janë të detyrueshëm. Por mos u dëshpëroni! Ekzistojnë dy elementë të tjerë kompozitor në skemat XML: " zgjedhje"Dhe" të gjitha" Kompozitor " zgjedhje" njofton se duhet të jetë një nga elementët e renditur në të, dhe kompozitori " të gjitha» – çdo kombinim i elementeve të listuara.

Siç e mbani mend, në pjesën e parë të temës ne ramë dakord që mesazhet SMS nga një deri në pafundësi mund të transmetohen në një paketë. Prandaj, unë propozoj të kuptoj se si deklarohen të dhëna të tilla në skemën XML. Struktura e përgjithshme e paketës mund të duket si kjo:

71239876543 Mesazh testues 1 2013-07-20T12:00:00 12 71239876543 Mesazh testues N 2013-07-20T12:00:00 12
Diagrami për një lloj kaq kompleks do të duket si ky:


Blloku i parë përmban deklaratën e njohur të llojit kompleks " Mesazh" Nëse e keni vënë re, atëherë në çdo lloj të thjeshtë të përfshirë në " Mesazh", janë shtuar atribute të reja sqaruese" min Ndodh"Dhe" maxNdodh" Siç mund ta merrni me mend nga emri, i pari ( min Ndodh) tregon se kjo sekuencë duhet të përmbajë të paktën një element të tipit " telefon», « teksti», « datë"Dhe" lloji", ndërsa tjetra ( maxNdodh) atributi na deklaron se ekziston maksimumi një element i tillë në sekuencën tonë. Si rezultat, kur shkruajmë skemat tona për çdo të dhënë, na jepet zgjedhja më e gjerë se si t'i konfigurojmë ato!

Blloku i dytë i diagramit deklaron elementin " Lista e mesazheve"type" Lista e mesazheve" Është e qartë se " Lista e mesazheve"është një lloj kompleks që përmban të paktën një element" mesazh", por numri maksimal i elementeve të tillë nuk është i kufizuar!

4 Shkruani WSDL-në tuaj

A ju kujtohet se WSDL është shërbimi ynë në internet? Shpresoj se ju kujtohet! Ndërsa e shkruajmë, shërbimi ynë i vogël në internet do të funksionojë në të. Prandaj, unë sugjeroj të mos ngatërroni.

Në përgjithësi, në mënyrë që gjithçka të funksionojë si duhet për ne, duhet të transferojmë një skedar WSDL me llojin e duhur MIME te klienti. Për ta bërë këtë, ju duhet të konfiguroni serverin tuaj të internetit në përputhje me rrethanat, përkatësisht, vendosni llojin MIME për skedarët me shtrirjen "*.wsdl" në rreshtin e mëposhtëm:

Aplikacioni/wsdl+xml
Por në praktikë, unë zakonisht dërgoja kokën HTTP përmes PHP " tekst/xml»:

Header("Lloji i përmbajtjes: tekst/xml; charset=utf-8");
dhe gjithçka funksionoi shkëlqyeshëm!

Dua t'ju paralajmëroj menjëherë se shërbimi ynë i thjeshtë në internet do të ketë një përshkrim mjaft mbresëlënës, ndaj mos u shqetësoni, sepse... Pjesa më e madhe e tekstit është ujë i detyrueshëm dhe, pasi e keni shkruar një herë, mund ta kopjoni vazhdimisht nga një shërbim ueb në tjetrin!

Meqenëse WSDL është XML, ju duhet të shkruani për këtë drejtpërdrejt në rreshtin e parë. Elementi rrënjë i skedarit duhet të quhet gjithmonë " përkufizimet»:


Në mënyrë tipike, WSDL përbëhet nga 4-5 blloqe kryesore. Blloku i parë është përcaktimi i një shërbimi në internet ose, me fjalë të tjera, pika hyrëse.


Këtu thotë se ne kemi një shërbim të quajtur - " Shërbimi SMS" Në parim, të gjithë emrat në skedarin WSDL mund të ndryshohen nga ju në çfarëdo që dëshironi, sepse ata nuk luajnë absolutisht asnjë rol.

Pas kësaj ju njoftojmë se në shërbimin tonë të internetit " Shërbimi SMS" ka një pikë hyrje ("port") të quajtur " SmsServicePort" Pikërisht në këtë pikë hyrëse do të dërgohen të gjitha kërkesat nga klientët në server. Dhe tregoni në elementin " adresë» lidhjen me skedarin mbajtës që do të pranojë kërkesat.

Pasi të kemi përcaktuar shërbimin në internet dhe të kemi specifikuar pikën hyrëse për të, duhet të lidhim procedurat e mbështetura me të:


Për ta bërë këtë, ai liston se cilat operacione dhe në çfarë forme do të quhen. ato. per port" SmsServicePort"një lidhje është përcaktuar nën emrin" SMSServiceBinding", e cila ka një lloj telefonate" rpc"dhe HTTP përdoret si protokoll transmetimi. Kështu, ne treguam këtu se do të bëjmë një thirrje RPC mbi HTTP. Pas kësaj ne përshkruajmë se cilat procedura ( operacion) mbështeten në shërbimin në internet. Ne do të mbështesim vetëm një procedurë - " dërgoni SMS" Nëpërmjet kësaj procedure mesazhet tona të mrekullueshme do të dërgohen në server! Pasi të jetë deklaruar procedura, është e nevojshme të tregohet se në çfarë forme do të transmetohen të dhënat. Në këtë rast, tregohet se do të përdoren zarfe standarde SOAP.

Pas kësaj, ne duhet të lidhim procedurën me mesazhet:


Për ta bërë këtë, ne specifikojmë që lidhja jonë është e llojit " SmsServicePortType"dhe në elementin" Lloji i portit“Me emrin e të njëjtit lloj, ne tregojmë lidhjen e procedurave me mesazhet. Dhe kështu, mesazhi në hyrje (nga klienti në server) do të quhet " dërgoniSmsKërkesë", dhe në dalje (nga serveri në klient) " dërgoniSmsResponse" Si të gjithë emrat në WSDL, emrat e mesazheve hyrëse dhe dalëse janë arbitrare.

Tani duhet të përshkruajmë vetë mesazhet, d.m.th. hyrëse dhe dalëse:


Për ta bërë këtë ne shtojmë elementet " mesazh"me emra" dërgoniSmsKërkesë"Dhe" dërgoniSmsResponse"përkatësisht. Në to tregojmë se hyrja duhet të jetë një zarf, struktura e të cilit korrespondon me llojin e të dhënave " Kërkesë" Pas së cilës kthehet një zarf nga serveri që përmban llojin e të dhënave - " Përgjigje».

Tani duhet të bëjmë vetëm pak - të shtojmë një përshkrim të këtyre llojeve në skedarin tonë WSDL! Dhe si mendoni se WSDL i përshkruan të dhënat hyrëse dhe dalëse? Unë mendoj se ju keni kuptuar tashmë gjithçka shumë kohë më parë dhe i keni thënë vetes se përdorni skemat XML! Dhe do të keni absolutisht të drejtë!


Mund të na përgëzoni! WSDL-ja jonë e parë është shkruar! Dhe ne jemi një hap më afër arritjes së qëllimit tonë.
Më pas, do të shohim se çfarë na ofron PHP për zhvillimin e aplikacioneve tona të shpërndara.

5 Serveri ynë i parë SOAP

Më herët kam shkruar se për të krijuar një server SOAP në PHP do të përdorim klasën e integruar SoapServer. Në mënyrë që të gjitha veprimet e mëtejshme të ndodhin në të njëjtën mënyrë si për mua, do t'ju duhet të ndryshoni pak PHP-në tuaj. Për të qenë edhe më të saktë, duhet të siguroheni që të keni të instaluar shtesën “php-soap”. Është më mirë të lexoni se si ta instaloni atë në serverin tuaj të internetit në faqen zyrtare të PHP-së (shih listën e referencave).

Pasi të jetë instaluar dhe konfiguruar gjithçka, do të na duhet të krijojmë një skedar në dosjen rrënjë të hostit tuaj " smsservice.php» me përmbajtjen e mëposhtme:

setClass ("SoapSmsGateWay"); //Fillimi i serverit $server->handle();
Shpresoj se nuk ka nevojë të shpjegojë se çfarë është mbi vijën me funksionin "ini_set". Sepse aty përcaktohet se cilat tituj HTTP do t'i dërgojmë nga serveri te klienti dhe konfigurohet mjedisi. Në rreshtin me "ini_set" ne çaktivizojmë ruajtjen e skedarit WSDL në mënyrë që ndryshimet tona në të të hyjnë në fuqi menjëherë te klienti.

Tani kemi ardhur te serveri! Siç mund ta shihni, i gjithë serveri SOAP merr vetëm tre rreshta! Në rreshtin e parë, ne krijojmë një shembull të ri të objektit SoapServer dhe ia kalojmë konstruktorit adresën e përshkrimit tonë WSDL të shërbimit në internet. Tani e dimë se do të jetë e vendosur në rrënjën e hostimit në një skedar me emrin vetë-shpjegues " smsservice.wsdl.php" Në rreshtin e dytë, ne i tregojmë serverit SOAP se cila klasë duhet të tërhiqet në mënyrë që të përpunojë zarfin e marrë nga klienti dhe të kthejë zarfin me përgjigjen. Siç mund ta keni marrë me mend, është në këtë klasë që metoda jonë e vetme do të përshkruhet dërgoni SMS. Në rreshtin e tretë ne fillojmë serverin! Kjo është e gjitha, serveri ynë është gati! Me çka na përgëzoj të gjithëve!

Tani duhet të krijojmë skedarin WSDL. Për ta bërë këtë, thjesht mund të kopjoni përmbajtjen e tij nga seksioni i mëparshëm, ose të merrni lirinë dhe ta "modeloni" pak:

"; ?> /" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http:// schemas.xmlsoap.org/wsdl/http/" name="SmsWsdl" xmlns="http://schemas.xmlsoap.org/wsdl/"> /"> /smsservice.php" />
Në këtë fazë, ne duhet të jemi plotësisht të kënaqur me serverin që rezulton, sepse Ne mund të regjistrojmë zarfet që vijnë tek ai dhe më pas të analizojmë me qetësi të dhënat hyrëse. Në mënyrë që ne të marrim ndonjë gjë në server, ne kemi nevojë për një klient. Pra, le të shkojmë tek ajo!

6 klient SOAP rrugës

Para së gjithash, ne duhet të krijojmë një skedar në të cilin do të shkruajmë klientin. Si zakonisht, ne do ta krijojmë atë në rrënjën e hostit dhe do ta quajmë " klienti.php", dhe brenda do të shkruajmë sa vijon:

MessageList = new Messagelist(); $req->Lista e mesazheve->mesazh = Mesazh i ri(); $req->messageList->message->telefon = "79871234567"; $req->messageList->message->text = "Test mesazh 1"; $req->messageList->message->date = "2013-07-21T15:00:00.26"; $req->messageList->message->lloji = 15; $client = new SoapClient("http://($_SERVER["HTTP_HOST"])/smsservice.wsdl.php", grup ("soap_version" => SOAP_1_2)); var_dump($client->sendSms($req));
Le të përshkruajmë objektet tona. Kur shkruam WSDL, ai përshkroi tre entitete për zarfin që hynte në server: Kërkesë, Lista e mesazheve Dhe Mesazh. Në përputhje me rrethanat, klasat Kërkesë, Lista e mesazheve Dhe Mesazh janë reflektime të këtyre entiteteve në skriptin tonë PHP.

Pasi të kemi përcaktuar objektet, duhet të krijojmë një objekt ( $req), të cilin do ta dërgojmë në server. Pas së cilës vijnë dy linjat më të dashura për ne! Klienti ynë SOAP! Besoni apo jo, kjo mjafton që serveri ynë të fillojë të marrë mesazhe nga klienti, si dhe që serveri ynë t'i marrë dhe përpunojë me sukses ato! Në të parën prej tyre, ne krijojmë një shembull të klasës SoapClient dhe kalojmë adresën e vendndodhjes së skedarit WSDL te konstruktori i tij, dhe në parametrat tregojmë në mënyrë të qartë se do të punojmë duke përdorur versionin 1.2 të protokollit SOAP. Në rreshtin tjetër ne quajmë metodën dërgoni SMS Objekt $klient dhe shfaqni menjëherë rezultatin në shfletues.
Le ta ekzekutojmë dhe të shohim se çfarë morëm më në fund!

Objekti i mëposhtëm m'u kthye nga serveri:

Objekt(stdClass) publik "status" => boolean true
Dhe kjo është e mrekullueshme, sepse ... Tani e dimë me siguri që serveri ynë po funksionon dhe jo vetëm që funksionon, por gjithashtu mund t'i kthejë disa vlera klientit!

Tani le të shohim regjistrin që mbajmë me kujdes në anën e serverit! Në pjesën e parë të tij ne shohim të dhënat e papërpunuara që mbërritën në server:

79871234567 Mesazh testues 1 2013-07-21T15:00:00.26 15
Ky është zarfi. Tani e dini se si duket! Por nuk ka gjasa që ne të jemi të interesuar ta shikojmë atë gjatë gjithë kohës, kështu që le të deserializojmë objektin nga skedari log dhe të shohim nëse gjithçka është në rregull:

Object(stdClass) public "messageList" => objekt(stdClass) public "message" => objekt(stdClass) public "phone" => string "79871234567" (length=11) public "text" => string "Test message 1 " (gjatësia = 37) "data" publike => vargu "2013-07-21T15:00:00.26" (gjatësia=22) "lloji" publik => vargu "15" (gjatësia=2)
Siç e shihni objekti është deserializuar saktë, për çka dua të na përgëzoj të gjithëve! Diçka më interesante na pret në vazhdim! Domethënë, ne do t'i dërgojmë klientit në server jo vetëm një mesazh SMS, por një paketë të tërë (për të qenë më të saktë, tre)!

7 Dërgimi i objekteve komplekse

Le të mendojmë se si mund të transferojmë një grup të tërë mesazhesh në server në një paketë? Ndoshta mënyra më e lehtë do të ishte organizimi i një grupi brenda elementit messageList! Le ta bejme kete:

// krijoni një objekt për ta dërguar në server $req = new Request(); $req->Lista e mesazheve = lista e re e mesazheve(); $msg1 = Mesazh i ri(); $msg1->telefon = "79871234567"; $msg1->text = "Test mesazh 1"; $msg1->date = "2013-07-21T15:00:00.26"; $msg1->lloj = 15; $msg2 = Mesazh i ri(); $msg2->telefon = "79871234567"; $msg2->text = "Test mesazh 2"; $msg2->date = "2014-08-22T16:01:10"; $msg2->lloj = 16; $msg3 = Mesazh i ri(); $msg3->telefon = "79871234567"; $msg3->text = "Test mesazh 3"; $msg3->date = "2014-08-22T16:01:10"; $msg3->lloj = 17; $req->Lista e mesazheve->mesazh = $msg1; $req->messageList->mesazh = $msg2; $req->messageList->mesazh = $msg3;
Regjistrat tanë tregojnë se paketa e mëposhtme është marrë nga klienti:

79871234567 Mesazh testues 1 2013-07-21T15:00:00.26 15 79871234567 Mesazh testues 2 2014-08-22T16:01:10 16 79871234567 Mesazh testues 3 2014-08-22T16:01:10 17
Çfarë marrëzie, ju thoni? Dhe do të keni të drejtë në një farë mënyre, sepse... Sapo mësuam se një objekt u largua nga klienti, ai erdhi në serverin tonë absolutisht në të njëjtën formë në formën e një zarfi. Vërtetë, mesazhet SMS nuk u serializuan në XML në mënyrën si ne kishim nevojë - ato duhej të mbështilleshin me elementë mesazh, jo në Struktura. Tani le të shohim se në çfarë forme një objekt i tillë vjen në metodë dërgoni SMS:

Object(stdClass) publik "messageList" => objekt (stdClass) publik "message" => objekt (stdClass) publik "Struct" => grup (madhësia=3) 0 => objekt (stdClass) publik "telefon" => varg "79871234567" (gjatësia=11) publik "tekst" => vargu "Test message 1" (length=37) public "date" => string "2013-07-21T15:00:00.26" (length=22) public " lloji" => vargu "15" (gjatësia=2) 1 => objekti(stdClass) publik "telefon" => vargu "79871234567" (gjatësia=11) publik "tekst" => vargu "Test message 2" (length= 37) publik "datë" => varg "2014-08-22T16:01:10" (gjatësia=19) publik "type" => vargu "16" (gjatësia=2) 2 => objekti(stdClass) publik "telefon" " => vargu "79871234567" (gjatësia=11) "tekst" publik => vargu "Mesazhi i testit 3" (gjatësia=37) "data" publike => vargu "2014-08-22T16:01:10" (gjatësia= 19) publik "type" => varg "17" (gjatësia = 2)
Çfarë na jep kjo njohuri? Vetëm se rruga që zgjodhëm nuk është e saktë dhe nuk morëm përgjigje në pyetjen - "Si mund të marrim strukturën e saktë të të dhënave në server?" Por unë sugjeroj të mos dëshpërohemi dhe të përpiqemi të konvertojmë grupin tonë në llojin nje objekt:

$req->messageList->message = (objekt)$req->messageList->mesazh;
Në këtë rast, ne do të marrim një zarf tjetër:

79871234567 Mesazh testues 1 2013-07-21T15:00:00.26 15 79871234567 Mesazh testues 2 2014-08-22T16:01:10 16 79871234567 Mesazh testues 3 2014-08-22T16:01:10 17
Hyri në metodë dërgoni SMS objekti ka strukturën e mëposhtme:

Object(stdClass) publik "messageList" => objekt (stdClass) publik "message" => objekt (stdClass) publik "BOGUS" => grup (madhësia=3) 0 => objekt (stdClass) publik "telefon" => varg "79871234567" (gjatësia=11) publik "tekst" => vargu "Test message 1" (length=37) public "date" => string "2013-07-21T15:00:00.26" (length=22) public " lloji" => vargu "15" (gjatësia=2) 1 => objekti(stdClass) publik "telefon" => vargu "79871234567" (gjatësia=11) publik "tekst" => vargu "Test message 2" (length= 37) publik "datë" => varg "2014-08-22T16:01:10" (gjatësia=19) publik "type" => vargu "16" (gjatësia=2) 2 => objekti(stdClass) publik "telefon" " => vargu "79871234567" (gjatësia=11) "tekst" publik => vargu "Mesazhi i testit 3" (gjatësia=37) "data" publike => vargu "2014-08-22T16:01:10" (gjatësia= 19) publik "type" => varg "17" (gjatësia = 2)
Sa për mua, "shuma nuk ndryshon nga ndryshimi i vendeve të termave" (c). Çfarë GJENDJE, Çfarë Struktura– ende nuk ia kemi arritur qëllimit! Dhe për ta arritur atë, duhet të sigurohemi që në vend të këtyre emrave të pakuptueshëm të shfaqet emri ynë amtar mesazh. Por autori ende nuk e di se si ta arrijë këtë. Prandaj, e vetmja gjë që mund të bëjmë është të heqim qafe enën shtesë. Me fjalë të tjera, tani do të sigurohemi që në vend të mesazh u bë GJENDJE! Për ta bërë këtë, ndryshoni objektin si më poshtë:

// krijoni një objekt për ta dërguar në server $req = new Request(); $msg1 = Mesazh i ri(); $msg1->telefon = "79871234567"; $msg1->text = "Test mesazh 1"; $msg1->date = "2013-07-21T15:00:00.26"; $msg1->lloj = 15; $msg2 = Mesazh i ri(); $msg2->telefon = "79871234567"; $msg2->text = "Test mesazh 2"; $msg2->date = "2014-08-22T16:01:10"; $msg2->lloj = 16; $msg3 = Mesazh i ri(); $msg3->telefon = "79871234567"; $msg3->text = "Test mesazh 3"; $msg3->date = "2014-08-22T16:01:10"; $msg3->lloj = 17; $req->Lista e mesazheve = $msg1; $req->Lista e mesazheve = $msg2; $req->Lista e mesazheve = $msg3; $req->Lista e mesazheve = (objekt)$req->Lista e mesazheve;
Po sikur të kemi fat dhe emri i saktë del nga diagrami? Për ta bërë këtë, le të shohim zarfin që mbërriti:

79871234567 Mesazh testues 1 2013-07-21T15:00:00.26 15 79871234567 Mesazh testues 2 2014-08-22T16:01:10 16 79871234567 Mesazh testues 3 2014-08-22T16:01:10 17
Po, një mrekulli nuk ndodhi! GJENDJE- Nuk do të fitojmë! Erdhi në dërgoni SMS objekti në këtë rast do të duket kështu:

Objekt(stdClass) publik "messageList" => objekt (stdClass) publik "BOGUS" => grup (madhësia=3) 0 => objekt (stdClass) publik "telefon" => varg "79871234567" (gjatësia=11) publike " text" => varg "Test message 1" (length=37) public "date" => string "2013-07-21T15:00:00.26" (length=22) public "type" => varg "15" (gjatesi =2) 1 => objekt (stdClass) publik "telefon" => varg "79871234567" (gjatësia=11) publik "tekst" => varg "Test message 2" (length=37) public "data" => string " 2014-08-22T16:01:10" (gjatësia=19) publike "type" => vargu "16" (gjatësia=2) 2 => objekti(stdClass) publik "telefon" => vargu "79871234567" (gjatësia= 11) publik "text" => varg "Test message 3" (length=37) public "date" => string "2014-08-22T16:01:10" (length=19) public "type" => string " 17" (gjatësia = 2)
Siç thonë ata - "Pothuajse"! Në këtë shënim (pak të trishtuar), unë propozoj që ngadalë t'i mbyllim gjërat dhe të nxjerrim disa përfundime për veten tonë.

8 Përfundim

Më në fund arritëm këtu! Le të kuptojmë se çfarë mund të bëni tani:
  • mund të shkruani skedarin WSDL të nevojshëm për shërbimin tuaj të internetit;
  • ju mund të shkruani lehtësisht klientin tuaj që mund të komunikojë me serverin përmes SOAP;
  • ju mund të shkruani serverin tuaj që komunikon me botën e jashtme nëpërmjet SOAP;
  • ju mund të dërgoni vargje të të njëjtit lloj objektesh në server nga klienti juaj (me disa kufizime).
Ne gjithashtu bëmë disa zbulime gjatë hulumtimit tonë të vogël:
  • klasa vendase SoapClient nuk serializon saktë strukturat e të dhënave të të njëjtit lloj në XML;
  • kur serializon një grup në XML, ai krijon një element shtesë të quajtur Struktura;
  • kur serializon një objekt në XML, ai krijon një element shtesë të quajtur GJENDJE;
  • GJENDJE më pak e keqe se Struktura për shkak të faktit se zarfi është më kompakt (hapësirat shtesë të emrave nuk shtohen në kokën XML të zarfit);
  • Fatkeqësisht, klasa SoapServer nuk i vërteton automatikisht të dhënat e zarfit me skemën tonë XML (ndoshta këtë nuk e bëjnë as serverët e tjerë).

Brett McLaughlin Përkthim nga Ilya Chekmenev

SOAP është Protokolli i Qasjes së Objekteve të Thjesht. Nëse nuk keni dëgjuar kurrë më parë për të, atëherë duhet të jetoni në mes të askundit, larg qytetërimit. Është bërë moda më e fundit në programimin e ueb-it dhe pjesë përbërëse e ueb shërbimeve, të cilat përdoren me kaq fanatizëm në zhvillimet e ueb-it të gjeneratës së fundit. Nëse keni dëgjuar për Microsoft. Nuk ka një, por dy Implementimet SOAP nga Apache dhe Microsoft, të cilat kanë mijëra faqe të dedikuara atyre në faqen e tyre të mbështetjes MSDN (http://msdn.microsoft.com/).

Në këtë artikull do t'ju tregoj se çfarë është SOAP dhe pse është një pjesë kaq e rëndësishme në zhvillimin e paradigmës së programimit në internet. Kjo do t'ju ndihmojë të kaloni bazat dhe të filloni të punoni me paketën e veglave SOAP. Pastaj do të jap një përmbledhje të shpejtë të projekteve ekzistuese SOAP dhe do të zhytem në zbatimin e Apache. Ky artikull nuk ka për qëllim të ofrojë një pamje të plotë të SOAP; libri im, Java & XML, Botimi i 2-të, plotëson shumë nga boshllëqet. Ju do të gjeni përgjigje për shumë nga pyetjet që lindën pas leximit të këtij artikulli në libër.

Prezantimi

Së pari ju duhet të kuptoni se çfarë është SOAP. Mund ta lexoni opinionin e plotë (dhe mjaft të gjatë) të W3C në http://www.w3.org/TR/SOAP. Pastaj, pasi ta kuptoni dhe të hidhni të gjithë lëvozhgën, do të kuptoni që SOAP është thjesht një protokoll. Është një protokoll i thjeshtë (nuk ka nevojë të shkruhet një i ri për ta përdorur) i bazuar në idenë se në një moment në një arkitekturë të shpërndarë ka nevojë për të shkëmbyer informacion. Për më tepër, për sistemet në të cilat ekziston mundësia e mbingarkesave dhe vështirësive në proceset e përpunimit, ky protokoll është shumë i favorshëm në atë që është i lehtë dhe kërkon një sasi minimale burimesh. Së fundi, lejon që të gjitha operacionet të kryhen përmes HTTP, gjë që bën të mundur të anashkaloni gjëra të tilla të ndërlikuara si muret e zjarrit dhe të mbroheni nga dëgjimi duke përdorur bazat në një numër të jashtëzakonshëm portash. Gjëja kryesore është që ju ta kuptoni këtë, dhe gjithçka tjetër është detaje.

Sigurisht, ju do të dëshironit t'i dini këto detaje dhe unë nuk do t'i anashkaloj. Ekzistojnë tre komponentë bazë të specifikimit SOAP: një zarf SOAP, një grup rregullash kriptimi dhe një mjet ndërveprimi midis kërkesës dhe përgjigjes. Le të mendojmë për një mesazh SOAP si një letër të rregullt. A ju kujtohen ende ato gjëra të lashta në zarfe me një pullë postare dhe adresën e shkruar në pjesën e përparme? Kjo analogji do t'ju ndihmojë të kuptoni më qartë konceptin e SOAP si një "zarf". Figura 12-1 përshkruan proceset e SOAP-it në formën e kësaj analogjie.

Figura 12-1. Procesi i mesazheve SOAP

Mbani parasysh këtë foto dhe le të shohim tre komponentët e specifikimit SOAP. Do të flas shkurtimisht për secilën prej tyre, duke dhënë shembuj që përfaqësojnë më mirë konceptin. Këta tre komponentë kryesorë e bëjnë SOAP kaq të rëndësishëm dhe kuptimplotë. Trajtimi i gabimeve, mbështetja për kriptime të ndryshme, serializimi i parametrave dhe fakti që SOAP funksionon mbi HTTP në shumicën e rasteve e bëjnë atë më tërheqës se zgjidhjet e tjera për protokollet e shpërndara. SOAP ofron një shkallë të lartë ndërveprimi me aplikacione të tjera, të cilat i trajtova më në detaje në librin tim. Tani për tani, unë dua të fokusohem në elementët thelbësorë të SOAP.

Zarf

Një zarf SOAP është i ngjashëm me një zarf të rregullt letrash. Ai përmban informacion në lidhje me mesazhin që do të kodohet në seksionin kryesor të SOAP, duke përfshirë informacionin për marrësin dhe dërguesin, si dhe informacione për vetë mesazhin. Për shembull, titulli i zarfit SOAP mund të tregojë se si duhet të përpunohet mesazhi. Përpara se një aplikacion të fillojë të përpunojë një mesazh, ai shqyrton informacionin rreth mesazhit, duke përfshirë nëse mund ta përpunojë fare mesazhin. Ndryshe nga situata me thirrjet standarde XML-RPC (kujtoni? Mesazhet XML-RPC, enkriptimi, etj., gjithçka kombinohet në një fragment të vetëm XML), me SOAP përpunimi i vazhdueshëm ndodh për të mësuar diçka rreth mesazhit. Një mesazh tipik SOAP mund të përfshijë gjithashtu një stil kriptimi që do të ndihmojë marrësin në përpunimin e mesazhit. Shembulli 12-1 tregon një zarf SOAP që përfundon me një specifikim kodues.

Shembulli 12-1: Zarf sapuni

Kuti sapuni http://www-106.ibm.com/developerworks/library/x-soapbx1.html

Siç mund ta shihni, kriptimi vendoset brenda zarfit, i cili lejon aplikacionin të përcaktojë (duke përdorur vlerën e atributit stili i kodimit), nëse mund të lexojë mesazhin në hyrje të vendosur në element Trupi. Sigurohuni që hapësira e emrave të zarfit SOAP të jetë e saktë, ose serverët SOAP që marrin mesazhin tuaj do të raportojnë një gabim mospërputhje versioni dhe ju nuk do të jeni në gjendje të komunikoni me ta.

Enkriptimi

Elementi i dytë i rëndësishëm i SOAP është aftësia për të enkriptuar llojet e të dhënave të personalizuara. Me RPC (dhe XML-RPC), kriptimi mund të kryhet vetëm në lloje të paracaktuara të të dhënave që mbështeten në paketën e veglave XML-RPC që keni shkarkuar. Kriptimi i llojeve të tjera të të dhënave kërkon që ju të modifikoni vetë serverin dhe klientin RPC. Me SOAP, një skemë XML mund të përdoret mjaft lehtë për të specifikuar lloje të reja të dhënash (duke përdorur strukturën kompleks Lloji, diskutuar në Kapitullin 2 të librit tim), dhe këto lloje të reja mund të përfaqësohen në XML si pjesë e seksionit kryesor të SOAP. Falë integrimit të Skemës XML, ju mund të kriptoni çdo lloj të dhënash në një mesazh SOAP duke e përshkruar logjikisht në një skemë XML.

Thirrni

Mënyra më e mirë për të kuptuar se si funksionon një thirrje SOAP është ta krahasoni atë me diçka me të cilën jeni njohur, siç është XML-RPC. Nëse ju kujtohet, thirrja XML-RPC duket e ngjashme me fragmentin e kodit të paraqitur në Shembullin 12-2.

Shembulli 12-2. Thirrni në XML-RPC

// Specifikimi i procesorit XML (parser) për të përdorur XmlRpc.setDriver("org.apache.xerces.parsers.SAXParser"); // Specifikimi i serverit me të cilin është bërë lidhja XmlRpcClient klient = new XmlRpcClient("http://rpc.middleearth.com"); // Krijimi i parametrave Vector params = new Vector(); params.addElement (Numri i fluturimit); params.addElement(numSeats); params.addElement(CreditCardType); params.addElement(CredCardNum); // Kërkesë BuyTickets Boolean = (Boolean)client.execute("ticketCounter.buyTickets", params); // Përpunoni përgjigjen

Kam krijuar një program të thjeshtë për porositjen e biletave ajrore. Tani hidhini një sy Shembullit 12-3, i cili demonstron një thirrje SOAP.

Shembulli 12-3. Thirrje në SOAP

// Krijimi i parametrave Vector params = new Vector(); params.addElement(Parametri i ri ("Numri i fluturimit", Integer.class, FlightNumber, null)); params.addElement(Parametri i ri ("numSeats", Integer.class, numSeats, null)); params.addElement(Parametri i ri ("CreditCardType", String.class, creditCardType, null)); params.addElement(Parametri i ri ("CreditCardNumber", Long.class, creditCardNum, null)); // Krijimi i objektit të thirrjes Call call = new Call(); call.setTargetObjectURI("urn:xmltoday-airline-tickets"); call.setMethodName("buyTickets"); call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); call.setParams(params); // Call Response res = call.invoke (URL e re ("http://rpc.middleearth.com"), ""); // Përpunoni përgjigjen

Siç mund ta shihni, thirrja aktuale e përfaqësuar nga objekti Thirrni, banor memorie. Kjo ju lejon të specifikoni objektivin e thirrjes, metodën e thirrjes, stilin e kriptimit, parametrat dhe shumë parametra të tjerë që nuk janë paraqitur në këtë shembull. Ky është një mekanizëm më fleksibël se metoda XML-RPC, duke ju lejuar të specifikoni në mënyrë eksplicite një grup parametrash të ndryshëm që përcaktohen në mënyrë implicite në XML-RPC. Më vonë në këtë artikull, do të mësoni më shumë rreth procesit të thirrjes, duke përfshirë mënyrën se si SOAP trajton kërkesat e pavlefshme, hierarkinë e gabimeve dhe, natyrisht, rezultatet e thirrjeve të kthyera.

Pas një prezantimi kaq të shkurtër, ju tashmë dini mjaftueshëm për t'u interesuar për këtë gjë qesharake. Tani më lejoni t'ju prezantoj me zbatimin e SOAP-it që do të përdor. Unë do të shpjegoj arsyet pse e zgjodha atë dhe do të shikoj disa shembuj kodesh.

Cilësimet

Tani që keni mësuar bazat e konceptit, është koha për pjesën argëtuese: programimin. Për ta bërë këtë, do t'ju duhet një projekt ose produkt i përshtatshëm, i cili është më i lehtë për t'u gjetur sesa mund të duket në shikim të parë. Nëse keni nevojë për një projekt Java që ofron aftësi SOAP, nuk duhet të kërkoni gjatë për të gjetur një të tillë. Ekzistojnë dy grupe produktesh: komerciale dhe falas. Ashtu si në librin tim, do të shmang të përmend produktet komerciale. Kjo nuk është aspak sepse ato janë të këqija (përkundrazi, disa prej tyre janë të shkëlqyera), por sepse do të doja që çdo lexues të mund të provonte ndonjë nga shembujt e dhënë. Kjo është për shkak të aksesueshmërisë, të cilën shumë produkte komerciale nuk e kanë. Duhet të paguani për t'i përdorur ato ose t'i përdorni përkohësisht për një periudhë të kufizuar kohore pas shkarkimit.

Kështu, ne iu afruam pa probleme projekteve me burim të hapur. Nga kjo zonë mund të përmend vetëm një produkt: Apache SOAP. Ai ndodhet në http://xml.apache.org/soap dhe ofron paketën e veglave SOAP për Java. Në kohën e shkrimit, u lëshua versioni 2.2, të cilin mund ta shkarkoni nga faqja e internetit Apache. Është ky version që unë do të përdor në shembujt për këtë artikull.

Alternativa të tjera

Përpara se të kaloj në instalimin dhe konfigurimin e Apache SOAP, unë do t'i përgjigjem disa pyetjeve që mund të kenë hyrë në mendjen tuaj. Mendoj se i kam shpjeguar mjaft qartë arsyet pse nuk përdor produkte komerciale. Megjithatë, mund të jeni duke menduar për disa projekte të tjera me burim të hapur ose të lidhura që mund të dëshironi t'i përdorni, dhe jeni të habitur që nuk i kam komentuar ato.

Po në lidhje me IBM SOAP4J?

E para në listën e alternativave është një implementim nga IBM: SOAP4J. Puna e IBM formoi bazën e projektit Apache SOAP, ashtu si XML4J i IBM u rrit në atë që tani njihet si projekti analizues XML Apache Xerces. Supozohet se zbatimi i IBM do të ridizajnohet, duke u bashkuar me Apache SOAP. Pothuajse e njëjta gjë ndodhi me XML4J të IBM: tani ofron paketim vetëm në Xerces Kjo vetëm thekson tendencat - prodhuesit e mëdhenj shpesh mbështesin dhe përdorin projekte OpenSource, në këtë rast të dy projektet (Apache dhe IBM) përdorin të njëjtën bazë kodi.

A është Microsoft jashtë loje?

Sigurisht që jo. Microsoft dhe zbatimi i tij SOAP, si dhe e gjithë lëvizja .NET (e diskutuar më në detaje në librin tim), janë mjaft domethënëse. Me të vërtetë doja të kaloja pjesën më të madhe të kohës duke parë në detaje zbatimin e SOAP të Microsoft, por ai mbështet vetëm objektet COM dhe nuk mbështet Java. Për këto arsye, një përshkrim i tillë nuk mund të përfshihej në një artikull rreth Java dhe XML. Megjithatë, Microsoft (pavarësisht të gjitha ankesave që ne si zhvillues kemi për këtë kompani) ka bërë punë të rëndësishme në fushën e ueb shërbimeve dhe ju do të gaboni nëse e hidhni poshtë pa u menduar, të udhëhequr vetëm nga emocionet e papërpunuara. Nëse keni nevojë të punoni me komponentët COM ose Visual Basic, ju rekomandoj shumë që të provoni të përdorni paketën e veglave të Microsoft SOAP, të disponueshme në http://msdn.microsoft.com/library/default.asp?url=/nhp/Default .asp ?contentid=28000523 së bashku me shumë burime të tjera SOAP.

Çfarë është Aksi?

Ata prej jush që ndjekin aktivitetet Apache duhet të kenë dëgjuar për Apache Axis. Axis është një grup mjetesh të gjeneratës së ardhshme SOAP i zhvilluar gjithashtu nën ombrellën Apache XML. SOAP (një specifikim, jo ​​një zbatim specifik), i cili po zhvillohet me shpejtësi dhe rrënjësisht kohët e fundit, është shumë i vështirë për t'u ndjekur. Përpjekja për të krijuar një version të SOAP që plotëson plotësisht kërkesat aktuale ndërsa ato zhvillohen është gjithashtu mjaft sfiduese. Si rezultat, versioni aktual i Apache SOAP ofron një zgjidhje të kufizuar nga dizajni i tij. Pasi vendosën që nuk ia vlen të përpiqesh të ridizajnosh plotësisht mjetin ekzistues, zhvilluesit e Apache filluan të krijojnë një projekt bazuar në kodin e ri. Kështu lindi Aksi. Emri i SOAP gjithashtu ndryshoi, fillimisht nga SOAP në XP dhe më pas në XMLP. Më pas emri i specifikimit u hoq nga emri i SOAP-it të ri dhe lindi emri "Axis". Por tani duket se W3C po kthehet në emrin e specifikimit SOAP (versioni 1.2 ose 2.0), kështu që gjërat mund të ndryshojnë ende dhe do të ketë edhe më shumë konfuzion!

Mendoni për IBM SOAP4J si një arkitekturë?1 të paketës së veglave SOAP. Po Apache SOAP (diskutuar në këtë artikull) si arkitekturë?2. Dhe Axis përfaqëson arkitekturën ?3, një arkitekturë e gjeneratës së re. Ky projekt përdor SAX ndërsa Apache SOAP është i bazuar në DOM. Për më tepër, Axis, ndryshe nga Apache SOAP, ofron një qasje më miqësore ndaj përdoruesit për ndërveprimin e përdoruesit. Pas renditjes së këtyre avantazheve, mund të pyesni veten pse nuk zgjodha Axis si lëndën time të studimit. Do të ishte paksa e parakohshme. Aktualisht, vetëm versioni 0.51 i Axis është duke u përgatitur për lëshim. Ky nuk është ende një version beta, apo edhe një version alfa. Do të doja të flisja për veçoritë e reja të Axis, por nuk do të kishit mundësi të bindni menaxhmentin tuaj se mund të përdorni softuer me burim të hapur nën alfa për nevojat tuaja kritike të sistemit. Kështu që vendosa të fokusohem në diçka që ti je e vërtetë ju mund të përdorni tashmë Sot- SOAP Apache. Unë mendoj se deri në kohën kur versioni përfundimtar i Apache Axis të dalë, do ta përditësoj këtë material në botimin e ardhshëm të librit tim. Deri atëherë, le të përqendrohemi në zgjidhjen që tashmë është në dispozicion.

Instalimi

Ekzistojnë dy forma të mundshme të instalimit të SOAP-it. E para është të filloni një klient SOAP duke përdorur SOAP API për të komunikuar me një server që mund të pranojë mesazhe SOAP. Mënyra e dytë është të ekzekutoni një server SOAP që mund të marrë mesazhe nga një klient SOAP. Në këtë pjesë i kam përshkruar të dyja procedurat.

Klienti

Për të përdorur klientin SOAP, fillimisht duhet të shkarkoni Apache SOAP, i disponueshëm në http://xml.apache.org/dist/soap. Kam shkarkuar versionin 2.2 në format binar (nga nëndirektoria version-2.2). Pastaj ju duhet të zbërtheni përmbajtjen e arkivit në një direktori në kompjuterin tuaj. Në rastin tim ishte drejtoria javaxml2 (c:\javaxml2 në kompjuterin tim Windows /javaxml2 në kompjuterin tim Mac OS X). Si rezultat, skedarët u zbërthyen në /javaxml2/sapun-2_2. Do t'ju duhet gjithashtu të shkarkoni paketën JavaMail të disponueshme nga Sun http://java.sun.com/products/javamail/. Do të kërkohet të mbështesë protokollin e transferimit SMTP të përdorur nga Apache SOAP. Më pas shkarkoni Java Beans Activation Framework (JAF), e disponueshme gjithashtu nga Sun http://java.sun.com/products/beans/glasgow/jaf.html. Bazuar në supozimin se tashmë keni Xerces ose një analizues tjetër XML të instaluar dhe gati për t'u përdorur.

Shënim: Sigurohuni që analizuesi juaj XML të jetë në përputhje me JAXP dhe të përdorë saktë hapësirën e emrave. Analizuesi juaj ka shumë të ngjarë t'i plotësojë këto kërkesa. Nëse keni probleme, është më mirë të ktheheni në përdorimin e Xerces.

Shënim: Përdorni versionet më të fundit të Xerces. Versioni 1.4 dhe më i lartë do të funksionojë. Ka një sërë gabimesh me SOAP dhe Xerces 1.3 (.1), kështu që unë ju këshilloj të mos përdorni këtë kombinim.

Hapni paketat JavaMail dhe JAF dhe më pas përfshini skedarët e tyre jar në rrugën tuaj të klasës, si dhe në bibliotekë sapun.kavanoz. Secili prej këtyre skedarëve jar duhet të jetë i vendosur ose në direktorinë rrënjë të programit përkatës, ose në një nëndrejtori /lib. Kur të mbaroni ndryshorja juaj rrugën e klasës duhet të duket diçka si kjo:

$ echo $CLASSPATH /javaxml2/soap-2_2/lib/soap.jar:/javaxml2/lib/xerces.jar: /javaxml2/javamail-1.2/mail.jar:/javaxml2/jaf-1.0.1/activation.jar

Për Windows do të duket kështu:

c:\>echo %CLASSPATH% c:\javaxml2\soap-2_2\lib\soap.jar;c:\javaxml2\lib\xerces.jar; c:\javaxml2\javamail-1.2\mail.jar;c:\javaxml2\jaf-1.0.1\activation.jar

Dhe në fund shtoni drejtorinë javaxml2/saap-2_2/ në tuajën rrugën e klasës për të ekzekutuar shembuj SOAP. Unë e kam përshkruar konfigurimin për disa shembuj në këtë kapitull.

Serveri

Për të krijuar një grup komponentësh të serverit të pajtueshëm me SOAP, së pari ju nevojitet një motor servlet. Si në kapitujt e mëparshëm, unë përdora Apache Tomcat (i disponueshëm në http://jakarta.apache.org/) si shembull për këtë kapitull. Do t'ju duhet të shtoni gjithçka që i nevojitet klientit rrugën e klasës server. Mënyra më e lehtë për ta bërë këtë është rivendosja sapun.kavanoz, aktivizimi.kavanoz Dhe postë.kavanoz, si dhe analizuesin tuaj, në direktorinë e bibliotekave të motorit tuaj servlet. Për Tomcat, kjo është drejtoria /lib, e cila përmban biblioteka për ngarkim automatik. Nëse dëshironi të ofroni mbështetje për skriptet (të cilat nuk diskutohen në këtë kapitull, por janë në shembujt e Apache SOAP), duhet të vendosni bsf.jar(e disponueshme në http://oss.software.ibm.com/developerworks/projects/bsf) dhe js.jar(e disponueshme në http://www.mozilla.org/rhino/) në të njëjtën drejtori.

Shënim: Nëse jeni duke përdorur Xerces me Tomcat, do t'ju duhet të përsërisni trukun që trajtova në kapitullin 10. Riemërtoni analizues.kavanoz V z_parser.jar, A jaxp.jar V z_jaxp.jar për t'u siguruar që xerces.jar dhe versioni i përfshirë i JAXP ngarkohet përpara çdo analizuesi tjetër ose zbatimi JAXP.

Pastaj rinisni motorin tuaj servlet, pas së cilës jeni gati të shkruani komponentët e serverit SOAP.

Ruteri Servlet dhe Klienti Admin

Përveç operacioneve bazë, Apache SOAP përfshin një servlet router si dhe një klient admin. Edhe nëse nuk keni ndërmend t'i përdorni, ju rekomandoj t'i instaloni për të provuar nëse SOAP është instaluar saktë. Ky proces varet nga motori servlet që po përdorni, kështu që unë do ta kufizoj procesin e instalimit në Tomcat. Udhëzimet e instalimit për disa motorë të tjerë servlet mund të gjenden në http://xml.apache.org/soap/docs/index.html.

Instalimi nën Tomcat është shumë i thjeshtë: thjesht merrni skedarin sapun.luftë nga drejtoria sapun-2_2/webapps dhe hidheni në drejtori $TOMCAT_HOME/apps- dhe kjo eshte! Për të kontrolluar instalimin, futni adresën në shfletuesin tuaj http://localhost:8080/soap/servlet/rpcrouter. Ju duhet të merrni një përgjigje të ngjashme me atë të paraqitur në Figurën 12-2.

Figura 12-2. Ruteri RPC Servlet

Megjithëse mesazhi duket të jetë një mesazh gabimi, ai tregon se gjithçka po funksionon siç duhet. Ju duhet të merrni të njëjtën përgjigje nëse drejtoni shfletuesin tuaj në adresën e klientit të administratorit: http://localhost:8080/soap/servlet/messagerouter.

Për të përfunduar testimin e serverit dhe klientit, sigurohuni që të keni ndjekur plotësisht të gjitha udhëzimet. Pastaj ekzekutoni klasën e mëposhtme Java siç tregohet më poshtë për të mbështetur URL-në tuaj të servletit për serverin e ruterit RPC:

C:\>java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter list Shërbimet e vendosura:

Ju duhet të merrni një listë të zbrazët të shërbimeve siç tregohet më sipër. Nëse merrni ndonjë mesazh, ju lutemi rishikoni listën e gjatë të gabimeve të mundshme të disponueshme në http://xml.apache.org/soap/docs/trouble/index.html. Kjo është lista më e plotë e problemeve që mund të hasni. Nëse merrni një listë të zbrazët, kjo do të thotë se konfigurimi ka përfunduar dhe ju jeni gati të filloni të shikoni shembujt e dhënë në këtë kapitull.

Le të fillojmë

Ekzistojnë tre faza kryesore në shkrimin e çdo sistemi të bazuar në SOAP. Pas renditjes së tyre, unë do të diskutoj shkurtimisht secilën prej tyre:

  • Zgjedhja midis mesazheve SOAP-RPC dhe SOAP;
  • Shkrimi ose fitimi i aksesit në një shërbim SOAP;
  • Shkrimi ose qasja në një klient SOAP.

Hapi i parë është të zgjidhni nëse do të përdorni SOAP për thirrjet RPC (në të cilat një procedurë në distancë ekzekutohet në server), ose mesazhe (në të cilat klienti thjesht dërgon pjesë të informacionit në server). Unë i diskutoj këto procese në detaje më poshtë. Pasi të keni marrë këtë vendim, do t'ju duhet të hyni ose të krijoni shërbimin tuaj. Sigurisht, duke qenë se ne jemi të gjithë profesionistë të Java-s, ky kapitull mbulon se si të krijoni tuajën. Dhe së fundi, ju duhet të shkruani një klient për këtë shërbim, kjo është e gjitha!

RPC apo Mesazhimi?

Detyra juaj e parë nuk ka të bëjë me programimin dhe është më shumë e një natyre dizajni. Ju duhet të zgjidhni nëse do të përdorni shërbimin RPC ose mesazhet. Do të supozojmë se jeni njohur me RPC (për shembull, duke lexuar një nga kapitujt e librit tim). Klienti ekzekuton një procedurë në distancë në server dhe më pas merr një përgjigje. Në këtë skenar, SOAP vepron si një sistem i përmirësuar XML-RPC që siguron trajtimin më të mirë të gabimeve dhe transferimin e llojeve komplekse të të dhënave përmes rrjetit. Ju tashmë jeni njohur me këtë koncept dhe meqenëse sistemet RPC janë më të lehta për t'u shkruar në SOAP, unë do të filloj me to. Ky artikull përshkruan se si të krijoni një shërbim RPC, një klient RPC dhe si të vendosni sistemin në veprim.

Një mënyrë tjetër e punës së SOAP-it bazohet në shkëmbimin e mesazheve. Në vend të kryerjes së procedurave në distancë, përdoret vetëm për shkëmbimin e informacionit. Siç mund ta merrni me mend, ky është një mjet i fuqishëm që nuk kërkon që klienti të njohë metodat individuale të ndonjë serveri. Ai gjithashtu e bën modelimin e sistemeve në distancë më të izoluar duke lejuar që paketat e të dhënave (paketat në kuptimin figurativ, jo në kuptimin e rrjetit) të dërgohen në sisteme të tjera. Në të njëjtën kohë, sistemet e tjera nuk kanë nevojë të dinë për operacionet që janë kryer me këto të dhëna. Ky stil është më kompleks se programimi RPC, kështu që nuk do ta përshkruaj këtu. Do ta gjeni në librin tim, së bashku me detaje të tjera të ndërveprimit biznes-biznes. Së pari, njihuni me programimin SOAP-RPC.

Ashtu si shumica e problemeve të projektimit, marrja e këtij vendimi varet nga ju. Analizoni aplikacionin tuaj dhe përpiquni të përcaktoni pse duhet të përdorni SOAP. Nëse keni një server dhe një grup klientësh që kryejnë funksione specifike biznesi sipas kërkesës, atëherë RPC është më i përshtatshëm për ju. Në sistemet komplekse në të cilat shkëmbimi i të dhënave është më shumë se vetëm kryerja e funksioneve specifike të biznesit sipas kërkesës, përdorimi i mesazheve SOAP është shumë i preferuar.

Shërbimi RPC

Tani që formalitetet kanë përfunduar, është koha për të vepruar. Siç e dini, në RPC do t'ju duhen klasa, metodat e të cilave do të ekzekutohen nga distanca.

Copë kodi

Do të filloj duke parë disa copa kodi për serverin. Këto fragmente janë klasa me metoda që ekzekutohen për klientët RPC. Kam përdorur kodin nga libri im si shembuj. Në vend që të përdor klasa të thjeshta, zgjodha një shembull më kompleks për të demonstruar sa më qartë aftësitë e SOAP. Kështu, unë përdora klasën CD si shembull. Së pari ne përcaktojmë elementin harta për çdo lloj parametri jo standard. Për atributin stili i kodimit, të paktën në Apache SOAP 2.2. duhet të jepni vlerën http://schemas.xmlsoap.org/soap/encoding/ . Ky është aktualisht i vetmi kodim i mbështetur. Duhet të specifikoni hapësirën e emrave për llojin e përcaktuar nga përdoruesi dhe më pas emrin e klasës të prefiksuar me hapësirën e emrave për atë lloj. Në rastin tonë, për këto qëllime kam përdorur një hapësirë ​​emri fiktive dhe një parashtesë të thjeshtë " x Pastaj duke përdorur atributin javaType, vendosni emrin e vërtetë të klasës Java (për këtë rast - javaxml2.CD). Dhe së fundi, kuralesil me atribute java2XMLKlasaEmri Dhe xml2JavaKlasaEmri. Me ndihmën e tyre, specifikohet një klasë që konvertohet nga Java në XML dhe anasjelltas. Kam përdorur klasën jashtëzakonisht të dobishme BeanSerializer, e përfshirë gjithashtu me Apache SOAP. Nëse parametri juaj i personalizuar është në formatin JavaBean, ky serializues dhe deserializues do t'ju shpëtojë nga nevoja për të shkruar tuajin. Ju duhet një klasë me një konstruktor të paracaktuar (mos harroni, për klasën CD unë përcaktova një konstruktor të thjeshtë, pa parametra) dhe publikoni të gjitha të dhënat e kësaj klase duke përdorur metoda setXXX Dhe merrniXXX. Sepse klasa CD plotëson në mënyrë të përkryer të gjitha këto kërkesa, BeanSerializer punon perfekt.

Shënim:Çfarë klase CD plotëson kërkesat BeanSerializer. nuk ka shumë rëndësi. Shumica e klasave konvertohen lehtësisht në këtë format. Prandaj, unë këshilloj të shmangni shkrimin e serializuesve dhe deserializuesve tuaj. Kjo është një dhimbje koke shtesë (asgjë e komplikuar, por shumë e mundimshme) dhe ju rekomandoj të kurseni energjinë tuaj dhe të përdorni konvertimin e fasules në parametrat tuaj të personalizuar. Në shumë raste, konvertimet bean kërkojnë vetëm një konstruktor të paracaktuar (pa parametra) në klasën tuaj.

Tani le të rikrijojmë kavanoz skedari dhe riinstaloni shërbimin tonë:

(gandalf)/javaxml2/Ch12$ java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter xml/CDCatalogDD.xml

Kujdes: Nëse e lini motorin tuaj servlet të ndezur dhe rihostoni një shërbim në të njëjtën kohë, do t'ju duhet të rindizni motorin e servletit për të aktivizuar klasat e reja për shërbimin SOAP dhe të rihostoni shërbimin.

Tani mbetet vetëm modifikimi i klientit për të përdorur klasa dhe metoda të reja. Shembulli 12-10 përmban një version të modifikuar të klasës së klientit CDAdder. Ndryshimet e bëra në versionin e mëparshëm janë theksuar.

Shembulli 12-10: Klasa e përditësuar CDAdder

paketa javaxml2; import java.net.URL; import java.util.Vector; import org.apache.saap.Constante; import org.apache.soap.Fault; import org.apache.soap.SOAPException; importoni org.apache.soap.encoding.SOAPMappingRegistry; importoni org.apache.soap.encoding.soapenc.BeanSerializer; import org.apache.soap.rpc.Call; import org.apache.soap.rpc.Parameter; import org.apache.soap.rpc.Response; importoni org.apache.soap.util.xml.QName; CDAdder i klasës publike( shtesa publike e zbrazët (url URL, titulli i vargut, artisti i vargut, etiketa e vargut) hedh SOAPException ( System.out.println("Shtimi i një CD me titull "" + titull + "" artist "" + artist + "" studio " + etiketë); CD cd = CD e re (titulli, artisti, label); // Krijo një objekt thirrjeje Call Call call = new Call(); call.setSOAPMappingRegistry(regjistri); call.setTargetObjectURI("urn:cd-catalog"); call.setMethodName("addCD"); call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); // Vendosja e parametrave Paramet e vektorit = new Vector(); params.addElement(Parametri i ri ("cd", CD.class, cd, null)); call.setParams(params); // Përpunimi i përgjigjes së përgjigjes së thirrjes Invoke; përgjigje = thirrje.invoke(url, ""); if (!response.generatedFault()) ( System.out.println ("Shto CD përfundoi me sukses."); ) else ( Fault fault = answer.getFault(); System.out.println (Gabim: " + fault.getFaultString ());)) public static void main(String args) ( if (args.length != 4) ( System.out.println("Tablate: java javaxml2.CDAdder " + "\"[Titulli CD]\" \"[Emri i Artistit]\ " \"[Studio CD]\""); kthim;) provo ( // URL e serverit SOAP me të cilin është bërë lidhja URL url = URL e re(args); // Merrni vlerat për titullin e ri të vargut të CD = args; Artist i vargjeve = args; Etiketa e vargut = args; // Shto CD CDAdder adder = new CDAdder(); adder.add(url, titull, artist, label); ) kap (Përjashtim e) ( e.printStackTrace(); ) ) )

I vetmi ndryshim vërtet interesant është në hartën e klasës CD:

// Harto këtë lloj që të mund të përdoret me SOAP SOAPMappingRegistry Registry = new SOAPMappingRegistry(); BeanSerializer serializer = i ri BeanSerializer(); registry.mapTypes(Constants.NS_URI_SOAP_ENC, QName i ri ("urn:cd-catalog-demo", "cd"), CD.class, serializues, serializues);

Kjo është mënyra se si një parametër i përdoruesit mund të kodohet dhe transmetohet përmes rrjetit. Unë ju kam thënë tashmë se si klasa BeanSerializer mund të përdoret për të përpunuar parametrat në formatin JavaBean, të tilla si klasa CD. Kam përdorur një përshkrues vendosjeje për t'i treguar këto në server, megjithëse tani më duhet t'i them klientit të përdorë këtë serializues dhe deserializues. Ky funksion kryhet nga klasa Regjistri SOAPMapping. Metoda mapLlojet () merr vargun e koduar (përsëri, është më mirë të përdorni një konstante për këtë NS_URI_SOAP_ENC), dhe informacion rreth llojit të parametrit për të cilin duhet të përdoret serializimi i veçantë. QName është specifikuar së pari. Kjo është arsyeja pse hapësira e çuditshme e emrave u përdor në përshkruesin pritës. Ju duhet të jepni të njëjtën URN këtu, si dhe emrin lokal të elementit (për këtë shembull "CD"), pastaj objektin Java Klasa klasa që do të serializohet ( CD.klasë) dhe në fund një shembull i klasës për serializimin dhe deserializimin. Për këtë shembull, të dyja rastet do të përfshijnë një shembull BeanSerializer. Pasi të gjitha këto cilësime të jenë futur në regjistër, njoftoni objektin Thirrni duke përdorur metodën setSOAPMapping-Registry().

Ju mund ta ekzekutoni këtë klasë siç tregohet më herët, duke shtuar një CD dhe gjithçka duhet të funksionojë siç pritej:

C:\javaxml2\build>java javaxml2.CDAdder http://localhost:8080/soap/servlet/rpcrouter "Tony Rice" "Manzanita" "Sugar Hill" Shtimi i një CD të titulluar "Tony Rice" nga Sugar Hill's "Manzanita" Duke shtuar me sukses një CD.

E lashë modifikimin e klasës CDLister për ty. Gjithçka prodhohet sipas të njëjtit shabllon. Për të provuar veten, mund t'i referoheni skedarëve shembull për librin tim, të cilët tashmë përmbajnë këto klasa të përditësuara.

Shënim: Këtë mund ta vendosni sepse klasa CDLister nuk ndërvepron drejtpërdrejt me objektin CD(kthyer sipas metodës listë() lloji ka rëndësi Hashtable), atëherë nuk keni nevojë të bëni ndonjë ndryshim. Megjithatë, klasa e kthyer Hashtable përmban instanca objektesh CD. Nëse SOAP nuk di si t'i deserializojë ato, klienti do të hedhë një gabim. Në këtë rast, për të zgjidhur problemin duhet të specifikoni në objekt Thirrni kopje Regjistri SOAPMapping.

Trajtim efikas i gabimeve

Tani që keni parë objekte të personalizuara dhe keni bërë thirrje RPC dhe të tilla, më lejoni të flas për një temë më pak emocionuese: trajtimin e gabimeve. Me çdo transaksion të rrjetit, mund të ndodhin shumë dështime. Shërbimi nuk fillon, ka një gabim në server, një objekt nuk mund të gjendet, klasat mungojnë dhe shumë probleme të tjera. Deri tani kam përdorur thjesht metodën fault.getString() për të gjeneruar mesazhe gabimi. Por kjo metodë mund të mos jetë gjithmonë e dobishme. Për ta parë atë në veprim, hiqni komentin e konstruktorit CDKatalogu:

CDCatalog publik() ( //katalog = new Hashtable(); // Krijo një direktori addCD(CD e re ("Nickel Creek", "Nickel Creek", "Sugar Hill")); addCD(CD i ri ("Let it Fall", "Sean Watkins", "Sugar Hill")); addCD(CD e re ("Kufijtë Ajror", "Michael Hedges", "Windham Hill")); addCD(CD e re ("Taproot", "Michael Hedges", "Windham Hill")); )

Rikompiloni atë, rinisni motorin servlet dhe rihostoni atë. Kjo do të rezultojë në një përjashtim NullPointerException kur konstruktori i klasës përpiqet të shtojë CD në të pa inicializuar Hashtable. Kur filloni klientin, do të shfaqet një mesazh gabimi, por nuk do të jetë shumë informues:

(gandalf)/javaxml2/build$ java javaxml2.CDLister http://localhost:8080/soap/servlet/rpcrouter Shikoni direktorinë aktuale të CD-së. Gabim: Nuk mund të zgjidhet objekti i synuar: null

Ky nuk është aspak informacioni që mund të ndihmojë në identifikimin dhe korrigjimin e një gabimi. Sidoqoftë, korniza përballet me trajtimin e duhur të gabimeve. Të kujtohet DOMFaultListener, të cilën e keni specifikuar si vlerën e elementit faultListener? Ka ardhur koha që ai të hyjë në lojë. Objekti kthehet në rast gabimi Faji përmban DOM (Modeli i objektit të dokumentit) org.w3c.dom.Element me informacion të detajuar për gabimin. Së pari shtoni një shprehje importi në kodin tuaj burimor java.util.Iterator:

import java.net.URL; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.Vector; import org.apache.saap.Constante; import org.apache.soap.Fault; import org.apache.soap.SOAPexception; importoni org.apache.soap.encoding.SOAPMappingRegistry; importoni org.apache.soap.encoding.soapenc.BeanSerializer; import org.apache.soap.rpc.Call; import org.apache.soap.rpc.Parameter; import org.apache.soap.rpc.Response; importoni org.apache.soap.util.xml.QName;

Tani le të bëjmë ndryshime për të trajtuar gabimet në metodën list():

if (!response.generatedFault()) ( Parametri returnValue = answer.getReturnValue(); Katalogu i Hashtable = (Hashtable)returnValue.getValue(); Numërimi e = catalog.keys(); ndërsa (e.hasMoreElements()) ( String titull = (String)e.nextElement(); CD cd = (CD)catalog.get(titull); System.out.println(" "" + cd.getTitle() + "" artist " + cd.getArtist() + " studios " + cd.getLabel()); ) ) else ( Fault fault = answer.getFault(); System.out.println ("Gabim: " + fault.getFaultString()); Regjistrimet vektoriale = faji.getDetailEntries(); për (Iterator i = entries.iterator (); i.hasNext ();) ( org.w3c.dom. Hyrja e elementit = (org.w3c.dom.Element)i.next(); System.out.println(hyrja .getFirstChild().getNodeValue()); ) )

Duke përdorur metodën getDetailEntries () ju merrni akses në shërbimin SOAP dhe serverin e të dhënave të papërpunuara që mbështet problemin. Kodi i ri-përpunon ato (zakonisht ka vetëm një element, por kërkon vëmendje të madhe) dhe kap DOM-in Elementi, të përfshira në çdo hyrje. Në thelb, këtu është XML me të cilin po punoni:

SOAP-ENV:Server.BadTargetObjectURI Nuk mund të zgjidhet objektivi: null Kjo është ajo që ne duam!

Me fjalë të tjera, objekti Fault ju jep akses në pjesën e zarfit të SOAP që përmban gabime. Përveç kësaj, Apache SOAP ofron një gjurmim të pirgut Java kur ndodhin gabime, duke ofruar informacionin e detajuar të nevojshëm për t'i korrigjuar ato. Përgjimi i një elementi stackTrace dhe printimi i vlerës së nyjës Teksti nga ky element klienti juaj mund të printojë gjurmën e stakut të serverit. Duke përpiluar këto ndryshime dhe duke rifilluar klientin, do të merrni rezultatin e mëposhtëm:

C:\javaxml2\build>java javaxml2.CDLister http://localhost:8080/soap/servlet/rpcr outer Shikoni direktorinë aktuale të CD-së. Gabim: Nuk mund të zgjidhet objektivi: null java.lang.NullPointerException në javaxml2.CDCatalog.addCD(CDCatalog.java:24) në javaxml2.CDCatalog. (CDCatalog.java:14) në java.lang.Class.newInstance0 (Metodë origjinale) në java.lang.Class.newInstance(Class.java:237)

Nuk është shumë më mirë, por të paktën ju mund të shihni disa informacione të reja që ka ndodhur një përjashtim NullPointerException dhe madje zbuloni numrat e rreshtave në klasat e serverit në të cilat ka ndodhur ky problem. Rezultati i këtyre ndryshimeve të fundit ju ka dhënë një pamje të qartë të problemit të trajtimit të gabimeve. Tani duhet të kontrolloni klasat e serverit tuaj për gabime. Po, pothuajse harrova, para kësaj mos harroni të ndryshoni klasën tuaj CDKatalogu për të hequr qafe gabimet që kemi futur qëllimisht për qartësi!

  1. Flitet shumë për ekzekutimin e SOAP mbi protokolle të tjera si SMTP (ose edhe Jabber). Standardi SOAP aktualisht nuk e ofron këtë, por aftësi të ngjashme mund të shtohen në të ardhmen. Prandaj, mos u habitni nëse hasni në diskutime aktive për këtë temë.

Nuk do të ndalem në pyetjen se çfarë është shërbimet e internetit dhe pse janë të nevojshme. Ka shumë artikuj mbi këtë temë në internet. Unë thjesht do të përpiqem të tregoj shkurtimisht se sa e thjeshtë është të krijosh një klient për çdo shërbim në internet në PHP.

Cilësimet

Per perdorim SAPUNI në php ju duhet të lidhni modulin SOAP (përfshirë në shpërndarjen php5). Në Windows, kjo bëhet thjesht - ju duhet të shtoni (domethënë shtoni, pasi kjo linjë nuk komentohet vetëm atje, por mungon fare) në php.ini:
extension=php_soap.dll

Mos harroni të rinisni serverin nëse keni të instaluar php si modul.


Krijimi i një klienti SOAP nga një dokument WSDL

Krijimi i një klienti SOAP zakonisht ndodh nga Dokumenti WSDL, i cili është një dokument XML në një format specifik që përshkruan plotësisht një shërbim të caktuar ueb. Për detaje rreth WSDL, ju drejtoj në faqen e internetit të konsorciumit W3C - http://www.w3.org/TR/2005/WD-wsdl20-soap11-binding-20050510/.

Gjëja kryesore që duhet të dini për të ndërtuar një klient për një shërbim ueb është të dini URL-në e dokumentit të tij WSDL.
Për shembull, le të marrim shërbimin në internet "Kursi i këmbimit valutor" nga xmethods.com. Adresa e këtij shërbimi në internet, i cili ju lejon të merrni kurset e këmbimit në internet, është http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl.

Pika e dytë e rëndësishme është se nga përshkrimi i shërbimit në internet është e nevojshme të merret informacion se cilat metoda ofron ky shërbim dhe cilat parametra duhet t'i kalojmë atij si vlera hyrëse (shumë e ngjashme me thirrjen e një funksioni ose klase të rregullt PHP metodë). Zakonisht ky informacion përmbahet në përshkrimin e shërbimit në faqen e tij të internetit. Shërbimi ynë i internetit për marrjen e kurseve të këmbimit ofron metodën getRate(), së cilës i kalohen kodet e monedhës si argumente.

Dhe së fundi, është e rëndësishme të dini se çfarë të prisni si përgjigje: sa vlera, çfarë lloji, etj. Kjo mund të merret edhe nga përshkrimi.
Dhe si rezultat, kodi rezulton të jetë shumë i thjeshtë dhe kompakt, pothuajse elementar:

// Duke përdorur shërbimin në internet
// "Kursi i këmbimit valutor" nga xmethods.com

// Krijimi i një klienti SOAP nga një dokument WSDL
$client = new SoapClient ("http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl");

// Dërgoni një kërkesë SOAP dhe merrni rezultatin
$result = $client->getRate("ne", "rusi");

Echo 'Kursi aktual i këmbimit të dollarit: ', $rezultat, ' rubla';
?>

Siç mund ta shihni nga kodi, ju duhet të kaloni URL-në e dokumentit WSDL te konstruktori i klasës SoapClient dhe të merrni një objekt për të punuar me shërbimin e dëshiruar në internet. Pastaj thirret një metodë e këtij objekti, emri i së cilës është i njëjtë me emrin e vetë metodës së shërbimit në ueb. Kjo metodë na kthen rezultatin që duam.

Pra, ky shembull i thjeshtë ilustron parimin e ndërtimit të një klienti SOAP për shërbimet në internet në PHP. Megjithatë, në një aplikacion të vërtetë ka ende shumë për t'u kujdesur, veçanërisht për faktin që kur telefonohet shërbimi në internet, ai mund të jetë përkohësisht i padisponueshëm ose të kthejë një gabim. Sugjeron qartë përdorimin e një blloku provo/kap/hedh :)

(PHP 5 >= 5.0.1)

SoapClient::SoapClient — Konstruktor SoapClient

Parametrat

wsdl

URI e WSDL dosje ose I PAVLEFSHËM nëse punon në jo-WSDL modaliteti.

Gjatë zhvillimit, memoria e memories WSDL mund të çaktivizohet duke përdorur sapun.wsdl_cache_ttl Cilësimi php.ini përndryshe ndryshimet e bëra në skedarin WSDL nuk do të kenë efekt deri në sapun.wsdl_cache_ttlështë i skaduar.

opsione

Një sërë opsionesh. Nëse punon në modalitetin WSDL, ky parametër është opsional. Nëse punon në modalitetin jo-WSDL, vendndodhjen dhe uri duhet të vendosen opsionet, ku vendndodhjenështë URL-ja e serverit SOAP për të dërguar kërkesën dhe uriështë hapësira e emrave të synuar të shërbimit SOAP.

stil dhe përdorni opsionet funksionojnë vetëm në modalitetin jo-WSDL. Në modalitetin WSDL, ato vijnë nga skedari WSDL.

versioni i sapunit opsioni specifikon nëse do të përdoret klienti SOAP 1.1 (i parazgjedhur) ose SOAP 1.2.

Për vërtetimin HTTP, identifikimi dhe fjalëkalimin opsionet mund të përdoren për të dhënë kredencialet. Për të krijuar një lidhje HTTP përmes një serveri proxy, opsionet proxy_host, proxy_port, proxy_login dhe proxy_password janë gjithashtu në dispozicion. Përdorni vërtetimin e certifikatës së klientit HTTPS lokal_cert dhe frazë kalimi opsione. Një vërtetim mund të sigurohet në vërtetimi opsion. Metoda e vërtetimit mund të jetë ose SOAP_AUTHENTICATION_BASIC(e parazgjedhur) ose SOAP_AUTHENTICATION_DIGEST.

ngjeshja opsioni lejon përdorimin e kompresimit të kërkesave dhe përgjigjeve të HTTP SOAP.

kodimi opsioni përcakton kodimin e brendshëm të karaktereve. Ky opsion nuk ndryshon kodimin e kërkesave SOAP (është gjithmonë utf-8), por konverton vargjet në të.

gjurmë opsioni mundëson gjurmimin e kërkesës në mënyrë që gabimet të mund të rikthehen. Kjo është e paracaktuar në I RREMË

harta e klasës opsioni mund të përdoret për të hartuar disa lloje WSDL në klasat PHP. Ky opsion duhet të jetë një grup me tipe WSDL si çelësa dhe emra të klasave PHP si vlera.

Vendosja e boolean-it gjurmë opsioni mundëson përdorimin e metodave SoapClient->__getLastRequest, SoapClient->__getLastRequestHeaders, SoapClient->__getLastResponse dhe SoapClient->__getLastResponseHeaders.

përjashtime opsioni është një vlerë boolean që përcakton nëse gabimet e sapunit bëjnë përjashtime të llojit SoapFault.

skadimi_koha e lidhjes opsioni përcakton një afat në sekonda për lidhjen me shërbimin SOAP. Ky opsion nuk përcakton një afat kohor për shërbimet me përgjigje të ngadalta. Për të kufizuar kohën për të pritur që telefonatat të përfundojnë, disponohet cilësimi default_socket_timeout.

harta e tipit Opsioni është një grup mapping të tipit. Harta e tipit është një grup me çelësa lloji_emri, tip_ns(URI i hapësirës së emrit), nga_xml(kthimi i thirrjes duke pranuar një parametër vargu) dhe to_xml(kthimi i thirrjes pranon një parametër objekti).

cache_wsdl opsioni është një nga WSDL_CACHE_NONE, WSDL_CACHE_DISK, WSDL_CACHE_MEMORY ose WSDL_CACHE_BOTH.

përdorues_agjent opsioni specifikon vargun për t'u përdorur Përdorues-Agjent kokë.

rrjedha_konteksti opsioni është një për kontekst.

veçoritë opsioni është një maskë e vogël e SOAP_SINGLE_ELEMENT_ARRAYS, SOAP_USE_XSI_ARRAY_TYPE, SOAP_WAIT_ONE_WAY_CALLS.

mbaj_gjallë opsioni është një vlerë boolean që përcakton nëse do të dërgohet Lidhja: Keep-Alive kokë ose Lidhja: mbyll .

Ndryshim

Version Përshkrim
5.4.0 I ri mbaj_gjallë opsion.

Shembuj

Shembulli #1 SoapClient::SoapClient() shembull

$client = new SoapClient("some.wsdl");

$client = new SoapClient ("some.wsdl" , array("soap_version" => SOAP_1_2 ));

$client = new SoapClient ("some.wsdl" , array("login" => "some_name" ,
"password" => "disa_password" ));

$client = new SoapClient ("some.wsdl" , array("proxy_host" => "localhost" ,
"proxy_port" => 8080 ));

$client = new SoapClient ("some.wsdl" , array("proxy_host" => "localhost" ,
"proxy_port" => 8080,
"proxy_login" => "some_name" ,
"proxy_password" => "disa_password" ));

$client = i ri SoapClient ("some.wsdl" , array("local_cert" => "cert_key.pem" ));

$client = i ri SoapClient (null , array("location" =>
"uri" => "http://test-uri/" ));

$client = i ri SoapClient (null , array("location" => "http://localhost/soap.php" ,
"uri" => "http://test-uri/" ,
"style" => SOAP_DOCUMENT ,
"use" => SOAP_LITERAL ));

$client = i ri SoapClient("some.wsdl" ,
array("kompresim" => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP ));

$server = i ri SoapClient ("some.wsdl" , array("encoding" => "ISO-8859-1" ));

klasa MyBook (
publik $title ;
publik $autor ;
}

$server = new SoapClient ("books.wsdl" , array("classmap" => array("libri" => "MyBook" )));

?>

Chris Gunawardena

Për të monitoruar thirrjet SOAP brenda dhe jashtë një serveri unix:

Sudo tcpdump -nn -vv -A -s 0 -i eth0 dst ose src host xxx.xxx.xxx.xxx dhe porta 80

Dhe përdorni gjithmonë "cache_wsdl" => WSDL_CACHE_NONE

svenr në selfhtml dot org

Opsioni "classmap" në fakt është një hartë nga "ComplexType" e përdorur brenda SOAP në klasat tuaja PHP.

Mos i ngatërroni emrat e etiketave XML të kthyera për kërkesën tuaj me këto ComplexTypes. SOAP u lejon atyre të jenë të ndryshëm.

Unë kisha diçka të tillë:
...


FooBar

Emri i Etiketës nuk është çelësi që dëshironi të vendosni në hartën tuaj të klasës, duhet të dini emrin e Kompleksit të cilit i referohet ky Emri i Etiketës. Ky informacion gjendet brenda burimit WSDL.

paulovitorbal në gmail dot com

Kur përdorni certifikatat, në parametrin "local_cert", përdorni përmbajtjen e skedarit, jo emrin e skedarit.

Soapclient i ri ("http://localhost/index.php?wsdl ", array("local_cert"=>file_get_contents("./key.pem"),"passphrase"=>"fjalëkalimi"));

Në PHP, ju mund të keni vetitë private të përcaktuara në klasat që përdorni në hartën tuaj të klasës. Pra, nëse krijoni një pronë private $foo në klasën tuaj, dhe elementi SOAP ka një element fëmijë , përmbajtja e $foo do të vendoset në përmbajtjen e . Në këtë mënyrë ju mund të kontrolloni aksesin në pronat në klasat tuaja.

(Shënim: Kjo nuk funksionon në HPHP të Facebook).

willem dot stuursma dhe hyves dot nl

Nëse dëshironi të përdorni klasa në një hapësirë ​​tjetër emri në hartën tuaj të klasës, thjesht përdorni vijën e prapme në emrin e klasës së synuar.

Shembull:
$classmap = array("rezultat" => "MyNamespace\\Rezultati" );
?>

Duhet të specifikoni dy herë vijën e prapme, sepse është karakteri i arratisjes në vargje.

simonlang at gmx dot ch

Shembull për një klient sapuni me vërtetim HTTP përmes një përfaqësuesi:

SaapClient i ri (
"service.wsdl",
grup (
// Gjëra për zhvillim.
"gjurmë" => 1,
"exceptions" => e vërtetë,
"cache_wsdl" => WSDL_CACHE_NONE ,
"features" => SOAP_SINGLE_ELEMENT_ARRAYS,

// Kredencialet e vërtetimit për kërkesën SOAP.
"login" => "emri i përdoruesit" ,
"password" => "fjalëkalim" ,

// Urlja e përfaqësuesit.
"proxy_host" => "example.com" , // Mos e shtoni skemën këtu (http ose https). Nuk do të funksionojë.
"proxy_port" => 44300,

// Vërtetoni kredencialet për përfaqësuesin.
"proxy_login" => NULL,
"proxy_password" => NULL,
);
?>
Sigurimi i një URL për një skedar WSDL në serverin e largët (i cili gjithashtu është i mbrojtur me vërtetimin HTTP) nuk funksionoi. Unë e shkarkova WSDL dhe e ruajta në serverin lokal.

Asaf Meller

Një konfigurim i plotë i sapunit php .net:
shënime
1. web.config në serverin .net duhet të punojë me lidhjen themelore http.
2. Parametrat për funksionet e sapunit duhet të kalohen si:
array("parm1_name"=>"parm1_value",
"parm2_name"=>"parm2_value"...)

header ("Lloji i përmbajtjes: tekst/i thjeshtë");

provoni (
$options = grup(
"soap_version" => SOAP_1_1,
"exceptions" => e vërtetë,
"gjurmë" => 1,
"cache_wsdl" => WSDL_CACHE_NONE
);
$client = SaapClient i ri ( "http://www.example.com/end_point.wsdl", $opsione);

) kap (Përjashtim $e ) (
jehonë"

Gabim përjashtimi!

" ;
echo $e -> getMessage();
}

Echo "running HelloWorld:" ;

provoni (
$response = $client -> HelloWorld();

}
kapja (Përjashtim $e)
{
echo "Përjashtim i kapur: " , $e -> getMessage (), "\n" ;
}

Print_r ($përgjigje);
?>
paç fat!
Asaf.

faebu at faebu dot ch

Po përjetoj të njëjtat probleme kur përpiqem të ngarkoj një skedar WDSL i cili mbrohet nga vërtetimi bazë http, pasi parametrat identifikimi dhe fjalëkalimi përdoren vetëm për kërkesën, por jo kur lexoj skedarin wdsl. Unë thjesht përdor zgjidhjen e mëposhtme duke shkarkuar skedarin xml në një vendndodhje të pambrojtur në serverin tim. Ju lutem vini re se kjo nuk mbështet asnjë lloj memorie.

Klasa SoapAuthClient zgjeron SoapClient (
/**
* Meqenëse paketa PHP SOAP nuk mbështet vërtetimin bazë
* kjo klasë shkarkon skedarin WDSL duke përdorur paketën cURL dhe
* krijon një kopje lokale të wdsl në serverin tuaj.
*Sigurohuni që të jepni parametrin shtesë të mëposhtëm në
* $optionsArray:
* wdsl_local_copy => e vërtetë
*/

Private $cache_dir = "/home/shembull/htdocs/cache/" ;
private $cache_url = "http://www.example.com/cache/";

Funksioni SoapAuthClient ($wdsl, $options) (
if (isset($options [ "wdsl_local_copy" ]) &&
$options [ "wdsl_local_copy" ] == e vërtetë &&
isset($options [ "hyrja" ]) &&
isset($options [ "fjalëkalimi" ])) (

$file = md5(uniqid()). ".xml" ;

Nëse (($fp = fopen ($this -> cache_dir . $file , "w" )) == false ) (
hedh perjashtim te ri ( "Nuk mund të krijohej skedari lokal WDSL (". $this -> cache_dir . $file. ")");
}

$ch = curl_init();
$credit = ($options["login"]. ":" . $options["fjalëkalimi" ]);
curl_setopt ($ch, CURLOPT_URL, $wdsl);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt ($ch, CURLOPT_USERPWD, $kredi);
curl_setopt ($ch, CURLOPT_TIMEOUT, 15);
curl_setopt ($ch, CURLOPT_FILE, $fp);
nëse (($xml = curl_exec ($ch )) === false ) (
//curl_close ($ch);
fclose ($fp);
shkëput ($this -> cache_dir . $file );

Hidhe një përjashtim të ri(curl_error($ch));
}

Curl_close ($ch);
fclose ($fp);
$wdsl = $this -> cache_url . $file ;
}

Unset($opcione [ "wdsl_local_copy" ]);
unset($opsionet [ "wdsl_force_local_copy" ]);

Echo $wdsl ;
prind :: __construct ($wdsl, $options);

Shkëputje ($this -> cache_dir . $file );
}
}
?>

tatupheba në gmail dot com

Përshëndetje njerëz!

Një sugjerim për zhvilluesit:

Kur programoni një server sapuni, vendosni direktivën "soap.wsdl_cache_enabled" në skedarin php.ini në 0:

Sapun.wsdl_cache_enabled=0

Përndryshe do të japë një mori gabimesh të çuditshme duke thënë se wsdl-ja juaj është e pasaktë ose mungon.

Bërja e kësaj do t'ju shpëtojë nga shumë dhimbje të padobishme.

titan në phpdevshell dot org

Duhet të theksohet se nëse merrni një gabim kthimi: "Referenca e objektit nuk është vendosur në një shembull të një objekti.". Kjo mund të jetë për shkak të diçkaje aq të thjeshtë sa kalimi i parametrave të pasaktë. Kur shikoni këtë XML:



varg
dataKoha
dataKoha

Kodi juaj duhet të duket diçka si kjo:

provoni (
$options = grup(
"soap_version" => SOAP_1_2,
"exceptions" => e vërtetë,
"gjurmë" => 1,
"cache_wsdl" => WSDL_CACHE_NONE
);
$client = SaapClient i ri ( "http://example.com/doc.asmx?WSDL", $opsione);
// Vini re se ku janë etiketat "Merr" dhe "kërkim" në XML
$results = $client -> Merr (array("request" =>array("CustomerId" => "1234" )));
) kap (Përjashtim $e ) (
jehonë"

Gabim përjashtimi!

" ;
echo $e -> getMessage();
}

$results = $client -> Merr (array("request" =>array("CustomerId" => "842115" )));
?>

Nëse skedari juaj WSDL përmban një parametër me një lloj base64Binary, nuk duhet të përdorni base64_encode() kur kaloni nëpër vars tuaj të sapunit. Kur bëni kërkesën, biblioteka SOAP automatikisht baza64 kodon të dhënat tuaja, kështu që përndryshe ju do t'i kodoni ato dy herë.

Pjesë e WSDL:

$string = "data_you_want_to_send___like_xml_in_soap";
$soap_data = grup(
"foo" => "bar" ,
//"content" => base64_encode($string) // mos e bëj këtë
"content" => $string //bëje këtë
);
$response = $client -> Dërgo ($soap_data );
?>

marcovtwout në hotmail dot com

Duke qenë i ri në SOAP, po kërkoja për një kohë të gjeja pse mesazhi im po merrte një përgjigje në soapUI, por jo me kodin tim php. Shërbimi specifik që po adresoja jep një HTTP 202 Pranuar pas suksesit (pa përgjigje), por kthen një mesazh SOAP për gabimet.

Situata:
Duke përdorur një lidhje (të vërtetuar) të klientit dhe një skedar WDSL, thirrjet SOAP me llojin "One-Way" nuk japin një titull përgjigjeje, edhe pse pritet një përgjigje.

Zgjidhja:
Kur telefononi konstruktorin e klientit, vendosni SOAP_WAIT_ONE_WAY_CALLS në $options["features"].

tim në tdinternet dot com

PHP 5.2.11 duket se nuk është shumë zgjedhës për korrektësinë e një WSDL.

Klientë të tjerë SOAP u ankuan për çështje të skemës dhe hapësirës së emrave, ndërsa SoapClient i PHP-së funksionoi plotësisht mirë. Megjithatë, rregullimi i këtyre problemeve për klientët e tjerë e prishi SoapClient-in e PHP deri në pikën ku objektet që kaloheshin në metodën SOAP po shndërroheshin në grupe boshe në anën e serverit.

Mësimi i nxjerrë: disa elementë ishin duke u prefiksuar me xsd: dhe të tjerë jo -- sigurohuni që WSDL juaj të jetë i saktë dhe konsistent (Unë jam duke përdorur një WSDL_Gen.php të modifikuar).

James dot Ellis në gmail dot com

Kisha probleme për të marrë përgjigje nga një server SOAP Coldfusion, pa probleme të dukshme në SoapClient të përdorur.

Përfundimisht zbulova se serveri po pranonte vetëm kërkesat SOAP 1.1 dhe jo 1.2. Nuk jam i sigurt nëse ky është një cilësim i Coldfusion në të gjithë sistemin, por nëse goditni të njëjtin mur, provoni të vendosni opsionin SoapClient "soap_version" në konstante SOAP_1_1 (që është parazgjedhja, por imi ishte i paracaktuar në 1.2 pasi klienti po ripërdorej për një shërbim tjetër )

ajcartmell në fonant dot com

Duket se ka një problem me specifikimin e vargjeve boshe për opsionet proxy_host dhe proxy_port në versionet e fundit të PHP (nga një version më i vonshëm se 5.2.9 dhe i barabartë ose më i hershëm se 5.2.11).

Furnizimi i vlerave të vargut bosh për proxy_host dhe proxy_port shkakton gabime të tipit "host not found": furnizimi NULL ose FALSE funksionon mirë.

bhargav dot khatana në gmail dot com

M'u desh më shumë se një javë për të kuptuar se si të zbatoja titujt WSSE (Web Service Security) në PHP SOAP amtare. Nuk ka shumë burime në dispozicion për këtë, kështu që mendohet të shtohet këtu për përfitime të komunitetit.

Hapi 1: Krijoni dy klasa për të krijuar një strukturë për kokat e WSSE

klasa clsWSSEAuth(
privat $Username ;
privat $Password ;
funksioni __construct ($username, $password) (
$this -> Emri i përdoruesit = $username ;
$this -> Fjalëkalimi = $password ;
}
}

Klasa clsWSSEToken (
private $UsernameToken ;
funksioni __construct ($innerVal)(
$this -> UsernameToken = $innerVal ;
}
}
?>
Hapi 2: Krijoni variabla të sapunit për emrin e përdoruesit dhe fjalëkalimin

$username = 1111 ;
$fjalëkalim = 1111 ;

//Kontrolloni me ofruesin tuaj se cilën hapësirë ​​emri sigurie po përdorin.
$strWSSENS = "http://schemas.xmlsoap.org/ws/2002/07/secext";

$objSoapVarUser = SoapVar i ri ($emri i përdoruesit, XSD_STRING, NULL, $strWSSENS, NULL, $strWSSENS);
$objSoapVarPass = SoapVar i ri ($fjalëkalimi, XSD_STRING, NULL, $strWSSENS, NULL, $strWSSENS);
?>
Hapi 3: Krijoni një objekt për klasën Auth dhe kaloni në sapun var

$objWSSEAuth = clsWSSEAuth i ri ($objSoapVarUser, $objSoapVarPass);
?>
Hapi 4: Krijoni SoapVar nga objekti i klasës Auth

$objSoapVarWSSEAuth= SoapVar i ri ($objWSSEAuth , SOAP_ENC_OBJECT , NULL , $strWSSENS , "UsernameToken" , $strWSSENS );
?>
Hapi 5: Krijo objekt për klasën e Tokenit

$objWSSEToken = clsWSSEToken i ri ($objSoapVarWSSEAuth );
?>
Hapi 6: Krijoni SoapVar nga objekti i klasës Token

$objSoapVarWSSEToken= SoapVar i ri ($objWSSEToken, SOAP_ENC_OBJECT, NULL, $strWSSENS, "UsernameToken", $strWSSENS);
?>
Hapi 7: Krijoni SoapVar për nyjen "Security".

$objSoapVarHeaderVal=SapVar i ri ($objSoapVarWSSEToken, SOAP_ENC_OBJECT, NULL, $strWSSENS, "Security", $strWSSENS);
?>
Hapi 8: Krijoni objektin e kokës nga soapvar sigurie

$objSoapVarWSSEHeader= i ri SoapHeader ($strWSSENS , "Security" , $objSoapVarHeaderVal , i vërtetë , "http://abce.com");

//Parametri i tretë këtu bën "mustUnderstand=1
//Parametri i katërt gjeneron "actor="http://abce.com ""
?>
Hapi 9: Krijoni objektin e Klientit të Sapunit

$objClient = SoapClient i ri ($WSDL, $arrOptions);
?>
Hapi 10: Vendosni titujt për objektin e klientit të sapunit

$objClient -> __setSoapHeaders (array($objSoapVarWSSEHeader ));
?>
Hapi 11: Metoda përfundimtare e thirrjes

$objResponse = $objClient -> __soapCall ($strMethod, $requestPayloadString);
?>

peter at webacoustics dot com

Zbulova se marrja e WSDL dështon kur përdor vërtetimin bazë në klientin e sapunit. Kështu që unë zbatova zgjidhjen e mëposhtme duke përdorur wget. E kuptoj se wget mund të mos jetë një opsion për disa mjedise, në atë rast cURL do të ishte gjëja tjetër më e thjeshtë.

$wsdl = get_wsdl ( "https://example.com/soap/service?wsdl");
$this -> klient = i ri SoapClient ($wsdl , array("user" => "someuser" , "password" => "somepassword" ));

Funksioni privat get_wsdl ($url) (
globale $g ;
$url = escapeshellarg($url);
$cache_file = "/tmp/soap.wsdl." . md5 ($url);

//merr vetëm një wsdl të re çdo orë
if(! file_exists ($cache_file ) || koha e skedarit ($cache_file )< time () - 3600 ) {
$agent = escapeshellarg("--user-agent=($g["useragent"])");
mwexec("wget‎ --quiet --timeout=5 ($agent) --no-check-certificate --output-document=( $cache_file ) ( $url ) " );
if(! file_exists ($cache_file )) (
hedh një përjashtim të ri ("Nuk mund të ngarkohej WSDL në ( $url )" );
}
}
kthimi
$cache_file ;
}
?>

shkrihet dhe shkrihet dot com

Për ata që luftojnë me serverë proxy të vërtetuar NTLM, këtu është një zgjidhje që po përdor atm:

/**
* Një fëmijë i SoapClient me mbështetje për vërtetimin e përfaqësuesit ntlm
*
* @autor Meltir
*
*/
klasa NTLM_SoapClient zgjeron SoapClient (

Funksioni publik __construct ($wsdl, $options = array()) (
if (empty($options [ "proxy_login" ]) || bosh ($options [ "proxy_password" ])) hedh Përjashtim të ri ( "Hyrja dhe fjalëkalimi kërkohet për vërtetimin NTLM!");
$this -> proxy_login = $options [ "proxy_login" ];
$this -> proxy_password = $options [ "proxy_password" ];
$this -> proxy_host = (bosh($options [ "proxy_host" ]) ? "localhost": $opsione[ "proxy_host"]);
$kjo-> proxy_port= (bosh($opsione[ "proxy_port"]) ? 8080 : $opsione[ "proxy_port"]);
prind:: __ndërtoj($wsdl, $opsione);
}

/**
* Telefononi një url duke përdorur curl me ntlm auth
*
* @param string $url
* @param string $data
* @return varg
* @hedh SoapFault në gabimin e lidhjes së kaçurrelave
*/
funksioni i mbrojturcallCurl($url, $të dhëna) {
$trajton= curl_init();
curl_setopt($trajton, CURLOPT_HEADER, i rremë);
curl_setopt($trajton, CURLOPT_URL, $url);
curl_setopt($trajton, CURLOPT_FAILONERROR, e vërtetë);
curl_setopt($trajton, CURLOPT_HTTPHEADER, grup ("Klient PHP SOAP-NTLM"));
curl_setopt($trajton, CURLOPT_RETURNTRANSFER, e vërtetë);
curl_setopt($trajton, CURLOPT_POSTFIELDS, $të dhëna);
curl_setopt($trajton, CURLOPT_PROXYUSERPWD, $kjo-> proxy_login. ":" . $kjo-> proxy_password);
curl_setopt($trajton, CURLOPT_PROXY, $kjo-> proxy_host. ":" . $kjo-> proxy_port);
curl_setopt($trajton, CURLOPT_PROXYAUTH, CURLAUTH_NTLM);
$përgjigje= curl_exec($trajton);
nëse (bosh (
$përgjigje)) {
hedh të re
Sapun Fault("Gabim CURL:". kaçurrela_gabim($trajton), curl_errno($trajton));
}
përkul_mbyll($trajton);
kthimi
$përgjigje;
}

Funksioni publik __doKërkoni($kërkesë, $vendndodhja, $veprim, version $, $one_way= 0 ) {
kthimi
$kjo-> callCurl($vendndodhja, $kërkesë);
}

}
?>

Kërkon kaçurrela dhe mund të zgjatet, por funksionon për nevojat e mia të thjeshta.

eric dot caron në gmail dot com

Mendimi i vënë në dukje nga jan në bestbytes dhe i diskutuar në defektin #27777, një burim i zakonshëm i "Parsing WSDL: Nuk mund të gjeja " Gabim është nga përpjekja për të hyrë në një WSDL që mbrohet nga vërtetimi HTTP. Kalimi i hyrjes/fjalëkalimit në parametrin e dytë nuk funksionon gjithmonë; kështu që nëse hasni këtë mesazh gabimi dhe po përpiqeni të hyni në një skedar të mbrojtur WSDL, provoni të kaloni emrin e përdoruesit dhe fjalëkalimin me parametrin e parë.

Anonim

Më duhej të luftoja me një sjellje mjaft të çuditshme kur përpiqesha të konsumoja shërbimet standarde të internetit Parlay X pa sukses. Megjithatë, gjeta një zgjidhje për problemin tim.

Problemi me të cilin u përballa ishte rreth një kërkese të gabuar të pavlefshme vërtetimi bazë HTTP dërguar shërbimit në internet. Megjithëse po dërgoja kredencialet e duhura, po merrja një gabim vërtetimi. Rezulton se PHP po dërgonte kërkesa HTTP në një pikë tjetër fundore e cila nuk ekspozohet drejtpërdrejt përmes shërbimit të uebit dhe ajo pikë fundore nuk kërkon vërtetim.

Zgjidhja ime për këtë çështje ishte duke përdorur këto linja të thjeshta në shembullin e përdorimit të metodës sendSms Paraly-X.

Së pari, krijimi i një klienti sapuni pa asnjë opsion vërtetimi HTTP:

$klient= e reSapunClient($wsdl_url);
?>

Kërkesa e mësipërme do të ruajë memorien e wsdl në drejtorinë /tmp. Menjëherë pas këtij ndërtimi ne krijojmë një klient tjetër sapuni, këtë herë me opsionet e vërtetimit HTTP:

provoni (
$klient= e reSapunClient($wsdl_url, grup ("hyrja"=> "grifin",
"fjalëkalim"=> "fjalëkalim"));
) kap (
Përjashtim $e) {
printf("Gabim:sendSms: %s\n", $e-> __toString());
kthimi
i rremë;
}
?>

Tani duhet të funksionojë pa asnjë problem. Pa thirrjen e dytë, PHP do të telefonojë sendSms pa kredenciale duke rezultuar në një përpjekje të dështuar për shkak të mungesës së informacionit të vërtetimit. Më duket se kjo procedurë është më e thjeshta.

Ky proces duhet të bëhet sa herë që skadon wsdl-ja e memorizuar, ose thjesht mund të rrisë kohën e jetës për wsdl-në e memorizuar nga php.ini

jon dot gilbert dhe net-entwicklung dot de

Vini re se krijimi i një klienti sapuni për një URL të pavlefshme (ju provoni se çfarë ndodh, kur një shërbim nuk është i disponueshëm, apo jo?) zakonisht shkakton një përjashtim që mund të kapet me try..catch. Sidoqoftë, nëse xdebug është aktiv, do të merrni një gabim fatal, i cili padyshim nuk mund të kapet.

sloloem në gmail dot com

Kisha një problem duke diskutuar përdorimin e hartës së klasës që më mori mjaft kohë për ta kuptuar. Unë po supozoja se lloji WSDL të cilit i referoheshin dokumentet ishte emri i elementit që kthehej në SOAP, kështu si p.sh.

Dhe po pyesja veten pse harta
"classmap"=>array("node"=>"MyNode")

Nuk bëri asgjë.
Kjo sepse në WSDL-në time e përcaktova nyjen si:

Harta e klasës që më duhej ishte:
"classmap"=>array("nodeType"=>"MyNode")

Unë kam qenë në gjendje të gjej emrat e llojeve duke përdorur SoapClient->__getTypes()
Më vonë, kuptova se ku mund të shikoja brenda WSDL për emrin e tipit që më duhej.

Nuk e di nëse kam humbur diçka shumë të dukshme, por ndoshta kjo mund të pastrojë disa nga dokumentet.

Jon

Ne kemi pasur disa probleme duke përdorur SoapClient lidhur me një server të jashtëm nëpërmjet Microsoft ISA (aktualisht v.2006, por kjo mund të zbatohet edhe për versionet e tjera). Ne ofrojmë proxy_host, proxy_port, proxy_login dhe proxy_password, por serveri ISA raporton hyrjen në të regjistrat si "anonim".

Sysadmin-i ynë beson se kjo është për shkak se PHP nuk po jep informacion NTLN (protokolli i sigurisë Windows) në formatin e duhur (dhe nëse duhet të funksionojë me proxies të pronarit është sigurisht një debat tjetër). Ne provuam "username", "DOMAIN\username" pa asnjë efekt. Zgjidhja është të shtoni një përjashtim në serverin ISA për emrin e hostit/IP; null mund të jepet më pas për proxy_login dhe proxy_password dhe lidhja më pas duhet të funksionojë siç pritej.

Në një shënim paksa të lidhur, nëse keni probleme sigurohuni që numri i portit të jepet si një numër i plotë. Disa versione të PHP nuk do të përdorin përfaqësuesin me SoapClient nëse numri i portit jepet si varg.

jan at bestbytes dot de

Ju MUND të merrni një wsdl, nëse kërkohet vërtetimi bazë:

$login = "bert";
$fjalëkalim= "fjalëkalimi i Berts";

$klient= e reSapunClient(
"http://". urlencode($login) . ":" . urlencode($fjalëkalim) . "@www.server.com/path/to/wsdl",
grup (
"hyrja"=> $login,
"fjalëkalim"=> $fjalëkalim
)
);

?>

informacion në nicksilvestro dot net

Për këdo që ka probleme me ArrayOf_xsd_string dhe merr një gabim të ngjashëm me "No deserializer defined for array type (http://www.w3.org/2001/XMLSchema)string"
Provoni të përdorni parametrin "features", të vendosur në SOAP_USE_XSI_ARRAY_TYPE - kjo siguron që të përdoret deserializuesi i duhur.

P.sh.
$klient= e reSapunClient("some.wsdl", grup ("karakteristika"=> SOAP_USE_XSI_ARRAY_TYPE));
?>

snajper

Po kërkoja një shembull të mirë dhe nuk munda ta gjeja,
më në fund e gjeta diku (harrova ku) mendoj se është
shembulli më i mirë për të bërë një kërkesë sapuni me shumë parametra

$params->AWSAccessKeyId = AMAZON_API_KEY;
$params->Kërkesë->SearchIndex = "Libra";
$params->Kërkesë->Fjalë kyçe = "php5 oop";

$amazon = SoapClient i ri ("http://webservices.amazon.com
/AWSECommerceService/AWSECommerceService.wsdl");
$rezultat = $amazon->itemSearch($params);

alex në presje reutone com

Për të lidhur PHP SOAP me MS SOAP (CRM/EXCHANGE/...) kam krijuar disa klasa duke përdorur shpjegimin më poshtë dhe në vende të tjera.
www.reutone.com/heb/articles.php?instance_id=62&actions=show&id=521

naugtur në gmail dot com

Përjashtim i SoapFault: duket sikur nuk kemi asnjë dokument XML është përmendur tashmë se ndodh kur serveri juaj nxjerr diçka më parë ... > etiketë.

Për të gjithë ata që kanë probleme me këtë, dhenuk ka qasje në kodin e serverit:
Kjo është mënyra se si të krijoni një përfaqësues që do të pastronte përgjigjetpërJu

php
/**
* Klasa e thjeshtë e marrë nga një shënim nga James Ellis
*/
klasësProxy_ClientshtrihetSapunClient{
të mbrojtura
$cacheDocument= "" ;
funksion publik
__ndërtoj($wsdl, $opsione) {
prind:: __ndërtoj($wsdl, $opsione);
}

/**
* SetCacheDocument() vendos përmbajtjen e dokumentit të ruajtur më parë
*/
funksion publikSetCacheDocument($dokument) {
$kjo-> cacheDocument= $dokument;
}

/**
* __doRequest() anulon standardin SoapClient për të trajtuar një kërkesë lokale
*/
funksion publik__doKërkoni() {
kthimi
$kjo-> cacheDocument;
}
}

//Vendosni këtë kod në funksionin tuaj ose kudo që i keni vendosur të gjitha variablat e kërkuara

$klient= e reSapunClient($wsdl_url, $settings_array);
$i pavlefshëm= $klient-> metodë $($params); //thirreni këtë për të marrë përgjigje nga serveri

$response_string= $klient-> __getLastResponse();

//kjo pjesë heq gjëra
$fillim= strpos($response_string, ");
$fund= strrpos($response_string, ">" );
$response_string= nënstr($response_string, $fillim, $fund- $fillim+ 1 );

// përgatit përfaqësuesin tuaj
$proxy= e reProxy_Client($wsdl_url, $settings_array);
//dhe mbusheni me përgjigjen e serverit
$proxy-> SetCacheDocument($response_string);

$dhe_përfundimisht_rezultati_është= $proxy-> metodë $($params);

print_r($dhe_përfundimisht_rezultati_është); //kjo ju lejon të shihni se çfarë është atje

?>

$method është emri i metodës p.sh. $method="getVersion";
$params - paramat tipike për një metodë sapuni