Praktický príklad mydlovej webovej služby v php. Píšeme aplikáciu SOAP klient-server v príkladoch PHP Soap wsdl php

  • 20.06.2020

Som zvyknutý písať PHP kód, ale nepoužívam objektovo orientované kódovanie. Teraz potrebujem interagovať so SOAP (ako klient) a zdá sa, že nemôžem nájsť správnu syntax. Mám súbor WSDL, ktorý mi umožňuje správne nastaviť nové pripojenie pomocou triedy SoapClient. Nemôžem však uskutočniť správny hovor a získať údaje späť. Potrebujem poslať nasledujúce (zjednodušené) údaje:

  • ID kontaktu
  • kontaktné meno
  • všeobecný popis
  • Sum

V dokumente WSDL sú dve funkcie, ale potrebujem len jednu (nižšie „FirstFunction“). Tu je skript, ktorý používam, aby som získal informácie o dostupných funkciách a typoch:

$client = new SoapClient("http://example.com/webservices?wsdl"); var_dump($client->__getFunctions()); var_dump($client->__getTypes());

A tu je výstup, ktorý generuje:

Array( => "Funkcia prvej funkcie1(parametre prvej funkcie)", => "Funkcia druhej funkcie2(parametre druhej funkcie)",); array( => struct Contact ( id id; name name; ) => string "string description" => string "int množstvo" )

Predpokladajme, že chcem zavolať FirstFunction s údajmi:

  • ID kontaktu: 100
  • Kontaktná osoba: Ján
  • Všeobecný popis: Barel ropy
  • Suma: 500

Aká by bola správna syntax? Skúšala som všelijaké variácie, ale štruktúra mydla sa zdá byť dosť flexibilná, takže spôsobov, ako to urobiť, je veľa. Z manuálu sa mi to nepodarilo zistiť...

AKTUALIZÁCIA 1: Vyskúšaná ukážka z MMK:

$client = new SoapClient("http://example.com/webservices?wsdl"); $params = array("id" => 100, "meno" => "Ján", "popis" => "Barel ropy", "množstvo" => 500,); $response = $client->__soapCall("Function1", array($params));

Dostávam však túto odpoveď: Objekt nemá vlastnosť „Kontakt“. Ako môžete vidieť vo výstupe getTypes() , existuje štruktúra s názvom Contact, takže si myslím, že musím nejako objasniť, že moje parametre zahŕňajú údaje kontaktu, ale otázka znie: ako?

AKTUALIZÁCIA 2: Skúšal som aj tieto štruktúry, rovnaká chyba.

$params = array(array("id" => 100, "name" => "John",), "Barel of Oil", 500,);

Ako aj:

$params = array("Kontakt" => array("id" => 100, "meno" => "Ján", "popis" => "Barel ropy", "množstvo" => 500,);

Chyba v oboch prípadoch: Objekt nemá vlastnosť „Kontakt“.

8 odpovedí

To je to, čo musíte urobiť.

Len aby som vedel, pokúsil som sa obnoviť vašu situáciu...

  • V tomto príklade som vytvoril webovú službu .NET pomocou WebMethod s názvom Function1 a toto sú parametre:

Funkcia 1 (kontaktný kolík, popis reťazca, počet int)

    V ktorej je Contact len ​​trieda fazule, ktorá má getry a nastavovače pre id a name , ako vo vašom prípade.

    Túto webovú službu .NET si môžete stiahnuť pomocou:

Kód.

To je to, čo musíte urobiť na strane PHP:

(Testované a funkčné)

id = $id; $toto->meno = $meno; ) ) /* Inicializujte webovú službu pomocou vášho WSDL */ $client = new SoapClient("http://localhost:10139/Service1.asmx?wsdl"); /* Vyplňte objekt kontaktu */ $contact = new Contact(100, "John"); /* Nastavte parametre požiadavky */ $params = array("Kontakt" => $kontakt, "popis" => "Barrel of Oil", "amount" => 500,); /* Vyvolajte metódu webovej služby s vašimi parametrami, v tomto prípade: Function1 */ $response = $client->__soapCall("Function1", array($params)); /* Tlač odpovede webovej služby */ var_dump($response); ?>

Ako zistím, že to funguje?

  • Ak urobíte print_r($params); , uvidíte tento výstup, pretože vaša webová služba očakáva:

Pole ([Kontakt] => Kontaktný objekt ( => 100 => Ján) [popis] => Barel ropy [množstvo] => 500)

  • Keď som odladil ukážkovú webovú službu .NET, dostal som nasledovné:

(Ako vidíte, objekt Contact nie je null, rovnako ako ostatné parametre, čo znamená, že vaša požiadavka bola úspešne dokončená zo strany PHP).

  • Odpoveď z webovej služby .NET bola podľa očakávania a zobrazená na strane PHP:

objekt (stdClass) public "Function1Result" => string "Podrobnosti pre Vašu požiadavku! id: 100, meno: John, popis: Barel oleja, množstvo: 500" (dĺžka = 98)

Dúfam, že to pomôže :-)

Môžete tiež použiť služby SOAP:

"Španielsko", "Mesto" => "Alicante"); $response = $soapclient->getWeather($params); var_dump($response); // Získanie miest podľa krajiny $param = array("CountryName" => "Španielsko"); $response = $soapclient->getCitiesByCountry($param); var_dump($response);

Toto je príklad s reálnou službou a funguje to.

Dúfam, že to pomôže.

Najprv inicializujte webové služby:

$client = new SoapClient("http://example.com/webservices?wsdl");

Potom nastavte a odovzdajte parametre:

$params = pole ("arg0" => $contactid, "arg1" => $desc, "arg2" => $contactname); $response = $klient->__soapCall("methodname", array($params));

Všimnite si, že názov metódy je dostupný vo WSDL ako názov operácie, napríklad:

Neviem, prečo má moja webová služba rovnakú štruktúru ako vaša, ale nepotrebuje triedu pre parameter, iba pole.

Napríklad:- Môj WSDL:

5390a7006cee11e0ae3e0800200c9a66 831f8c1ad25e1dc89cf2d8f23d2af...fa85155f5c67627 VITS-STAELENS Bez teba 0.100 10K24 2012-12-31 Gladys Roldan de Moras

Calle General Oraá 26 (4º vydanie) 28006 Madrid ES
[chránený e-mailom] es

Var_dump($client->getFunctions()); var_dump($client->getTypes());

Tu je výsledok:

Pole 0 => reťazec "Potvrdenie objednávky createOrder(Požiadavka objednávky $createOrder)" (dĺžka=56) pole 0 => reťazec "struct OrderRequest (Identifikácia identifikácie; Doručenie; Balík; Príjemca; reťazec odkaz; )" (dĺžka=130) 1 => reťazec "Identifikácia štruktúry ( odosielateľ reťazca; hash reťazca; pôvodca reťazca; )" (dĺžka=75) 2 => reťazec "struct Delivery (Uzol z; Uzol do; )" (dĺžka=41) 3 => reťazec " struct Node ( string country; string node; )" (dĺžka=46) 4 => string "struct Parcel ( popis reťazca; desatinná váha; string orderNumber; dátum orderDate; )" (dĺžka=93) 5 => string "struct Receiver ( string meno; string priezvisko; Adresa adresa; string email; string language; )" (dĺžka=106) 6 => string "struct Address ( string line1; string line2; string postalCode; string city; string country; )" (dĺžka =99) 7 => string "struct OrderConfirmation ( string trackingNumber; string reference; )" (dĺžka=71) 8 => string "str uctOrderServiceException(stringcode; OrderServiceException faultInfo; reťazcová správa; )" (dĺžka=97)

Takže v mojom kóde:

$client = new SoapClient("http://packandship-ws.kiala.com/psws/order?wsdl"); $params = array("reference" => $orderId, "identifikácia" => array("odosielateľ" => param("kiala", "sender_id"), "hash" => hash("sha512", $orderId . param("kiala", "sender_id") .param("kiala", "heslo")), "originator" => null,), "delivery" => array("from" => array("country" = > "es", "node" => "", "to" => pole ("krajina" => "es", "node" => "0299")), "parcel" => pole ( "popis" => "Popis", "hmotnosť" => 0,200, "číslo objednávky" => $orderId, "orderDate" => dátum("Ymd")), "prijímač" => array("firstName" => " Meno zákazníka", "priezvisko" => "Meno zákazníka", "adresa" => array("linka1" => "Adresa 1. linky", "linka2" => "Adresa 2. linky", "PSČ" = > 28006, "mesto" => "Madrid", "krajina" => "es", "e-mail" => " [chránený e-mailom]", "jazyk" => "es")); $result = $klient->createOrder($params); var_dump($result);

ale má úspech!

Toto je dobrý príklad funkcie SOAP "__call". Je však zastaraný.

Envio Internacional: "; $vem = $cliente->__call("CustoEMSInternacional",array($int_zona, $int_peso)); tlač $vem; tlač "

"; ?>

  • tutoriál

Ahoj!
Stalo sa, že nedávno som sa začal venovať vývoju webových služieb. Ale dnes téma nie je o mne, ale o tom, ako si môžeme napísať vlastnú XML webovú službu založenú na protokole SOAP 1.2.

Dúfam, že po prečítaní témy budete vedieť:

  • napísať vlastnú serverovú implementáciu webovej aplikácie;
  • napísať vlastnú klientsku implementáciu webovej aplikácie;
  • napíšte svoj vlastný popis webovej služby (WSDL);
  • odosielať polia rovnakého typu údajov na server klientom.
Ako asi tušíte, všetky kúzla budú vykonané pomocou PHP a vstavaných tried SoapClient a SoapServer. Ako králik budeme mať službu na posielanie sms správ.

1 Vyhlásenie o probléme

1.1 Hranice

Na začiatku navrhujem zaoberať sa výsledkom, ktorý dosiahneme na konci témy. Ako bolo oznámené vyššie, napíšeme službu na odosielanie sms správ, presnejšie povedané, budeme prijímať správy z rôznych zdrojov pomocou protokolu SOAP. Potom zvážime, v akej forme prídu na server. Proces zaraďovania správ do fronty na ďalšie odoslanie poskytovateľovi, žiaľ, z mnohých dôvodov presahuje rámec tohto príspevku.

1.2 Aké údaje sa zmenia?

Dobre, máme limity! Ďalším krokom, ktorý je potrebné urobiť, je rozhodnúť, aké údaje si budeme vymieňať medzi serverom a klientom. Na túto tému navrhujem, aby ste neboli dlho múdrejší a okamžite si odpovedali na hlavné otázky:
  • Aké minimálne údaje musia byť odoslané na server, aby bolo možné odoslať SMS správu účastníkovi?
  • Aké je minimálne množstvo údajov, ktoré musia byť odoslané zo servera na uspokojenie potrieb klienta?
Niečo mi hovorí, že na to je potrebné poslať nasledovné:
  • číslo mobilného telefónu a
  • SMS text.
V zásade stačia na odoslanie tieto dve charakteristiky, ale hneď sa mi zdá, že sms s blahoželaním k narodeninám vám príde o 3:00 ráno, alebo o 4! V tejto chvíli budem všetkým veľmi vďačná, že na mňa nezabudli! Preto pošleme aj na server a
  • dátum odoslania SMS správy.
Ďalšia vec, ktorú by som chcel poslať na server, je
  • Typ správy.
Tento parameter nie je povinný, ale môže sa nám veľmi hodiť, ak potrebujeme šéfovi rýchlo povedať, koľkých našich klientov sme „potešili“ našimi novinkami, a nakresliť o tom aj krásnu štatistiku.

A predsa som na niečo zabudol! Ak sa trochu viac zamyslíme, stojí za zmienku, že klient môže naraz poslať na server jednu SMS správu alebo ich určitý počet. Inými slovami, v jednom dátovom pakete môže byť od jednej do nekonečna správ.

Výsledkom je, že na odoslanie SMS správy potrebujeme nasledujúce údaje:

  • Mobilné číslo,
  • text sms,
  • čas odoslania SMS správy účastníkovi,
  • typ správy.

Odpovedali sme na prvú otázku, teraz je potrebné odpovedať na druhú otázku. A možno si dovolím trochu podvádzať. Zo servera teda budeme posielať iba boolovské dáta, ktorých hodnota má nasledujúci význam:

  • TRUE - paket úspešne dorazil na server, prešiel autentifikáciou a zaradil sa do frontu na odoslanie poskytovateľovi sms
  • FALSE – vo všetkých ostatných prípadoch

Týmto končíme popis problému! A nakoniec, poďme k tomu najzaujímavejšiemu - prídeme na to, aké zvláštne zviera je toto MYDLO!

2 Čo je SOAP?

Vo všeobecnosti som pôvodne neplánoval písať nič o tom, čo je SOAP, a chcel som sa obmedziť na odkazy na stránku w3.org s potrebnými špecifikáciami, ako aj na odkazy na Wikipédiu. Ale na samom konci som sa rozhodol napísať krátku referenciu o tomto protokole.

A svoj príbeh začnem tým, že tento protokol výmeny dát patrí do podmnožiny protokolov založených na takzvanej paradigme RPC (Remote Procedure Call), ktorej protipólom je REST (Representational State Transfer, reprezentatívny prenos stavu) . Viac si o tom môžete prečítať na Wikipédii, odkazy na články sú na samom konci témy. Z týchto článkov musíme pochopiť nasledovné: „Prístup RPC vám umožňuje využívať malé množstvo sieťových prostriedkov s veľkým počtom metód a zložitým protokolom. S prístupom REST je počet metód a zložitosť protokolu výrazne obmedzené, čo môže viesť k veľkému počtu individuálnych zdrojov.“ To znamená, že vo vzťahu k nám to znamená, že v prípade prístupu RPC bude mať stránka vždy jeden vstup (odkaz) na službu a akú procedúru zavolať na spracovanie prichádzajúcich údajov, ktoré odovzdávame spolu s údajmi, pričom s prístupom REST na našej stránke Stránka má veľa vstupov (odkazov), z ktorých každý prijíma a spracováva len určité údaje. Ak niekto čítajúci vie, ako ešte jednoduchšie vysvetliť rozdiel v týchto prístupoch, potom určite napíšte do komentárov!

Ďalšia vec, ktorú potrebujeme vedieť o SOAP je, že tento protokol používa rovnaké XML ako transport, čo je na jednej strane veľmi dobré, pretože. náš arzenál okamžite zahŕňa plnú silu zásobníka technológií založených na tomto značkovacom jazyku, konkrétne XML-Schema - jazyk na popis štruktúry XML dokumentu (vďaka Wikipédii!), ktorý umožňuje automatickú validáciu dát prichádzajúcich na server od klientov.

A tak teraz vieme, že SOAP je protokol používaný na implementáciu vzdialeného volania procedúr a používa XML ako transport! Ak si prečítate článok na Wikipédii, odtiaľ sa dozviete aj to, že ho možno použiť na akomkoľvek protokole aplikačnej vrstvy, a nie len spárovať s HTTP (žiaľ, v tejto téme budeme uvažovať iba o SOAP cez HTTP). A viete čo sa mi na tom všetkom páči najviac? Ak neexistujú žiadne dohady, potom vám poradím - MYDLO!… Aj tak neboli žiadne dohady?... Čítali ste určite článok na Wikipédii?... Vo všeobecnosti vás nebudem ďalej mučiť. Preto hneď prejdem k odpovedi: „SOAP (z angl. Simple Object Access Protocol – jednoduchý protokol prístup k objektom; podľa špecifikácie 1.2)". Vrchol tohto riadku je uvedený kurzívou! Neviem, aké závery ste z toho všetkého vyvodili, ale vidím nasledovné - keďže tento protokol v žiadnom prípade nemožno nazvať "jednoduchým" (a zjavne s tým súhlasí aj w3), tak od verzie 1.2 prestal byť vôbec dešifrovať! A stalo sa známe ako SOAP, len SOAP a bodka.

Dobre, ospravedlňujem sa, pošmykol som sa trochu nabok. Ako som už písal, XML sa používa ako transport a pakety, ktoré bežia medzi klientom a serverom, sa nazývajú SOAP obálky. Ak vezmeme do úvahy všeobecnú štruktúru obálky, bude sa vám zdať veľmi známa, pretože pripomína štruktúru HTML stránky. Má hlavnú časť - Obálka, ktorá zahŕňa sekcie hlavička A Telo, alebo Chyba. IN Teloúdaje sa prenášajú a je to povinná časť obálky, pričom hlavička je voliteľná. IN hlavička môže byť prenášaná autorizácia alebo akékoľvek iné údaje, ktoré priamo nesúvisia so vstupnými údajmi postupov webovej služby. Pro Chyba nie je potrebné povedať nič zvláštne, okrem toho, že to prichádza klientovi zo servera v prípade akýchkoľvek chýb.

Tu sa môj prehľadový príbeh o protokole SOAP končí (na samotné obálky a ich štruktúru sa pozrieme podrobnejšie, keď sa náš klient a server konečne naučia, ako ich navzájom spúšťať) a začína nový – o spoločníčke SOAP volal WSDL(Jazyk popisu webových služieb). Áno, áno, toto je práve to, čo väčšinu z nás desí zo samotného pokusu prevziať a implementovať vlastné API na tento protokol. Výsledkom je, že zvyčajne znovu objavujeme naše koleso s JSON ako transport. Takže, čo je WSDL? WSDL je jazyk na popis webových služieb a prístup k nim, založený na jazyku XML (c) Wikipedia. Ak vám z tejto definície nie je jasný celý posvätný význam tejto technológie, potom sa to pokúsim opísať vlastnými slovami!

WSDL je navrhnutý tak, aby umožnil našim klientom normálnu komunikáciu so serverom. Na tento účel sú v súbore s príponou „*.wsdl“ popísané nasledujúce informácie:

  • Aké menné priestory boli použité,
  • Aké dátové schémy boli použité,
  • Aké typy správ očakáva webová služba od klientov,
  • Ktoré údaje patria ku ktorým postupom webovej služby,
  • Aké postupy obsahuje webová služba,
  • Ako má klient volať procedúry webovej služby,
  • Na akú adresu sa majú odosielať hovory klientov.
Ako vidíte, tento súbor je celá webová služba. Zadaním adresy súboru WSDL v klientovi budeme vedieť všetko o akejkoľvek webovej službe! V dôsledku toho nemusíme vedieť absolútne nič o tom, kde sa samotná webová služba nachádza. Stačí poznať umiestnenie jeho súboru WSDL! Čoskoro zistíme, že SOAP nie je také strašidelné, ako sa maľuje (c) ruské príslovie.

3 Úvod do schémy XML

Teraz vieme veľa o tom, čo je SOAP, čo je v ňom a máme prehľad o tom, aký technologický zásobník ho obklopuje. Keďže SOAP je v prvom rade metóda interakcie medzi klientom a serverom a ako transportný prostriedok sa používa značkovací jazyk XML, v tejto časti trochu pochopíme, ako prebieha automatická validácia údajov prostredníctvom schém XML.

Hlavnou úlohou schémy je popísať štruktúru dát, ktoré ideme spracovávať. Všetky údaje v schémach XML sú rozdelené do jednoduché(skalárny) a komplexný(štruktúry) typy. Jednoduché typy zahŕňajú tieto typy:

  • linka,
  • číslo,
  • boolovská hodnota,
  • dátum.
Niečo veľmi jednoduché, čo vo vnútri nemá žiadne rozšírenia. Ich antipódom sú zložité komplexné typy. Najjednoduchším príkladom zložitého typu, ktorý každému napadne, sú predmety. Napríklad kniha. Kniha obsahuje vlastnosti: autora, titul, cena, ISBN číslo atď. A tieto vlastnosti môžu byť jednoduché aj zložité. A úlohou XML schémy je opísať ju.

Navrhujem nezachádzať ďaleko a napísať schému XML pre našu SMS správu! Nižšie je uvedený xml popis sms správy:

71239876543 Testovacia správa 2013-07-20T12:00:00 12
Naša schéma komplexného typu bude vyzerať takto:


Tento záznam znie takto: máme premennú " správu» typ « správu"a existuje komplexný typ s názvom " správu", ktorý pozostáva zo sekvenčnej sady prvkov" telefón» typ reťazec, « text» typ reťazec, « dátum» typ Dátum Čas, « typu» typ desiatkový. Tieto typy sú jednoduché a sú už definované v definícii schémy. Gratulujem! Práve sme napísali našu prvú schému XML!

Myslím si, že význam prvkov " prvok"A" komplexnýTyp» Všetko sa vám viac-menej vyjasnilo, preto sa im už nebudeme venovať a prejdeme hneď na skladateľský prvok « postupnosť". Keď použijeme prvok compositor " postupnosť» informujeme, že prvky v ňom obsiahnuté musia byť vždy v poradí uvedenom v schéme a tiež všetky sú povinné. Ale nezúfajte! V schémach XML sú ďalšie dva prvky skladateľa: výber"A" všetky". Skladateľ výber" označuje, že by mal byť v ňom uvedený jeden z prvkov, a skladateľ " všetky» – ľubovoľná kombinácia uvedených prvkov.

Ako si pamätáte, v prvej časti témy sme sa zhodli, že balík je možné prenášať od jednej do nekonečna SMS správ. Preto navrhujem pochopiť, ako sú takéto údaje deklarované v schéme XML. Všeobecná štruktúra balíka môže vyzerať takto:

71239876543 Testovacia správa 1 2013-07-20T12:00:00 12 71239876543 Testovacia správa N 2013-07-20T12:00:00 12
Schéma pre takýto komplexný typ by vyzerala takto:


Prvý blok obsahuje známu deklaráciu komplexného typu „ správu". Ak si všimnete, potom v každom jednoduchom type obsiahnutom v " správu“, boli pridané nové kvalifikačné atribúty “ minOccurs"A" maxOccurs". Keďže z názvu nie je ťažké uhádnuť, prvý ( minOccurs) označuje, že daná sekvencia musí obsahovať aspoň jeden prvok typu " telefón», « text», « dátum"A" typu“, zatiaľ čo ďalšie ( maxOccurs) nám deklaruje, že v našej sekvencii je najviac jeden takýto prvok. Výsledkom je, že keď píšeme naše schémy pre akékoľvek údaje, máme najširší výber, ako ich nakonfigurovať!

Druhý blok schémy deklaruje prvok " messageList» typ « Zoznam správ". Je jasné, že" Zoznam správ' je komplexný typ, ktorý obsahuje aspoň jeden prvok ' správu“, ale maximálny počet takýchto prvkov nie je obmedzený!

4 Zápis vášho WSDL

Pamätáte si, že WSDL je naša webová služba? Dúfam, že si pamätáš! Keď ho napíšeme, bude na ňom plávať naša malá webová služba. Takže vám odporúčam nepodvádzať.

Vo všeobecnosti, aby nám všetko správne fungovalo, musíme klientovi preniesť WSDL súbor so správnym MIME typom. Aby ste to dosiahli, musíte zodpovedajúcim spôsobom nakonfigurovať váš webový server, konkrétne nastaviť typ MIME pre súbory s príponou *.wsdl na nasledujúci riadok:

Aplikácia/wsdl+xml
Ale v praxi som zvyčajne posielal hlavičku HTTP cez PHP “ text/xml»:

Hlavička("Typ obsahu: text/xml; charset=utf-8");
a všetko fungovalo skvele!

Chcem vás hneď varovať, naša jednoduchá webová služba bude mať dosť pôsobivý popis, takže sa nezľaknite, pretože. väčšina textu je povinná voda a po napísaní ho možno neustále kopírovať z jednej webovej služby do druhej!

Keďže WSDL je XML, hneď v prvom riadku o ňom musíte písať priamo. Koreňový prvok súboru musí mať vždy názov " definície»:


WSDL zvyčajne pozostáva zo 4-5 hlavných blokov. Hneď prvým blokom je definícia webovej služby, alebo inak povedané, vstupného bodu.


Tu je napísané, že máme službu s názvom - " Služba SMS". V zásade môžete všetky mená v súbore WSDL zmeniť na čokoľvek chcete, pretože nehrajú absolútne žiadnu rolu.

Potom vyhlasujeme, že v našej webovej službe " Služba SMS" existuje vstupný bod ("port"), ktorý sa nazýva " SmsServicePort". Práve do tohto vstupného bodu budú odoslané všetky požiadavky od klientov na server. A špecifikujeme v prvku " adresu» odkaz na súbor obsluhy, ktorý bude akceptovať požiadavky.

Potom, čo sme definovali webovú službu a určili pre ňu vstupný bod, musíme na ňu naviazať podporované procedúry:


K tomu vypíše, ktoré operácie a v akom tvare sa bude y volať. Tie. pre prístav SmsServicePort» väzba s názvom « SmsServiceBinding", ktorý má typ hovoru " rpc“ a HTTP sa používa ako prenosový protokol (transport). Preto sme tu naznačili, že uskutočníme volanie RPC cez HTTP. Potom popíšeme, ktoré postupy ( prevádzka) sú podporované vo webovej službe. Budeme podporovať iba jeden postup - " poslaťSms". Prostredníctvom tohto postupu budú naše úžasné správy odoslané na server! Po vyhlásení postupu je potrebné uviesť, v akej forme sa budú údaje prenášať. V tomto prípade je špecifikované, že sa použijú štandardné SOAP obálky.

Potom musíme postup spojiť so správami:


Aby sme to dosiahli, špecifikujeme, že naša väzba ("väzba") je typu " SmsServicePortType"a v živle" portType» s rovnakým názvom typu zadajte väzbu procedúr na správy. Prichádzajúca správa (z klienta na server) sa teda bude nazývať „ odoslaťSmsRequest"a odchádzajúce (zo servera ku klientovi)" sendSmsResponse". Rovnako ako všetky mená vo WSDL, názvy prichádzajúcich a odchádzajúcich správ sú ľubovoľné.

Teraz nám treba popísať samotné správy, t.j. prichádzajúce a odchádzajúce:


Za týmto účelom pridáme prvky " správu» s menami « odoslaťSmsRequest"A" sendSmsResponse“ resp. V nich uvádzame, že na vstup má prísť obálka, ktorej štruktúra zodpovedá typu údajov " Žiadosť". Potom sa zo servera vráti obálka obsahujúca typ údajov - " odpoveď».

Teraz musíme urobiť len málo - pridať popis týchto typov do nášho súboru WSDL! A ako si myslíte, že WSDL popisuje prichádzajúce a odchádzajúce dáta? Myslím, že ste už dávno všetkému rozumeli a povedali ste si, že pomocou XML schém! A budete mať úplnú pravdu!


Môžete nám zablahoželať! Náš prvý WSDL bol napísaný! A sme o krok bližšie k dosiahnutiu nášho cieľa.
Ďalej sa budeme zaoberať tým, čo nám PHP poskytuje na vývoj vlastných distribuovaných aplikácií.

5 Náš prvý SOAP server

Predtým som napísal, že na vytvorenie servera SOAP v PHP použijeme vstavanú triedu SoapServer. Aby všetky ďalšie akcie prebehli rovnako ako moje, budete musieť trochu upraviť svoje PHP. Aby sme boli ešte presnejší, musíte sa uistiť, že máte nainštalované rozšírenie „php-soap“. Ako ho umiestniť na váš webový server je najlepšie si prečítať na oficiálnej stránke PHP (pozri referencie).

Keď je všetko nainštalované a nakonfigurované, budeme musieť vytvoriť súbor “ smsservice.php» s nasledujúcim obsahom:

setClass("SoapSmsGateWay"); //Spustenie servera $server->handle();
To, čo je nad čiarou pri funkcii „ini_set“, dúfam netreba vysvetľovať. Pretože definuje, ktoré HTTP hlavičky budeme posielať zo servera klientovi a nakonfiguruje prostredie. V riadku „ini_set“ zakážeme ukladanie súboru WSDL do vyrovnávacej pamäte, aby sa naše zmeny v ňom okamžite prejavili na klientovi.

Teraz prichádzame na server! Ako vidíte, celý server SOAP má iba tri riadky! V prvom riadku vytvoríme novú inštanciu objektu SoapServer a jeho konštruktorovi odovzdáme adresu popisu našej webovej služby WSDL. Teraz vieme, že sa bude nachádzať v koreňovom adresári hostiteľa v súbore s výrečným názvom " smsservice.wsdl.php". V druhom riadku hovoríme SOAP serveru, ktorú triedu má stiahnuť, aby spracoval obálku prijatú od klienta a vrátil obálku s odpoveďou. Ako ste možno uhádli, práve v tejto triede bude opísaná naša jediná metóda. poslaťSms. V treťom riadku spustíme server! Všetko, náš server je pripravený! S čím nám všetkým blahoželám!

Teraz musíme vytvoriť súbor WSDL. Ak to chcete urobiť, môžete buď jednoducho skopírovať jeho obsah z predchádzajúcej časti, alebo si ho trochu „vymodelovať“:

"; ?> /" 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" />
V tejto fáze by nám výsledný server mal úplne vyhovovať, pretože. môžeme zaznamenať prichádzajúce obálky a potom pokojne analyzovať prichádzajúce údaje. Aby sme mohli prijímať čokoľvek na server, potrebujeme klienta. Tak poďme na to!

6 SOAP klient na ceste

V prvom rade si musíme vytvoriť súbor, do ktorého budeme klienta zapisovať. Ako obvykle ho vytvoríme v koreňovom adresári hostiteľa a nazveme ho „ klient.php“ a vnútri píšeme nasledovné:

messageList = new MessageList(); $req->messageList->message = new Message(); $req->messageList->message->phone = "79871234567"; $req->messageList->message->text = "Testovacia správa 1"; $req->messageList->message->date = "2013-07-21T15:00:00.26"; $req->messageList->message->type = 15; $client = new SoapClient("http://($_SERVER["HTTP_HOST"])/smsservice.wsdl.php", array("soap_version" => SOAP_1_2)); var_dump($client->sendSms($req));
Popíšme naše predmety. Keď sme písali WSDL, boli v ňom opísané tri entity pre obálku vstupujúcu na server: Žiadosť, Zoznam správ A správu. V súlade s tým triedy Žiadosť, Zoznam správ A správu sú odrazom týchto entít v našom PHP skripte.

Potom, čo sme definovali objekty, musíme vytvoriť objekt ( $req), ktorý bude odoslaný na server. Potom sú tu pre nás dve najcennejšie línie! Náš SOAP klient! Verte tomu alebo nie, ale to stačí na to, aby náš server začal sypať správy od klienta, ako aj na to, aby ich náš server úspešne prijímal a spracovával! V prvom z nich vytvoríme inštanciu triedy SoapClient a jeho konštruktorovi odovzdáme adresu umiestnenia súboru WSDL a v parametroch explicitne uvedieme, že budeme pracovať s protokolom SOAP verzie 1.2. Na ďalšom riadku zavoláme metódu poslaťSms objekt $klient a okamžite zobraziť výsledok v prehliadači.
Poďme to spustiť a uvidíme, čo sme nakoniec dostali!

Zo servera som dostal nasledujúci objekt:

Object(stdClass) public "status" => boolean true
A to je úžasné, pretože. teraz s istotou vieme, že náš server funguje a nielen funguje, ale môže klientovi vrátiť niektoré hodnoty!

Teraz sa pozrime na denník, ktorý obozretne vedieme na strane servera! V jeho prvej časti vidíme nespracované údaje, ktoré vstúpili na server:

79871234567 Testovacia správa 1 2013-07-21T15:00:00.26 15
Toto je obálka. Teraz viete, ako to vyzerá! Je však nepravdepodobné, že by sme mali záujem ho neustále obdivovať, takže poďme deserializovať objekt zo súboru denníka a uvidíme, či je s nami všetko v poriadku:

Object(stdClass) public "messageList" => object(stdClass) public "message" => object(stdClass) public "phone" => string "79871234567" (dĺžka=11) public "text" => string "Testovacia správa 1 " (dĺžka=37) public "date" => reťazec "2013-07-21T15:00:00.26" (dĺžka=22) public "type" => reťazec "15" (dĺžka=2)
Ako vidíte, objekt bol deserializovaný správne, k čomu by som nám všetkým chcel zablahoželať! Ďalej nás čaká niečo zaujímavejšie! Klientom totiž pošleme na server nie jednu sms-správu, ale celý balík (presnejšie tri celé)!

7 Odosielanie zložitých objektov

Zamyslime sa nad tým, ako môžeme poslať na server veľa správ v jednom balíku? Pravdepodobne najjednoduchším spôsobom by bolo usporiadať pole v prvku messageList! Poďme na to:

// vytvorenie objektu na odoslanie na server $req = new Request(); $req->messageList = new MessageList(); $msg1 = nová správa (); $msg1->telefón = "79871234567"; $msg1->text = "Testovacia správa 1"; $msg1->date = "2013-07-21T15:00:00.26"; $msg1->typ = 15; $msg2 = nová správa (); $msg2->telefón = "79871234567"; $msg2->text = "Testovacia správa 2"; $msg2->date = "2014-08-22T16:01:10"; $msg2->typ = 16; $msg3 = nová správa (); $msg3->telefón = "79871234567"; $msg3->text = "Testovacia správa 3"; $msg3->date = "2014-08-22T16:01:10"; $msg3->typ = 17; $req->messageList->message = $msg1; $req->messageList->message = $msg2; $req->messageList->message = $msg3;
Naše protokoly ukazujú, že nasledujúci paket prišiel od klienta:

79871234567 Testovacia správa 1 2013-07-21T15:00:00.26 15 79871234567 Testovacia správa 2 2014-08-22T16:01:10 16 79871234567 Testovacia správa 3 2014-08-22T16:01:10 17
Aký nezmysel, hovoríš? A v istom zmysle budete mať pravdu, pretože. tak ako sme sa dozvedeli, že ktorý objekt odišiel z klienta, prišiel na náš server vo forme obálky v presne tej istej forme. Pravda, sms správy neboli serializované v XML tak, ako sme potrebovali – museli byť zabalené do prvkov správu, nie v Štruktúra. Teraz sa pozrime, v akej forme takýto objekt prichádza do metódy poslaťSms:

Object(stdClass) public "messageList" => object(stdClass) public "message" => object(stdClass) public "Struct" => pole (veľkosť=3) 0 => objekt (stdClass) public "telefón" => reťazec "79871234567" (dĺžka=11) public "text" => reťazec "Testovacia správa 1" (dĺžka=37) public "dátum" => reťazec "2013-07-21T15:00:00.26" (dĺžka=22) public " typ" => reťazec "15" (dĺžka=2) 1 => objekt (štandardná trieda) verejný "telefón" => reťazec "79871234567" (dĺžka=11) verejný "text" => reťazec "Testovacia správa 2" (dĺžka= 37) public "date" => string "2014-08-22T16:01:10" (dĺžka=19) public "type" => string "16" (dĺžka=2) 2 => objekt (stdClass) public "telefón " => reťazec "79871234567" (dĺžka=11) public "text" => reťazec "Testovacia správa 3" (dĺžka=37) public "dátum" => reťazec "2014-08-22T16:01:10" (dĺžka= 19) verejný "typ" => reťazec "17" (dĺžka = 2)
Čo nám toto poznanie dáva? Jedine, že cesta, ktorú sme zvolili, nie je správna a nedostali sme odpoveď na otázku - „Ako môžeme získať správnu dátovú štruktúru na serveri?“. Ale navrhujem, aby sme nezúfali a pokúsili sa obsadiť naše pole typu objekt:

$req->messageList->message = (objekt)$req->messageList->message;
V tomto prípade dostaneme ďalšiu obálku:

79871234567 Testovacia správa 1 2013-07-21T15:00:00.26 15 79871234567 Testovacia správa 2 2014-08-22T16:01:10 16 79871234567 Testovacia správa 3 2014-08-22T16:01:10 17
Vstúpil do metódy poslaťSms objekt má nasledujúcu štruktúru:

Object(stdClass) public "messageList" => object(stdClass) public "message" => object(stdClass) public "BOGUS" => pole (veľkosť=3) 0 => objekt (stdClass) public "phone" => reťazec "79871234567" (dĺžka=11) public "text" => reťazec "Testovacia správa 1" (dĺžka=37) public "dátum" => reťazec "2013-07-21T15:00:00.26" (dĺžka=22) public " typ" => reťazec "15" (dĺžka=2) 1 => objekt (štandardná trieda) verejný "telefón" => reťazec "79871234567" (dĺžka=11) verejný "text" => reťazec "Testovacia správa 2" (dĺžka= 37) public "date" => string "2014-08-22T16:01:10" (dĺžka=19) public "type" => string "16" (dĺžka=2) 2 => objekt (stdClass) public "telefón " => reťazec "79871234567" (dĺžka=11) public "text" => reťazec "Testovacia správa 3" (dĺžka=37) public "dátum" => reťazec "2014-08-22T16:01:10" (dĺžka= 19) verejný "typ" => reťazec "17" (dĺžka = 2)
Pokiaľ ide o mňa, potom „zo zmeny miesta pojmov sa súčet nemení“ (c). Čo PODVODNÝ, čo Štruktúra Ešte sme nedosiahli náš cieľ! A aby sme to dosiahli, musíme sa postarať o to, aby namiesto týchto nezrozumiteľných mien náš rodák správu. Ako to však dosiahnuť, autor zatiaľ nevie. Preto jediné, čo môžeme urobiť, je zbaviť sa nadbytočnej nádoby. Inými slovami, teraz sa uistíme, že namiesto toho správu sa stal PODVODNÝ! Ak to chcete urobiť, zmeňte objekt takto:

// vytvorenie objektu na odoslanie na server $req = new Request(); $msg1 = nová správa (); $msg1->telefón = "79871234567"; $msg1->text = "Testovacia správa 1"; $msg1->date = "2013-07-21T15:00:00.26"; $msg1->typ = 15; $msg2 = nová správa (); $msg2->telefón = "79871234567"; $msg2->text = "Testovacia správa 2"; $msg2->date = "2014-08-22T16:01:10"; $msg2->typ = 16; $msg3 = nová správa (); $msg3->telefón = "79871234567"; $msg3->text = "Testovacia správa 3"; $msg3->date = "2014-08-22T16:01:10"; $msg3->typ = 17; $req->messageList = $msg1; $req->messageList = $msg2; $req->messageList = $msg3; $req->messageList = (objekt)$req->messageList;
Čo ak budeme mať šťastie a zo schémy vypadne správny názov? Ak to chcete urobiť, pozrime sa na doručenú obálku:

79871234567 Testovacia správa 1 2013-07-21T15:00:00.26 15 79871234567 Testovacia správa 2 2014-08-22T16:01:10 16 79871234567 Testovacia správa 3 2014-08-22T16:01:10 17
Áno, zázrak sa nestal! PODVODNÝ- nevyhráme! Vošiel poslaťSms objekt v tomto prípade bude vyzerať takto:

Object(stdClass) public "messageList" => object(stdClass) public "BOGUS" => pole (veľkosť=3) 0 => object(stdClass) public "phone" => string "79871234567" (dĺžka=11) public " text" => reťazec "Testovacia správa 1" (dĺžka=37) public "dátum" => reťazec "2013-07-21T15:00:00.26" (dĺžka=22) public "typ" => reťazec "15" (dĺžka =2) 1 => objekt (štandardná trieda) verejný "telefón" => reťazec "79871234567" (dĺžka=11) verejný "text" => reťazec "Testovacia správa 2" (dĺžka=37) verejný "dátum" => reťazec " 2014-08-22T16:01:10" (dĺžka=19) public "type" => reťazec "16" (dĺžka=2) 2 => objekt (stdClass) verejný "telefón" => reťazec "79871234567" (dĺžka= 11) public "text" => string "Test message 3" (dĺžka=37) public "date" => string "2014-08-22T16:01:10" (dĺžka=19) public "type" => string " 17" (dĺžka = 2)
Ako sa hovorí - "Takmer"! Na túto (trochu smutnú) poznámku navrhujem potichu zaokrúhliť a vyvodiť pre seba nejaké závery.

8 Záver

Konečne sme sa sem dostali! Poďme sa rozhodnúť, čo môžete urobiť teraz:
  • môžete napísať potrebný súbor WSDL pre vašu webovú službu;
  • môžete bez problémov napísať vlastného klienta, ktorý dokáže komunikovať so serverom pomocou protokolu SOAP;
  • môžete si napísať svoj vlastný server, ktorý komunikuje s vonkajším svetom cez SOAP;
  • z vášho klienta môžete posielať polia rovnakého typu objektov na server (s určitými obmedzeniami).
Počas nášho malého výskumu sme tiež urobili niekoľko objavov:
  • natívna trieda SoapClient nevie správne serializovať dátové štruktúry rovnakého typu v XML;
  • pri serializácii poľa do XML sa vytvorí ďalší prvok s názvom Štruktúra;
  • pri serializácii objektu do XML sa vytvorí ďalší prvok s názvom PODVODNÝ;
  • PODVODNÝ menšie zlo ako Štruktúra vďaka tomu, že obálka je kompaktnejšia (do XML hlavičky obálky sa nepridávajú žiadne ďalšie menné priestory);
  • žiaľ, trieda SoapServer automaticky neoveruje údaje obálky pomocou našej schémy XML (možno to nerobia ani iné servery).

Ahoj!
Stalo sa, že nedávno som sa začal venovať vývoju webových služieb. Ale dnes téma nie je o mne, ale o tom, ako si môžeme napísať vlastnú XML webovú službu založenú na protokole SOAP 1.2.

Dúfam, že po prečítaní témy budete vedieť:

  • napísať vlastnú serverovú implementáciu webovej aplikácie;
  • napísať vlastnú klientsku implementáciu webovej aplikácie;
  • napíšte svoj vlastný popis webovej služby (WSDL);
  • odosielať polia rovnakého typu údajov na server klientom.

Ako asi tušíte, všetky kúzla budú vykonané pomocou PHP a vstavaných tried SoapClient a SoapServer. Ako králik budeme mať službu na posielanie sms správ.

1 Vyhlásenie o probléme

1.1 Hranice

Na začiatku navrhujem zaoberať sa výsledkom, ktorý dosiahneme na konci témy. Ako bolo oznámené vyššie, napíšeme službu na odosielanie sms správ, presnejšie povedané, budeme prijímať správy z rôznych zdrojov pomocou protokolu SOAP. Potom zvážime, v akej forme prídu na server. Proces zaraďovania správ do fronty pre ich ďalšieho poskytovateľa, žiaľ, z mnohých dôvodov presahuje rámec tohto príspevku.

1.2 Aké údaje sa zmenia?

Dobre, máme limity! Ďalším krokom, ktorý je potrebné urobiť, je rozhodnúť, aké údaje si budeme vymieňať medzi serverom a klientom. Na túto tému navrhujem, aby ste neboli dlho múdrejší a okamžite si odpovedali na hlavné otázky:

  • Aké minimálne údaje musia byť odoslané na server, aby bolo možné odoslať SMS správu účastníkovi?
  • Aké je minimálne množstvo údajov, ktoré musia byť odoslané zo servera na uspokojenie potrieb klienta?

Niečo mi hovorí, že na to je potrebné poslať nasledovné:

  • číslo mobilného telefónu a
  • SMS text.

V zásade stačia na odoslanie tieto dve charakteristiky, ale hneď sa mi zdá, že sms s blahoželaním k narodeninám vám príde o 3:00 ráno, alebo o 4! V tejto chvíli budem všetkým veľmi vďačná, že na mňa nezabudli! Preto pošleme aj na server a

  • dátum odoslania SMS správy.

Ďalšia vec, ktorú by som chcel poslať na server, je

  • Typ správy.

Tento parameter nie je povinný, ale môže sa nám veľmi hodiť, ak potrebujeme šéfovi rýchlo povedať, koľkých našich klientov sme „potešili“ našimi novinkami, a nakresliť o tom aj krásnu štatistiku.

A predsa som na niečo zabudol! Ak sa trochu viac zamyslíme, stojí za zmienku, že klient môže naraz poslať na server jednu SMS správu alebo ich určitý počet. Inými slovami, v jednom dátovom pakete môže byť od jednej do nekonečna správ.

Výsledkom je, že na odoslanie SMS správy potrebujeme nasledujúce údaje:

  • Mobilné číslo,
  • text sms,
  • čas odoslania SMS správy účastníkovi,
  • typ správy.

Odpovedali sme na prvú otázku, teraz je potrebné odpovedať na druhú otázku. A možno si dovolím trochu podvádzať. Zo servera teda budeme posielať iba boolovské dáta, ktorých hodnota má nasledujúci význam:

  • TRUE - paket úspešne dorazil na server, prešiel autentifikáciou a zaradil sa do frontu na odoslanie poskytovateľovi sms
  • FALSE – vo všetkých ostatných prípadoch

Týmto končíme popis problému! A nakoniec, poďme k tomu najzaujímavejšiemu - prídeme na to, aké zvláštne zviera je toto MYDLO!

2 Čo je SOAP?

Vo všeobecnosti som pôvodne neplánoval písať nič o tom, čo je SOAP, a chcel som sa obmedziť na odkazy na stránku w3.org s potrebnými špecifikáciami, ako aj na odkazy na Wikipédiu. Ale na samom konci som sa rozhodol napísať krátku referenciu o tomto protokole.

A svoj príbeh začnem tým, že tento protokol výmeny dát patrí do podmnožiny protokolov založených na takzvanej paradigme RPC (Remote Procedure Call), ktorej protipólom je REST (Representational State Transfer, reprezentatívny prenos stavu) . Viac si o tom môžete prečítať na Wikipédii, odkazy na články sú na samom konci témy. Z týchto článkov musíme pochopiť nasledovné: „Prístup RPC vám umožňuje využívať malé množstvo sieťových prostriedkov s veľkým počtom metód a zložitým protokolom. S prístupom REST je počet metód a zložitosť protokolu výrazne obmedzené, čo môže viesť k veľkému počtu individuálnych zdrojov.“ To znamená, že vo vzťahu k nám to znamená, že v prípade prístupu RPC bude mať stránka vždy jeden vstup (odkaz) na službu a akú procedúru zavolať na spracovanie prichádzajúcich údajov, ktoré odovzdávame spolu s údajmi, pričom s prístupom REST na našej stránke Stránka má veľa vstupov (odkazov), z ktorých každý prijíma a spracováva len určité údaje. Ak niekto čítajúci vie, ako ešte jednoduchšie vysvetliť rozdiel v týchto prístupoch, potom určite napíšte do komentárov!

Ďalšia vec, ktorú potrebujeme vedieť o SOAP je, že tento protokol používa rovnaké XML ako transport, čo je na jednej strane veľmi dobré, pretože. náš arzenál okamžite zahŕňa plnú silu zásobníka technológií založených na tomto značkovacom jazyku, konkrétne XML-Schema - jazyk na popis štruktúry XML dokumentu (vďaka Wikipédii!), ktorý umožňuje automatickú validáciu dát prichádzajúcich na server od klientov.

A tak teraz vieme, že SOAP je protokol používaný na implementáciu vzdialeného volania procedúr a používa XML ako transport! Ak si prečítate článok na Wikipédii, odtiaľ sa dozviete aj to, že ho možno použiť na akomkoľvek protokole aplikačnej vrstvy, a nie len spárovať s HTTP (žiaľ, v tejto téme budeme uvažovať iba o SOAP cez HTTP). A viete čo sa mi na tom všetkom páči najviac? Ak neexistujú žiadne dohady, potom vám poradím - MYDLO!… Aj tak neboli žiadne dohady?... Čítali ste určite článok na Wikipédii?... Vo všeobecnosti vás nebudem ďalej mučiť. Preto hneď prejdem k odpovedi: „SOAP (z angl. Simple Object Access Protocol – jednoduchý protokol prístup k objektom; podľa špecifikácie 1.2)". Vrchol tohto riadku je uvedený kurzívou! Neviem, aké závery ste z toho všetkého vyvodili, ale vidím nasledovné - keďže tento protokol v žiadnom prípade nemožno nazvať "jednoduchým" (a zjavne s tým súhlasí aj w3), tak od verzie 1.2 prestal byť vôbec dešifrovať! A stalo sa známe ako SOAP, len SOAP a bodka.

Dobre, ospravedlňujem sa, trochu na stranu. Ako som už písal, XML sa používa ako transport a pakety, ktoré bežia medzi klientom a serverom, sa nazývajú SOAP obálky. Ak vezmeme do úvahy všeobecnú štruktúru obálky, bude sa vám zdať veľmi známa, pretože pripomína označenie stránky HTML. Má hlavnú časť - Obálka, ktorá zahŕňa sekcie hlavička A Telo, alebo Chyba. IN Teloúdaje sa prenášajú a je to povinná časť obálky, pričom hlavička je voliteľná. IN hlavička môže byť prenášaná autorizácia alebo akékoľvek iné údaje, ktoré priamo nesúvisia so vstupnými údajmi postupov webovej služby. Pro Chyba nie je potrebné povedať nič zvláštne, okrem toho, že to prichádza klientovi zo servera v prípade akýchkoľvek chýb.

Tu sa môj prehľadový príbeh o protokole SOAP končí (na samotné obálky a ich štruktúru sa pozrieme podrobnejšie, keď sa náš klient a server konečne naučia, ako ich navzájom spúšťať) a začína nový – o spoločníčke SOAP volal WSDL(Jazyk popisu webových služieb). Áno, áno, toto je práve to, čo väčšinu z nás desí zo samotného pokusu prevziať a implementovať vlastné API na tento protokol. Výsledkom je, že zvyčajne znovu objavujeme naše koleso s JSON ako transport. Takže, čo je WSDL? WSDL je jazyk na popis webových služieb a prístup k nim, založený na jazyku XML (c) Wikipedia. Ak vám z tejto definície nie je jasný celý posvätný význam tejto technológie, potom sa to pokúsim opísať vlastnými slovami!

WSDL je navrhnutý tak, aby umožnil našim klientom normálnu komunikáciu so serverom. Na tento účel sú v súbore s príponou „*.wsdl“ popísané nasledujúce informácie:

  • Aké menné priestory boli použité,
  • Aké dátové schémy boli použité,
  • Aké typy správ očakáva webová služba od klientov,
  • Ktoré údaje patria ku ktorým postupom webovej služby,
  • Aké postupy obsahuje webová služba,
  • Ako má klient volať procedúry webovej služby,
  • Na akú adresu sa majú odosielať hovory klientov.

Ako vidíte, tento súbor je celá webová služba. Zadaním adresy súboru WSDL v klientovi budeme vedieť všetko o akejkoľvek webovej službe! V dôsledku toho nemusíme vedieť absolútne nič o tom, kde sa samotná webová služba nachádza. Stačí poznať umiestnenie jeho súboru WSDL! Čoskoro zistíme, že SOAP nie je také strašidelné, ako sa maľuje (c) ruské príslovie.

3 Úvod do schémy XML

Teraz vieme veľa o tom, čo je SOAP, čo je v ňom a máme prehľad o tom, aký technologický zásobník ho obklopuje. Keďže SOAP je v prvom rade metóda interakcie medzi klientom a serverom a ako transportný prostriedok sa používa značkovací jazyk XML, v tejto časti trochu pochopíme, ako prebieha automatická validácia údajov prostredníctvom schém XML.

Hlavnou úlohou schémy je popísať štruktúru dát, ktoré ideme spracovávať. Všetky údaje v schémach XML sú rozdelené do jednoduché(skalárny) a komplexný(štruktúry) typy. Jednoduché typy zahŕňajú tieto typy:

  • linka,
  • číslo,
  • boolovská hodnota,
  • dátum.

Niečo veľmi jednoduché, čo vo vnútri nemá žiadne rozšírenia. Ich antipódom sú zložité komplexné typy. Najjednoduchším príkladom zložitého typu, ktorý každému napadne, sú predmety. Napríklad kniha. Kniha obsahuje vlastnosti: autora, titul, cena, ISBN číslo atď. A tieto vlastnosti môžu byť jednoduché aj zložité. A úlohou XML schémy je opísať ju.

Navrhujem nezachádzať ďaleko a napísať schému XML pre našu SMS správu! Nižšie je uvedený xml popis sms správy:

71239876543 Testovacia správa 2013-07-20T12:00:00 12

Naša schéma komplexného typu bude vyzerať takto:

Tento záznam znie takto: máme premennú " správu» typ « správu"a existuje komplexný typ s názvom " správu", ktorý pozostáva zo sekvenčnej sady prvkov" telefón» typ reťazec, « text» typ reťazec, « dátum» typ Dátum Čas, « typu» typ desiatkový. Tieto typy sú jednoduché a sú už definované v definícii schémy. Gratulujem! Práve sme napísali našu prvú schému XML!

Myslím si, že význam prvkov " prvok"A" komplexnýTyp» Všetko sa vám viac-menej vyjasnilo, preto sa im už nebudeme venovať a prejdeme hneď na skladateľský prvok « postupnosť". Keď použijeme prvok compositor " postupnosť» informujeme, že prvky v ňom obsiahnuté musia byť vždy v poradí uvedenom v schéme a tiež všetky sú povinné. Ale nezúfajte! V schémach XML sú ďalšie dva prvky skladateľa: výber"A" všetky". Skladateľ výber" označuje, že by mal byť v ňom uvedený jeden z prvkov, a skladateľ " všetky» – ľubovoľná kombinácia uvedených prvkov.

Ako si pamätáte, v prvej časti témy sme sa zhodli, že balík je možné prenášať od jednej do nekonečna SMS správ. Preto navrhujem pochopiť, ako sú takéto údaje deklarované v schéme XML. Všeobecná štruktúra balíka môže vyzerať takto:

71239876543 Testovacia správa 1 2013-07-20T12:00:00 12 71239876543 Testovacia správa N 2013-07-20T12:00:00 12

Schéma pre takýto komplexný typ by vyzerala takto:

Prvý blok obsahuje známu deklaráciu komplexného typu „ správu". Ak si všimnete, potom v každom jednoduchom type obsiahnutom v " správu“, boli pridané nové kvalifikačné atribúty “ minOccurs"A" maxOccurs". Keďže z názvu nie je ťažké uhádnuť, prvý ( minOccurs) označuje, že daná sekvencia musí obsahovať aspoň jeden prvok typu " telefón», « text», « dátum"A" typu“, zatiaľ čo ďalšie ( maxOccurs) nám deklaruje, že v našej sekvencii je najviac jeden takýto prvok. Výsledkom je, že keď píšeme naše schémy pre akékoľvek údaje, máme najširší výber, ako ich nakonfigurovať!

Druhý blok schémy deklaruje prvok " messageList» typ « Zoznam správ". Je jasné, že" Zoznam správ' je komplexný typ, ktorý obsahuje aspoň jeden prvok ' správu“, ale maximálny počet takýchto prvkov nie je obmedzený!

4 Zápis vášho WSDL

Pamätáte si, že WSDL je naša webová služba? Dúfam, že si pamätáš! Keď ho napíšeme, bude na ňom plávať naša malá webová služba. Takže vám odporúčam nepodvádzať.

Vo všeobecnosti, aby nám všetko správne fungovalo, musíme klientovi preniesť WSDL súbor so správnym MIME typom. Aby ste to dosiahli, musíte zodpovedajúcim spôsobom nakonfigurovať váš webový server, konkrétne nastaviť typ MIME pre súbory s príponou *.wsdl na nasledujúci riadok:

Aplikácia/wsdl+xml

Ale v praxi som zvyčajne posielal hlavičku HTTP cez PHP “ text/xml»:

Hlavička("Typ obsahu: text/xml; charset=utf-8");

a všetko fungovalo skvele!

Chcem vás hneď varovať, naša jednoduchá webová služba bude mať dosť pôsobivý popis, takže sa nezľaknite, pretože. väčšina textu je povinná voda a po napísaní ho možno neustále kopírovať z jednej webovej služby do druhej!

Keďže WSDL je XML, hneď v prvom riadku o ňom musíte písať priamo. Koreňový prvok súboru musí mať vždy názov " definície»:

WSDL zvyčajne pozostáva zo 4-5 hlavných blokov. Hneď prvým blokom je definícia webovej služby, alebo inak povedané, vstupného bodu.

Tu je napísané, že máme službu s názvom - " Služba SMS". V zásade môžete všetky mená v súbore WSDL zmeniť na čokoľvek chcete, pretože nehrajú absolútne žiadnu rolu.

Potom vyhlasujeme, že v našej webovej službe " Služba SMS" existuje vstupný bod ("port"), ktorý sa nazýva " SmsServicePort". Práve do tohto vstupného bodu budú odoslané všetky požiadavky od klientov na server. A špecifikujeme v prvku " adresu» odkaz na súbor obsluhy, ktorý bude akceptovať požiadavky.

Potom, čo sme definovali webovú službu a určili pre ňu vstupný bod, musíme na ňu naviazať podporované procedúry:

K tomu vypíše, ktoré operácie a v akom tvare sa bude y volať. Tie. pre prístav SmsServicePort» väzba s názvom « SmsServiceBinding", ktorý má typ hovoru " rpc“ a HTTP sa používa ako prenosový protokol (transport). Preto sme tu naznačili, že uskutočníme volanie RPC cez HTTP. Potom popíšeme, ktoré postupy ( prevádzka) sú podporované vo webovej službe. Budeme podporovať iba jeden postup - " poslaťSms". Prostredníctvom tohto postupu budú naše úžasné správy odoslané na server! Po vyhlásení postupu je potrebné uviesť, v akej forme sa budú údaje prenášať. V tomto prípade je špecifikované, že sa použijú štandardné SOAP obálky.

Potom musíme postup spojiť so správami:

Aby sme to dosiahli, špecifikujeme, že naša väzba ("väzba") je typu " SmsServicePortType"a v živle" portType» s rovnakým názvom typu zadajte väzbu procedúr na správy. Prichádzajúca správa (z klienta na server) sa teda bude nazývať „ odoslaťSmsRequest"a odchádzajúce (zo servera ku klientovi)" sendSmsResponse". Rovnako ako všetky mená vo WSDL, názvy prichádzajúcich a odchádzajúcich správ sú ľubovoľné.

Teraz nám treba popísať samotné správy, t.j. prichádzajúce a odchádzajúce:

Za týmto účelom pridáme prvky " správu» s menami « odoslaťSmsRequest"A" sendSmsResponse“ resp. V nich uvádzame, že na vstup má prísť obálka, ktorej štruktúra zodpovedá typu údajov " Žiadosť". Potom sa zo servera vráti obálka obsahujúca typ údajov - " odpoveď».

Teraz musíme urobiť len málo - pridať popis týchto typov do nášho súboru WSDL! A ako si myslíte, že WSDL popisuje prichádzajúce a odchádzajúce dáta? Myslím, že ste už dávno všetkému rozumeli a povedali ste si, že pomocou XML schém! A budete mať úplnú pravdu!

Môžete nám zablahoželať! Náš prvý WSDL bol napísaný! A sme o krok bližšie k dosiahnutiu nášho cieľa.
Ďalej sa budeme zaoberať tým, čo nám PHP poskytuje na vývoj vlastných distribuovaných aplikácií.

5 Náš prvý SOAP server

Predtým som napísal, že na vytvorenie servera SOAP v PHP použijeme vstavanú triedu SoapServer. Aby všetky ďalšie akcie prebehli rovnako ako moje, budete musieť trochu upraviť svoje PHP. Aby sme boli ešte presnejší, musíte sa uistiť, že máte nainštalované rozšírenie „php-soap“. Ako ho umiestniť na váš webový server je najlepšie si prečítať na oficiálnej stránke PHP (pozri referencie).

Keď je všetko nainštalované a nakonfigurované, budeme musieť vytvoriť súbor “ smsservice.php» s nasledujúcim obsahom:

setClass("SoapSmsGateWay"); //Spustenie servera $server->handle();

To, čo je nad čiarou pri funkcii „ini_set“, dúfam netreba vysvetľovať. Pretože definuje, ktoré HTTP hlavičky budeme posielať zo servera klientovi a nakonfiguruje prostredie. V riadku „ini_set“ zakážeme ukladanie súboru WSDL do vyrovnávacej pamäte, aby sa naše zmeny v ňom okamžite prejavili na klientovi.

Teraz prichádzame na server! Ako vidíte, celý server SOAP má iba tri riadky! V prvom riadku vytvoríme novú inštanciu objektu SoapServer a jeho konštruktorovi odovzdáme adresu popisu našej webovej služby WSDL. Teraz vieme, že sa bude nachádzať v koreňovom adresári hostiteľa v súbore s výrečným názvom " smsservice.wsdl.php". V druhom riadku hovoríme SOAP serveru, ktorú triedu má stiahnuť, aby spracoval obálku prijatú od klienta a vrátil obálku s odpoveďou. Ako ste možno uhádli, práve v tejto triede bude opísaná naša jediná metóda. poslaťSms. V treťom riadku spustíme server! Všetko, náš server je pripravený! S čím nám všetkým blahoželám!

Teraz musíme vytvoriť súbor WSDL. Ak to chcete urobiť, môžete buď jednoducho skopírovať jeho obsah z predchádzajúcej časti, alebo si ho trochu „vymodelovať“:

"; ?> /" 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" />

V tejto fáze by nám výsledný server mal úplne vyhovovať, pretože. môžeme zaznamenať prichádzajúce obálky a potom pokojne analyzovať prichádzajúce údaje. Aby sme mohli prijímať čokoľvek na server, potrebujeme klienta. Tak poďme na to!

6 SOAP klient na ceste

V prvom rade si musíme vytvoriť súbor, do ktorého budeme klienta zapisovať. Ako obvykle ho vytvoríme v koreňovom adresári hostiteľa a nazveme ho „ klient.php“ a vnútri píšeme nasledovné:

messageList = new MessageList(); $req->messageList->message = new Message(); $req->messageList->message->phone = "79871234567"; $req->messageList->message->text = "Testovacia správa 1"; $req->messageList->message->date = "2013-07-21T15:00:00.26"; $req->messageList->message->type = 15; $client = new SoapClient("http://($_SERVER["HTTP_HOST"])/smsservice.wsdl.php", array("soap_version" => SOAP_1_2)); var_dump($client->sendSms($req));

Popíšme naše predmety. Keď sme písali WSDL, boli v ňom opísané tri entity pre obálku vstupujúcu na server: Žiadosť, Zoznam správ A správu. V súlade s tým triedy Žiadosť, Zoznam správ A správu sú odrazom týchto entít v našom PHP skripte.

Potom, čo sme definovali objekty, musíme vytvoriť objekt ( $req), ktorý bude odoslaný na server. Potom sú tu pre nás dve najcennejšie línie! Náš SOAP klient! Verte tomu alebo nie, ale to stačí na to, aby náš server začal sypať správy od klienta, ako aj na to, aby ich náš server úspešne prijímal a spracovával! V prvom z nich vytvoríme inštanciu triedy SoapClient a jeho konštruktorovi odovzdáme adresu umiestnenia súboru WSDL a v parametroch explicitne uvedieme, že budeme pracovať s protokolom SOAP verzie 1.2. Na ďalšom riadku zavoláme metódu poslaťSms objekt $klient a okamžite zobraziť výsledok v prehliadači.
Poďme to spustiť a uvidíme, čo sme nakoniec dostali!

Zo servera som dostal nasledujúci objekt:

Object(stdClass) public "status" => boolean true

A to je úžasné, pretože. teraz s istotou vieme, že náš server funguje a nielen funguje, ale môže klientovi vrátiť niektoré hodnoty!

Teraz sa pozrime na denník, ktorý obozretne vedieme na strane servera! V jeho prvej časti vidíme nespracované údaje, ktoré vstúpili na server:

79871234567 Testovacia správa 1 2013-07-21T15:00:00.26 15

Toto je obálka. Teraz viete, ako to vyzerá! Je však nepravdepodobné, že by sme mali záujem ho neustále obdivovať, takže poďme deserializovať objekt zo súboru denníka a uvidíme, či je s nami všetko v poriadku:

Object(stdClass) public "messageList" => object(stdClass) public "message" => object(stdClass) public "phone" => string "79871234567" (dĺžka=11) public "text" => string "Testovacia správa 1 " (dĺžka=37) public "date" => reťazec "2013-07-21T15:00:00.26" (dĺžka=22) public "type" => reťazec "15" (dĺžka=2)

Ako vidíte, objekt bol deserializovaný správne, k čomu by som nám všetkým chcel zablahoželať! Ďalej nás čaká niečo zaujímavejšie! Klientom totiž pošleme na server nie jednu sms-správu, ale celý balík (presnejšie tri celé)!

7 Odosielanie zložitých objektov

Zamyslime sa nad tým, ako môžeme poslať na server veľa správ v jednom balíku? Pravdepodobne najjednoduchším spôsobom by bolo usporiadať pole v prvku messageList! Poďme na to:

// vytvorenie objektu na odoslanie na server $req = new Request(); $req->messageList = new MessageList(); $msg1 = nová správa (); $msg1->telefón = "79871234567"; $msg1->text = "Testovacia správa 1"; $msg1->date = "2013-07-21T15:00:00.26"; $msg1->typ = 15; $msg2 = nová správa (); $msg2->telefón = "79871234567"; $msg2->text = "Testovacia správa 2"; $msg2->date = "2014-08-22T16:01:10"; $msg2->typ = 16; $msg3 = nová správa (); $msg3->telefón = "79871234567"; $msg3->text = "Testovacia správa 3"; $msg3->date = "2014-08-22T16:01:10"; $msg3->typ = 17; $req->messageList->message = $msg1; $req->messageList->message = $msg2; $req->messageList->message = $msg3;

Naše protokoly ukazujú, že nasledujúci paket prišiel od klienta:

79871234567 Testovacia správa 1 2013-07-21T15:00:00.26 15 79871234567 Testovacia správa 2 2014-08-22T16:01:10 16 79871234567 Testovacia správa 3 2014-08-22T16:01:10 17

Aký nezmysel, hovoríš? A v istom zmysle budete mať pravdu, pretože. tak ako sme sa dozvedeli, že ktorý objekt odišiel z klienta, prišiel na náš server vo forme obálky v presne tej istej forme. Pravda, sms správy neboli serializované v XML tak, ako sme potrebovali – museli byť zabalené do prvkov správu, nie v Štruktúra. Teraz sa pozrime, v akej forme takýto objekt prichádza do metódy poslaťSms:

Object(stdClass) public "messageList" => object(stdClass) public "message" => object(stdClass) public "Struct" => pole (veľkosť=3) 0 => objekt (stdClass) public "telefón" => reťazec "79871234567" (dĺžka=11) public "text" => reťazec "Testovacia správa 1" (dĺžka=37) public "dátum" => reťazec "2013-07-21T15:00:00.26" (dĺžka=22) public " typ" => reťazec "15" (dĺžka=2) 1 => objekt (štandardná trieda) verejný "telefón" => reťazec "79871234567" (dĺžka=11) verejný "text" => reťazec "Testovacia správa 2" (dĺžka= 37) public "date" => string "2014-08-22T16:01:10" (dĺžka=19) public "type" => string "16" (dĺžka=2) 2 => objekt (stdClass) public "telefón " => reťazec "79871234567" (dĺžka=11) public "text" => reťazec "Testovacia správa 3" (dĺžka=37) public "dátum" => reťazec "2014-08-22T16:01:10" (dĺžka= 19) verejný "typ" => reťazec "17" (dĺžka = 2)

Čo nám toto poznanie dáva? Jedine, že cesta, ktorú sme zvolili, nie je správna a nedostali sme odpoveď na otázku - „Ako môžeme získať správnu dátovú štruktúru na serveri?“. Ale navrhujem, aby sme nezúfali a pokúsili sa obsadiť naše pole typu objekt:

$req->messageList->message = (objekt)$req->messageList->message;

V tomto prípade dostaneme ďalšiu obálku:

79871234567 Testovacia správa 1 2013-07-21T15:00:00.26 15 79871234567 Testovacia správa 2 2014-08-22T16:01:10 16 79871234567 Testovacia správa 3 2014-08-22T16:01:10 17

Vstúpil do metódy poslaťSms objekt má nasledujúcu štruktúru:

Object(stdClass) public "messageList" => object(stdClass) public "message" => object(stdClass) public "BOGUS" => pole (veľkosť=3) 0 => objekt (stdClass) public "phone" => reťazec "79871234567" (dĺžka=11) public "text" => reťazec "Testovacia správa 1" (dĺžka=37) public "dátum" => reťazec "2013-07-21T15:00:00.26" (dĺžka=22) public " typ" => reťazec "15" (dĺžka=2) 1 => objekt (štandardná trieda) verejný "telefón" => reťazec "79871234567" (dĺžka=11) verejný "text" => reťazec "Testovacia správa 2" (dĺžka= 37) public "date" => string "2014-08-22T16:01:10" (dĺžka=19) public "type" => string "16" (dĺžka=2) 2 => objekt (stdClass) public "telefón " => reťazec "79871234567" (dĺžka=11) public "text" => reťazec "Testovacia správa 3" (dĺžka=37) public "dátum" => reťazec "2014-08-22T16:01:10" (dĺžka= 19) verejný "typ" => reťazec "17" (dĺžka = 2)

Pokiaľ ide o mňa, potom „zo zmeny miesta pojmov sa súčet nemení“ (c). Čo PODVODNÝ, čo Štruktúra Ešte sme nedosiahli náš cieľ! A aby sme to dosiahli, musíme sa postarať o to, aby namiesto týchto nezrozumiteľných mien náš rodák správu. Ako to však dosiahnuť, autor zatiaľ nevie. Preto jediné, čo môžeme urobiť, je zbaviť sa nadbytočnej nádoby. Inými slovami, teraz sa uistíme, že namiesto toho správu sa stal PODVODNÝ! Ak to chcete urobiť, zmeňte objekt takto:

// vytvorenie objektu na odoslanie na server $req = new Request(); $msg1 = nová správa (); $msg1->telefón = "79871234567"; $msg1->text = "Testovacia správa 1"; $msg1->date = "2013-07-21T15:00:00.26"; $msg1->typ = 15; $msg2 = nová správa (); $msg2->telefón = "79871234567"; $msg2->text = "Testovacia správa 2"; $msg2->date = "2014-08-22T16:01:10"; $msg2->typ = 16; $msg3 = nová správa (); $msg3->telefón = "79871234567"; $msg3->text = "Testovacia správa 3"; $msg3->date = "2014-08-22T16:01:10"; $msg3->typ = 17; $req->messageList = $msg1; $req->messageList = $msg2; $req->messageList = $msg3; $req->messageList = (objekt)$req->messageList;

Čo ak budeme mať šťastie a zo schémy vypadne správny názov? Ak to chcete urobiť, pozrime sa na doručenú obálku:

79871234567 Testovacia správa 1 2013-07-21T15:00:00.26 15 79871234567 Testovacia správa 2 2014-08-22T16:01:10 16 79871234567 Testovacia správa 3 2014-08-22T16:01:10 17

Áno, zázrak sa nestal! PODVODNÝ- nevyhráme! Vošiel poslaťSms objekt v tomto prípade bude vyzerať takto:

Object(stdClass) public "messageList" => object(stdClass) public "BOGUS" => pole (veľkosť=3) 0 => object(stdClass) public "phone" => string "79871234567" (dĺžka=11) public " text" => reťazec "Testovacia správa 1" (dĺžka=37) public "dátum" => reťazec "2013-07-21T15:00:00.26" (dĺžka=22) public "typ" => reťazec "15" (dĺžka =2) 1 => objekt (štandardná trieda) verejný "telefón" => reťazec "79871234567" (dĺžka=11) verejný "text" => reťazec "Testovacia správa 2" (dĺžka=37) verejný "dátum" => reťazec " 2014-08-22T16:01:10" (dĺžka=19) public "type" => reťazec "16" (dĺžka=2) 2 => objekt (stdClass) verejný "telefón" => reťazec "79871234567" (dĺžka= 11) public "text" => string "Test message 3" (dĺžka=37) public "date" => string "2014-08-22T16:01:10" (dĺžka=19) public "type" => string " 17" (dĺžka = 2)

Ako sa hovorí - "Takmer"! Na túto (trochu smutnú) poznámku navrhujem potichu zaokrúhliť a vyvodiť pre seba nejaké závery.

8 Záver

Konečne sme sa sem dostali! Poďme sa rozhodnúť, čo môžete urobiť teraz:

  • môžete napísať potrebný súbor WSDL pre vašu webovú službu;
  • môžete bez problémov napísať vlastného klienta, ktorý dokáže komunikovať so serverom pomocou protokolu SOAP;
  • môžete si napísať svoj vlastný server, ktorý komunikuje s vonkajším svetom cez SOAP;
  • z vášho klienta môžete posielať polia rovnakého typu objektov na server (s určitými obmedzeniami).

Počas nášho malého výskumu sme tiež urobili niekoľko objavov:

  • natívna trieda SoapClient nevie správne serializovať dátové štruktúry rovnakého typu v XML;
  • pri serializácii poľa do XML sa vytvorí ďalší prvok s názvom Štruktúra;
  • pri serializácii objektu do XML sa vytvorí ďalší prvok s názvom PODVODNÝ;
  • PODVODNÝ menšie zlo ako Štruktúra vďaka tomu, že obálka je kompaktnejšia (do XML hlavičky obálky sa nepridávajú žiadne ďalšie menné priestory);
  • žiaľ, trieda SoapServer automaticky neoveruje údaje obálky pomocou našej schémy XML (možno to nerobia ani iné servery).

Ak chcete vytvoriť webovú službu SOAP v PHP, musíte najprv nainštalovať a nakonfigurovať PHP, ako aj lokálny HTTP server. V tomto projekte bol použitý balík XAMP, ktorý umožňuje rýchlu inštaláciu HTTP servera Apache a PHP.

Samostatne musíte vykonať zmeny v konfiguračných súboroch Apache a PHP.

V konfiguračnom súbore HTTP servera Apache httpd.conf musíte nájsť nasledujúci útržok kódu:

Ak chcete spúšťať skripty PHP na lokálnom serveri, musíte ich uložiť do koreňového adresára servera Apache, štandardne do priečinka htdocs v koreňovom priečinku Apache.

Ak chcete zmeniť koreňový adresár lokality, musíte vykonať zmeny v súbore httpd.conf v riadku nižšie:

Ak chcete povoliť podporu PHP, musíte do súboru httpd.conf pridať nasledujúce riadky:


Na spustenie servera Apache HTTP môžete použiť príkazy konzoly alebo ovládací panel XAMMP, ktorý vám umožňuje spravovať stav Apache a tiež ho konfigurovať.

Pohľad na tento nástroj je znázornený na obrázku 2.

Obrázok 2. - Nástroj XAMMP Control Panel:


Ak chcete vytvoriť webovú službu SOAP, musíte napísať dokumenty PHP, ktoré implementujú stranu klienta a servera aplikácie, ako aj stránku WSDL na popis webovej služby.

Vytvorme webovú službu, ktorá poskytuje jedinú webovú službu, ktorá vráti klientovi výsledok vykonania aritmetickej operácie na dvoch číslach. Vstupnými prvkami sú dve čísla zadané klientom, ako aj znaková premenná, ktorá definuje aritmetickú operáciu.

Na strane klienta sú implementované dva PHP dokumenty. V súbore form.php pomocou prvku

je popísaná forma, v ktorej používateľ zadáva údaje. Vlastnosti formulára majú metódu POST, ktorá sa používa na extrahovanie informácií z formulára a ich odovzdanie do súboru PHP. V tomto prípade sa údaje zadané používateľom prenesú na afqk code.php. Prvky popis textových polí na zadávanie údajov a tlačidlo, po stlačení sa údaje prenesú do súboru code.php.

Útržok kódu, ktorý implementuje súbor form.php, je zobrazený nižšie:


V súbore code.php sa vytvorí inštancia triedy klienta a údaje zadané používateľom sú prijaté a odoslané v správe SOAP na server. Fragment kódu, ktorý implementuje vytvorenie inštancie triedy klienta, je zobrazený nižšie:

Tento úryvok vytvorí $client inštanciu triedy SoapClient, ktorá vykoná správu SOAP podľa konfiguračného súboru cacl.wsdl.

V súbore code.php sú premenným $a, $b, $action priradené aj hodnoty členov asociatívneho poľa $_POST, v ktorom sú uložené dáta prijaté z form.php.

Fragment kódu, ktorý implementuje tieto operácie, je zobrazený nižšie:

Kde getCalcEntry() je operácia opísaná v súbore WSDL.

V tejto webovej službe zohráva úlohu serverovej časti súbor calc-server.php.

V tomto súbore je deklarovaná a volaná funkcia getCalcEntry.

Táto funkcia skontroluje hodnotu premennej $action a v súlade s ňou vykoná operáciu s premennými $a a $b, pričom výsledok zapíše do premennej $c. V tomto fragmente metóda addFunction() poskytuje vzdialenému klientovi prístup k funkcii getCalcentry. Metóda handle() spracuje požiadavku SOAP, zavolá potrebné funkcie a odošle odpoveď SOAP. Útržok kódu, ktorý implementuje túto funkciu, je zobrazený nižšie:


Popisný súbor calc.wsdl hrá dôležitú úlohu pri prevádzke tejto webovej služby SOAP.

Tento súbor definuje základné parametre správ SOAP. Útržok kódu zodpovedný za implementáciu je uvedený nižšie:


V tomto fragmente prvky getCalcRequest a getCalcResponse sú požiadavka SOAP a odpoveď SOAP. V vnorené v Prvky definujú názvy odovzdávaných premenných a ich typy. Treba si uvedomiť, že je možné odovzdať reťazce (typ string), ktoré budú implicitne prevedené na čísla, vďaka dynamickému písaniu v PHP. Dôležitým prvkom súboru WSDL je aj popis rozhrania webovej služby, ktorý prvok vykonáva

V tomto fragmente prvok popisuje špecifickú službu getCalcEntry pozostávajúcu z dvoch akcií:

  • - prvou akciou getCalcRequest je odoslanie správy;
  • - druhou akciou getCalcResponse je prijatie odpovede.

Pre úspešnú prevádzku webovej služby na lokálnom serveri musíte:

  • 1) Vytvorte samostatný adresár pre distribuovanú aplikáciu v koreňovom adresári servera Apache. Vložte do nej súbory form.php, code.php, calc-server.php a calc.wsdl;
  • 2) Spustite Apache pomocou konzoly alebo ovládacieho panela XAMMP;
  • 3) Do panela s adresou prehliadača zadajte adresu klienta webovej služby;
  • 4) Zadajte údaje do textových polí a kliknite na tlačidlo Vypočítať;
  • 5) V dôsledku toho sa na karte prehliadača otvorí stránka PHP so zobrazeným výsledkom výpočtov.

Obrázok 3. - Výsledok upravenej webovej služby:


Aby sme podrobnejšie zvážili prácu SOAP, upravili sme kód súboru code.php tak, aby sa v prehliadači zobrazovali zoznamy najnovších správ SOAP - žiadosť a odpoveď - spolu s výsledkom kalkulácia.

Fragment kódu, ktorý vykonáva tieto funkcie, je zobrazený nižšie:


programovanie webového servera

Tento fragment obsahuje štandardné metódy systémovej triedy:

Vracia sa text správ SOAP. Pri zohľadnení takto prijatých správ SOAP je jasne viditeľná výmena dát medzi klientom a serverom. V prípade dopytu sú údaje obsiahnuté v úryvku kódu nižšie. Tento fragment obsahuje telo SOAP obálky, v ktorej je prvok vnorený A, ktoré popisuje webovú službu.


Obsahuje vnorené prvky, ktoré uchovávajú hodnoty odovzdávaných premenných a ich dátové typy. Hodnoty čísel 5 a 3 sa odovzdajú serveru, ako aj symbol operácie odčítania, ktorá sa na nich vykoná.

Podobný útržok kódu pre odpoveď je uvedený nižšie:


V tomto fragmente kódu môžete vidieť hodnotu výsledku odčítania odovzdaného klientovi - 2.

Potrebujem sa pripojiť k jednej webovej službe a toto je všetko, čo mám:

    Príklad volania:

    užívateľské meno heslo

    Viem, že táto funkcia vracia reťazec;

Toto som doteraz urobil:

    Vytvoril odkaz na službu pridaním iba adresy WSDL špecifikovanej v bode 1.

    Vytvorili ste inštanciu webovej služby a zavolali funkciu so všetkými požadovanými parametrami, ale bez používateľa a hesla pre hlavičku.

Ako môžem pokračovať? Vopred ďakujem.

1 odpoveď

Toto môže byť dobré miesto, kde začať, ak potrebujete pridať svoje poverenia; Myslím, že možno budeš musieť, keďže si ich nejako získal. Časť, do ktorej pridávate svoje poverenia, je uvedená nižšie:

UsernameToken userToken = new UsernameToken(používateľské meno, heslo, PasswordOption.SendHashed); Služba1 službaProxy = nová služba1(); SoapContext requestContext = serviceProxy.RequestSoapContext; requestContext.Security.Tokens.Add(userToken);

  1. Pridajte svoje poverenia ich vložením do konkrétneho tokenu – ktorého typ patrí do priestoru názvov Microsoft.Web.Services2.Security.Tokens
  2. Vytvorte proxy pre svoju službu (v príklade vyššie serviceProxy)
  3. Získajte prístup k hlavičke svojej požiadavky prostredníctvom služby RequestSoapContext
  4. Pridajte token k žiadosti

Tiež si myslím, že by ste mohli preskočiť časť adresy „?wsdl“, pretože odkazuje na špecifikáciu webovej služby. Keď to urobíte, môžete skúsiť zavolať funkciu a zistiť, ako to celé dopadne: ak by funkcia mala niečo vrátiť, skontrolujte, čo ste očakávali.