Soapclient php primjeri. Svi koraci potrebni za povezivanje na web uslugu (WSDL primjer i SOAP primjer)

U ovom primjeru vidjet ćemo primjer SOAP klijenta koji komunicira sa serverom. SOAP je jedna od mnogih definicija protokola web servisa. Web usluga je tehnologija koja koristi protokol (SOAP u ovom primjeru) za razmjenu podataka između aplikacija preko mreže.

Ako razvijamo klijenta za korištenje web usluge, moramo pogledati protokol koji usluga koristi. Ovaj primjer služi za pregled resursa koje pruža PHP za razvoj klijenta za web servis koji implementira SOAP protokol.

Za ovaj primjer koristit ćemo:

  • Ubuntu (14.04) kao operativni sistem.
  • Apache HTTP server (2.4.7).
  • PHP (5.5.9).

1. Priprema okoline

1.1. Instalacija

U nastavku su prikazane komande za instaliranje Apache-a i PHP-a:

Sudo apt-get update sudo apt-get install apache2 php5 libapache2-mod-php5 sudo service apache2 restart

1.2. PHP konfiguracija

Čak i ako nije neophodno, preporučuje se da onemogućite SOAP WSDL keš za razvojna okruženja. U /etc/php5/apache2/php.ini datoteci postavite soap.wsdl_cache_enabled direktivu na 0:

php.ini

Soap.wsdl_cache_enabled=0

Ne zaboravite ponovo pokrenuti Apache nakon bilo kakve promjene.

Bilješka: ako želite da koristite Windows, instalacija XAMPP-a je najbrži i najlakši način da instalirate kompletan web server koji ispunjava preduvjete.

2. Šta je SOAP?

SOAP (Simple Object Access Protocol) je standardni protokol koji definira kako dva različita objekta u različitim procesima mogu međusobno komunicirati, putem razmjene podataka u XML formatu. Jedan je od najširih protokola koji se koriste u web servisima.

Drugim riječima, ovaj protokol omogućava pozivanje metoda objekata koji su definirani u udaljenim mašinama.

3. PHP primjer SOAP klijenata

Server koji nudi svoje SOAP usluge može ih definirati na dva različita načina:

  • Sa WSDL (jezikom definicije web usluga)
  • Bez WSDL-a

Sa stanovišta klijenta, postoji vrlo malo razlika, ali hajde da vidimo kako dalje za svaku od njih.

Razmotrit ćemo sljedeći scenario, koji je prilično tipičan: web servis koji ubacuje i čita iz baze podataka (simuliran s običnim tekstualnim fajlom), za koji ćemo razviti klijenta.

Je li odgovornost servera koji nudi uslugu da obavijesti o korištenom protokolu, kao i definicije dostupnih metoda, kako bi klijenti znali kako se nositi s uslugom.

Čak i ako je ovaj tutorijal o samom klijentu, videćemo i stranu servera, kako bismo testirali da li klijent zaista radi.

3.1. Radna struktura direktorija

Za ovaj primjer koristit ćemo sljedeću strukturu:

Php_soapclient_example/ ├── simple_soap_client_class.php ├── simple_soap_server_class.php ├── handle_soap_request.php ├── no_wsdl │ └php ─ server_endpoint.php ├── simple_soap_server_class.php ├── no_wsdl │ └php├─ ─ server_endpoint.php ├── endpoint server.php ├── _definition.wsdl

Gdje će korijenski direktorij, php_soapclient_example , biti u korijenskom direktoriju web servera, koji je po defaultu /var/www/html/.

Ukratko objasnio svaki fajl:

  • simple_soap_client_class.php je klasa definirana za SOAP klijentske metode.
  • simple_soap_server_class.php je klasa definirana za metode SOAP servera.
  • handle_soap_request.php je za instanciranje i korištenje SimpleSoapClient klase definirane u simple_soap_client_class.php.
  • U direktorijumima wsdl i no_wsdl nudi se usluga definisana u simple_soap_server_class.php, na način na koji odgovara svakom od modova. Za njih nećemo ulaziti u detalje, jer to nije svrha ovog primjera. Jedino što moramo znati je da u jednom od direktorija postoji usluga koja se nudi u WSDL modu, a da u drugom, bez WSDL moda; oni su dva nezavisna web servisa koji koriste kod definisan u simple_soap_server_class.php.

Bilješka: WSDL modu je potrebna .wsdl datoteka, gdje je definirana web usluga. Nećemo ga vidjeti u ovom primjeru, jer cilj nije da vidimo kako napraviti datoteku WSDL definicije, ali je također dostupna za preuzimanje u posljednjem dijelu primjera.

3.2. Server

Kao što je rečeno, naš server će čitati i pisati podatke u tekstualnu datoteku. da vidimo:

simple_soap_server_class.php

", FILE_APPEND); if ($writtenBytes) ( $response = "$writtenBytes bajtovi su umetnuti."; ) else ( $response = "Greška umetnutih podataka."; ) vrati $response; ) /** * Čita podatke. Poziva se daljinski od SOAP klijenta * * @return Data of file */ public function readData() ( $contents = file_get_contents(self::FILENAME); return $contents; ) )

Tako jednostavno, o čitanju i pisanju u tekstualnu datoteku.

Obratite pažnju na funkcije koje ovaj server implementira, u redovima 16 i 33. Ove funkcije će biti one koje poziva klijent.

3.3. Klijent

Kao što smo rekli gore, u zavisnosti od moda (WSDL ili ne WSDL), klijent mora da rukuje vezom na drugačiji način, ali, kada se jednom uspostavi, procedura je ista. Dakle, hajde da kodiramo klasu koja radi za oba načina, rukovodeći instancijom klase SoapClient u skladu s načinom rada:

simple_soap_client_class.php

initializeClient($soapMode, $serverLocation); ) /** * Instancira SoapClient, ovisno o specificiranom načinu rada. * * Za WSDL, samo se mora instancirati sa lokacijom usluge, koja zapravo mora biti * .wsdl lokacija. * * Za ne-WSDL, prvi parametar konstruktora mora biti null; a drugi, niz koji specificira * i lokaciju i URI (koji može biti isti, važan parametar je lokacija). */ zaštićena funkcija initializeClient($soapMode, $serverLocation) ( switch ($soapMode) ( case self::MODE_WSDL: $this->client = novi SoapClient($serverLocation); break; case self::MODE_NO_WSDL: $options = array ("location" => $serverLocation, "uri" => $this->client = new SoapClient(NULL, $options break default: throw new Exception("Greška: nevažeći SOAP način."); ) ) /** * Ubacuje podatke na daljinu u SOAP servis. * * @param $data Podaci za daljinsko umetanje. * @return Odgovor sa udaljene usluge. */ javna funkcija insertData($data) ( $response = $this->client->insertData($data); return $response; ) /** * Čita podatke iz SOAP usluge. * * @return Podaci primljeni od udaljene usluge. */ javna funkcija readData() (vrati $this->client->readData(); ) )

Redovi 35 i 45 instanciraju klasu SoapClient, ovisno o primljenom $modeu. Ovako radi za svaki mod:

  • Za WSDL način rada, moramo samo proslediti lokaciju servera konstruktoru. Za ovaj način rada, lokacija mora biti datoteka WSDL definicije (.wsdl), a ne PHP datoteka.
  • Za način koji nije WSDL, prvi parametar mora biti null (jer ne pristupamo WSDL definiciji). Dakle, lokacija mora biti definirana na drugačiji način, pružajući niz sa elementima "location" i "uri", sa lokacijom servera kao vrijednosti. U ovom slučaju, lokacija mora biti PHP datoteka koja rukuje web servisom.

Nakon instanciranja, komunikacija sa uslugom je prilično jednostavna. Moramo samo da pozovemo metode koje smo videli definisane u SimpleSoapServer klasi, u simple_soap_client_class.php , kroz instancu klase SoapClient. Kao što smo već rekli, pozivamo metode koje su definisane na drugom mestu. Ono što PHP SoapClient radi je da nam pruži one metode koje definiše web servis, a kada ih pozovemo, on će ih izvršiti na serveru preko SOAP protokola koji je već implementirao, bez potrebe da brine o tome kako funkcionira . Čini se magično, zar ne?

Ako ne vjerujete, hajde da vidimo skriptu za korištenje ovog klijenta.

3.4. Korištenje klijenta

Sljedeća skripta nam omogućava da koristimo klijenta za komunikaciju sa uslugom, putem GET parametara. Ovo su dostupni parametri:

  • "mode" , da odredite način rada (WSDL ili ne WSDL).
  • "action" , da navedete akciju koju treba izvršiti. Dostupne vrijednosti su "insert" i "read" .
  • "value" , ​​za navođenje vrijednosti za umetanje, potrebno samo kada je akcija "insert".

handle_soap_request.php

getMessage()); ) vrati $soapClient; ) // Tok počinje ovdje. checkGETParametersOrDie(["mode", "action"]); $mode = $_GET["mode"]; $action = $_GET["akcija"]; $soapClient = instantiateSoapClient($mode); switch($action) ( case ACTION_INSERT: checkGETParametersOrDie(); $value = $_GET; pokušaj ( $response = $soapClient->insertData($value); echo "Odgovor sa SOAP usluge: $response
"; ) catch (Exception $exception) ( die("Greška pri umetanju u SOAP servis: " . $exception->getMessage()); ) break; case ACTION_READ: pokušaj ( $data = $soapClient->readData(); echo "Primljeni podaci sa SOAP servisa:
"; echo $data; ) catch (Exception $exception) ( die("Greška čitanja sa SOAP usluge: " . $exception->getMessage()); ) break; default: die("Navedena je nevažeća "akcija".") ;

Ako u pretraživač unesemo http://127.0.0.1/php_soapclient_example/handle_soap_request.php?mode=no_wsdl&action=insert&value=testing_no_wsdl , usluga će kreirati datoteku no_wsdl/data.txt (ako već ne postoji), upisujući datu vrijednost "testing_no_wsdl" , and the following will be printed:!}

Odgovor SOAP usluge: 19 bajtova je umetnuto.

(Dodatna 4 bajta odgovaraju dodatnom
znakovi umetnuti u datoteku).

Servis nudi način čitanja svih podataka, tako da, ako u pretraživač unesemo http://127.0.0.1/php_soapclient_example/handle_soap_request.php?mode=no_wsdl&action=read , ispisaće se sljedeće:

Primljeni podaci sa SOAP servisa:
testing_no_wsdl

Možemo ga provjeriti i za WSDL način rada, postavljajući mode=wsdl u parametrima.

4. Razmatranja

Kao što je rečeno u odeljku 3, kada razvijamo klijenta web servisa (bez obzira da li je SOAP, REST, itd.), provajder usluga mora da obezbedi i dokumentaciju o dostupnim metodama; moramo znati definiciju ovih: koji se parametri očekuju, af ako nešto vraća. Zbog toga, najčešći način za razvoj SOAP web servisa je korištenje WSDL datoteka, za pružanje dokumentacije o dostupnim metodama. U svakom slučaju, SoapClient ima metodu za dobivanje dostupnih metoda, za potrebe otklanjanja grešaka, pod nazivom __getFunctions() . Dakle, mogli smo vidjeti ponuđene metode od strane servisa sa sljedećim:

Var_dump($soapClient->__getFunctions())

Pod pretpostavkom da je $soapClient pravilno instanciran.

Također imajte na umu da će, ako usluga ne nudi šifriranu vezu, komunikacija između klijenta i servera biti u obliku običnog teksta. Dakle, ako moramo razviti klijenta koji se mora baviti razumnim informacijama, trebali bismo osigurati da se komunikacija sa serverom može smatrati sigurnom.

5. Sažetak

Vidjeli smo kako razviti klijenta za SOAP web servis koristeći PHP-ovu klasu SoapClient. Server može ponuditi uslugu koristeći WSDL ili ne, nešto što treba uzeti u obzir kada instanciramo klasu SoapClient. Zatim, da bismo koristili metode koje pruža usluga, samo moramo pozvati te metode u SoapClient instanci, jer su bile naše.

(9)

Navikao sam da pišem PHP kod, ali ne koristim često objektno orijentisano kodiranje. Sada moram da komuniciram sa SOAP-om (kao klijent) i ne mogu da ispravim sintaksu. Imam WSDL fajl koji mi omogućava da pravilno konfigurišem novu vezu koristeći klasu SoapClient. Međutim, ne mogu obaviti ispravan poziv i vratiti podatke. Moram poslati sljedeće (pojednostavljene) podatke:

  • Kontakt ID
  • Osoba za kontakt
  • opći opis
  • Količina

Postoje dvije funkcije u WSDL dokumentu, ali meni treba samo jedna ("FirstFunction" ispod). Evo skripte koju pokrećem da dobijem informacije o dostupnim funkcijama i tipovima:

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

A evo i rezultata koje generiše:

Array( => "FirstFunction Function1(FirstFunction $parameters)", => "Funkcija druge funkcije2(SecondFunction $parameters)",); array( => struct Contact ( id id; ime ime; ) => string "string description" => string "int amount" )

Recimo da želim pozvati FirstFunction s podacima:

  • Kontakt ID: 100
  • Kontakt osoba: John
  • Opšti opis: Barel of Oil
  • Količina: 500

Koja bi bila ispravna sintaksa? Probao sam sve vrste varijacija, ali čini se da je struktura sapuna prilično fleksibilna, tako da postoji samo toliko načina da to učinite. Ovo nisam mogao shvatiti iz priručnika...

AŽURIRANJE 1: Isprobani uzorak iz MMK-a:

$client = novi SoapClient("http://example.com/webservices?wsdl"); $params = array("id" => 100, "name" => "Jovan", "description" => "Barel nafte", "količina" => 500,); $response = $client->__soapCall("Function1", array($params));

Ali dobijam ovaj odgovor: Objekat nema svojstvo "Contact". Kao što možete vidjeti u izlazu getTypes() , postoji struktura koja se zove Contact , pa pretpostavljam da nekako moram pojasniti da moji parametri uključuju podatke o kontaktu, ali pitanje je: kako?

AŽURIRANJE 2: Pokušao sam i ove strukture, ista greška.

$params = array(array("id" => 100, "name" => "John",), "Barad nafte", 500,);

Kao i:

$params = array("Contact" => array("id" => 100, "name" => "John",), "description" => "Barel nafte", "količina" => 500,);

Greška u oba slučaja: objekat nema svojstvo "Contact".

Odgovori

Kod.

Ovo je ono što treba da uradite sa strane PHP :

(testirano i radi)

id = $id; $this->name = $name; ) ) /* Inicijalizirajte web servis svojim WSDL-om */ $client = new SoapClient("http://localhost:10139/Service1.asmx?wsdl"); /* Popunite svoj objekt kontakta */ $contact = new Contact(100, "John"); /* Podesite svoje parametre za zahtev */ $params = array("Contact" => $contact, "description" => "Barel of Oil", "amount" => 500,); /* Pozovite metod web servisa sa vašim parametrima, u ovom slučaju: Function1 */ $response = $client->__soapCall("Function1", array($params)); /* Ispis odgovora web servisa */ var_dump($response); ?>

Kako da znam da radi?

  • Ako uradite print_r($params); vidjet ćete ovaj rezultat jer vaša web usluga očekuje:

Niz ( => Kontakt objekt ( => 100 => Ivan) => Barel nafte => 500)

  • Kada sam debagovao uzorak .NET web servisa, dobio sam sljedeće:

(Kao što vidite, Contact objekat nije null, kao ni drugi parametri, što znači da je vaš zahtjev uspješno završen sa PHP strane).

  • Odgovor .NET web servisa bio je očekivan i prikazan na PHP strani:

object (stdClass) public "Function1Result" => string "Detalji vašeg zahtjeva! id: 100, ime: John, opis: Barel nafte, količina: 500" (dužina = 98)

Nadam se da ovo pomaže :-)

Na primjer:

Require_once "WSDLInterpreter-v1.0.0/WSDLInterpreter.php"; $wsdlLocation = " ?wsdl"; $wsdlInterpreter = novi WSDLInterpreter($wsdlLocation); $wsdlInterpreter->savePHP(".");

Ne znam zašto moj web servis ima istu strukturu kao vaš, ali ne treba mu klasu za parametar, već samo niz.

Na primjer: - Moj WSDL:

5390a7006cee11e0ae3e0800200c9a66 831f8c1ad25e1dc89cf2d8f23d2af...fa85155f5c67627 VITS-STALENS Zoethout you 0.100 10K24 2012-12-31 Gladys Roldan de Moras

Calle General Oraá 26 (4º izda) 28006 Madrid ES
es

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

Evo rezultata:

Niz 0 => string "OrderConfirmation createOrder(OrderRequest $createOrder)" (dužina=56) niz 0 => string "struct OrderRequest ( Identifikacija; Isporuka; Paket; Primalac; referenca na string; )" (dužina=130) 1 => string "identifikacija strukture (pošiljalac niza; hash niza; izvornik stringa; )" (dužina=75) 2 => string "isporuka strukture (čvor od; čvor do; )" (dužina=41) 3 => string " struct Čvor ( zemlja niza; string čvor; )" (dužina=46) 4 => string "struktura Parcela (opis niza; decimalna težina; string orderNumber; datum narudžbine; )" (dužina=93) 5 => string "struct Receiver ( string firstName; string prezime; Adresa adrese; string email; string language; )" (dužina=106) 6 => string "struct Address ( string line1; string line2; string poštanski kod; string grad; string country; )" (dužina). =99) 7 => string "struct OrderConfirmation ( string trackingNumber; string reference; )" (dužina=71) 8 => string "struct OrderServiceException ( string code; OrderServiceException faultInfo; string poruka; )" (dužina=97)

Dakle u mom kodu:

$client = novi SoapClient("http://packandship-ws.kiala.com/psws/order?wsdl"); $params = array("reference" => $orderId, "identification" => array("sender" => param("kiala", "sender_id"), "hash" => hash("sha512", $orderId . param("kiala", "sender_id") param("kiala", "password")), "originator" => null,), "delivery" => array("from" => array("country" =). > "es", "node" => "",), "to" => array("country" => "es", "node" => "0299"), "parcel" => array( "description" => "Opis", "težina" => 0.200, "orderNumber" => $orderId, "orderDate" => datum("Y-m-d")), "receiver" => array("firstName" => " Ime kupca", "prezime" => "Prezime kupca", "adresa" => array("line1" => "Adresa linije 1", "line2" => "Adresa linije 2", "poštanski broj" => 28006, "city" => "Madrid", "country" => "es",), "email" => " ", "language" => "es")); $result = $client->createOrder($params); var_dump($rezultat);

ali je uspješno!

Također možete koristiti SOAP usluge:

"Spain", "CityName" => "Alicante"); $response = $soapclient->getWeather($params); var_dump($response); // Dobijte gradove po zemlji $param = array("CountryName" => "Španija"); $response = $soapclient->getCitiesByCountry($param); var_dump($response);

Ovo je primjer sa pravom uslugom i funkcionira.

Nadam se da ovo pomaže.

Prvo inicijalizirajte web usluge:

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

Zatim postavite i proslijedite parametre:

$params = array("arg0" => $contactid, "arg1" => $desc, "arg2" => $contactname); $response = $client->__soapCall("ime metode", array($params));

Imajte na umu da je ime metode dostupno u WSDL-u kao naziv operacije, na primjer:

Treba vam višedimenzionalni niz, možete probati ovo:

$params = array(array("id" => 100, "name" => "John",), "Barad nafte", 500);

u PHP-u niz je struktura i vrlo je fleksibilan. Obično sa sapunskim pozivima koristim XML omotač pa nisam siguran da li će raditi.

EDIT:

Ono što biste možda želeli da pokušate je kreiranje json zahteva za slanje ili korišćenje ovog za kreiranje xml za kupovinu prateći ono što je na ovoj stranici: http://onwebdev.blogspot.com/2011/08/ php-converting-rss-to- json.html

Morate se izjasniti sporazum klasa

Ugovor klase (javni $id; javni $name; ) $contract = novi ugovor(); $contract->id = 100; $contract->name = "Jovan"; $params = array("Contact" => $contract, "description" => "Barel nafte", "količina" => 500,);

$params = array($contract, "description" => "Barel nafte", "količina" => 500,);

$response = $client->__soapCall("Function1", array("FirstFunction" => $params));

$response = $client->__soapCall("Funkcija1", $params);

Veliko pitanje jer su mnogi programeri, čak i oni iskusni, zbunjeni načinom na koji PHP rukuje nizovima u foreach petljama. U standardnoj foreach petlji, PHP kreira kopiju niza koji se koristi u petlji. Kopija se odbacuje odmah nakon završetka petlje. Ovo je transparentno za rad jednostavne foreach petlje. Na primjer:

$set = array("jabuka", "banana", "kokos"); foreach ($set AS $item) ( echo "($item)\n"; )

Ovi rezultati:

Jabuka banana kokos

Tako se kreira kopija, ali programer to ne primjećuje jer se originalni niz ne referencira u petlji ili nakon završetka petlje. Međutim, kada pokušate promijeniti elemente u petlji, otkrit ćete da se oni ne mijenjaju kada se završi:

$set = array("jabuka", "banana", "kokos"); foreach ($set AS $item) ( $item = strrev ($item); ) print_r($set);

Ovi rezultati:

Niz ( => jabuka => banana => kokos)

Bilo kakve promjene u odnosu na original se ne mogu označiti, zapravo se ne prave nikakve promjene na originalu, čak i ako ste eksplicitno dodijelili vrijednost $item. To je zato što radite na $item-u kako se pojavljuje u kopiji $seta na kojem radi. Ovo možete nadjačati tako što ćete uhvatiti $item referencom, ovako:

$set = array("jabuka", "banana", "kokos"); foreach ($set AS &$item) ( $item = strrev($item); ) print_r($set);

Ovi rezultati:

Niz ( => elppa => ananab => tunococ)

Dakle, očito je i vidljivo da kada se $item pokrene referencom, promjene napravljene u $item se vrše na članovima originalnog $seta. Korišćenje $item kao referenca takođe sprečava PHP da kreira kopiju niza. Da bismo ovo testirali, prvo ćemo pokazati brzu skriptu koja demonstrira kopiju:

$set = array("jabuka", "banana", "kokos"); foreach ($set AS $item) ( $set = ucfirst($item); ) print_r($set);

Ovi rezultati:

Niz ( => jabuka => banana => kokos => jabuka => banana => kokos)

Kao što je prikazano u primjeru, PHP je kopirao $set i koristio ga za iteraciju preko njega, ali kada je $set korišten u petlji, PHP je dodao varijable u originalni niz, a ne u kopirani niz. U osnovi, PHP koristi samo kopirani niz za petlju i dodjelu $item. Zbog toga se gornja petlja izvodi samo 3 puta i svaki put dodaje drugu vrijednost na kraj originalnog $seta, ostavljajući originalni $set sa 6 elemenata, ali nikada ne ulazi u beskonačnu petlju.

Međutim, šta ako bismo koristili $item kao referencu kao što sam ranije spomenuo? Jedan znak dodan u gornji test:

$set = array("jabuka", "banana", "kokos"); foreach ($set AS &$item) ( $set = ucfirst($item); ) print_r($set);

Rezultat je beskonačna petlja. Imajte na umu da je ovo zapravo beskonačna petlja, morat ćete ili sami ubiti skriptu ili čekati da se vaš OS ugasi. Dodao sam sljedeću liniju u svoju skriptu tako da će PHP-u vrlo brzo ostati bez memorije, predlažem da uradite isto ako ćete izvoditi ove beskonačne testove petlje:

Ini_set("memory_limit","1M");

Dakle, u ovom prethodnom primjeru beskonačne petlje, vidimo razlog zašto je PHP napisan, da se kreira kopija niza za ponavljanje. Kada se kopija kreira i koristi samo od strane dizajna same konstrukcije petlje, niz ostaje statičan dok se petlja izvodi, tako da nikada nećete naići na probleme.

Pozadina:

Pravim web-stranicu web-servisa koja će pružati mnoge vrste jednostavnih usluga povrh SOAP-a i eventualno drugih protokola. Cilj je olakšati stvari kao što su konverzije, RSS raščlanjivanje, provjere neželjene pošte i mnogi drugi poslovi. Stranica će biti uglavnom namijenjena programerima početnicima.

moj problem:

Nikada nisam razvijao u C# ili .NET. Hakovao sam neki VB6 prije nekoliko godina, ali to je to. Sada mi treba nekoliko primjeri upućivanja RPC poziva preko SOAP-a u C#. Pokušao sam pretražiti web i Stack Overflow da pronađem ovo, ali nisam našao mnogo resursa i nemam pojma kako rangirati resurse (koji su stari?, koji su netačni?, itd.).

Napravio sam jednostavan primjer servisa nazvanog u PHP-u:

getCurrentYear(); //Ova metoda vraća cijeli broj, nazvan "godina" ?>

Sada želim da nazovem ovu metodu što je jednostavnije moguće u C#. Svi linkovi i primjeri su dobrodošli. Gdje da počnem? Koje klase/module/šta mogu koristiti?

Rješenje uopće ne mora uključivati ​​SOAP ako postoji bolji komunikacijski okvir (pozadinska strana treba da bude proširiva), ali imajte na umu da je serverska strana implementirana u PHP-u na Unix-u, tako da su Microsoftova vlasnička rješenja izvan pitanje na strani servera.

Imajte na umu da mi je ovo potrebno kako bih mogao napisati dokumentaciju koju J. Random Web Developer može pratiti (čak i ako su na zajedničkom web hostu). Tako da mislim da bi najbolji pristup trebao biti da se to uradi samo u kodu, ali čak i drugi načini da se to uradi su naravno dobrodošli.

6 odgovora

Koliko sam shvatio, želite da pozovete svoju web uslugu iz C# klijentske aplikacije. Već imate uslugu i objavljenu WSDL datoteku (ispravite me ako griješim). Sada je najlakši način da kreirate proxy klase u vašoj C# aplikaciji (ovaj proces se zove dodavanje servisne veze). Postoje dva glavna načina da se to uradi: .NET pruža ASP.NET usluge što je stari način SOA-e i WCF-a, kao što je John predložio, što je najnoviji okvir iz MS-a i pruža mnoge protokole uključujući open source i MS aplikacije.

Sada dosta teorije i idemo korak po korak

Service1Client usluga = novi Service1Client();

int godina = service.getCurrentYear();

Nadam se da će vam ovo pomoći, ako naiđete na bilo kakav problem, javite nam.

Uradio sam dosta toga o čemu govorite, a SOAP kompatibilnost između platformi ima jedno osnovno pravilo: PRVO UGOVORITE. Nemojte izvoditi WSDL iz koda, a zatim pokušati kreirati klijenta na drugoj platformi. Sve što je veće od funkcija tipa "Hello World" vjerovatno neće uspjeti generirati kod, neće moći govoriti u vrijeme izvođenja ili (moje omiljeno) neće moći ispravno poslati ili primiti sve podatke bez pojave greške.

Međutim, WSDL je složena, gadna stvar i izbjegavam pisati ispočetka kad god je to moguće. Ispod su neke smjernice za pouzdanu servisnu komunikaciju (koristeći web veze, WCF, Axis2/Java, WS02, Ruby, Python, itd.):

Ako ga možete natjerati da radi u pretraživaču, onda je nešto jednostavno kako radi

Var webRequest = WebRequest.Create(@"http://webservi.se/year/getCurrentYear"); koristeći (var response = webRequest.GetResponse()) (koristeći (var rd = new StreamReader(response.GetResponseStream())) ( var soapResult = rd.ReadToEnd(); ) )

Pogledajte i NuSOAP. Ako ste sada, ovo je komplet alata koji vam omogućava da se povežete sa PHP-a na WCF servis.

Moram se povezati na jedan web servis i ovo je sve što imam:

    Primjer poziva:

    Korisničko ime Lozinka

    Znam da ova funkcija vraća string;

Evo šta sam do sada radio:

    Kreirao Reference usluge, dodajući samo WSDL adresu navedenu u koraku 1.

    Kreirao instancu web servisa i pozvao funkciju sa svim potrebnim parametrima, ali ne i sa korisnikom i lozinkom za zaglavlje.

Kako da nastavim? Hvala unapred.

1 odgovor

Ovo bi moglo biti dobro mjesto za početak ako trebate dodati svoje vjerodajnice; Mislim da ćeš morati pošto si ih nekako nabavio. Dio u koji dodajete svoje akreditive je ispod:

UsernameToken userToken = novi UsernameToken(korisničko ime, lozinka, PasswordOption.SendHashed); Service1 serviceProxy = nova usluga1(); SoapContext requestContext = serviceProxy.RequestSoapContext; requestContext.Security.Tokens.Add(userToken);

  1. Dodajte svoje vjerodajnice tako što ćete ih umetnuti u određeni token - čiji tip pripada imenskom prostoru Microsoft.Web.Services2.Security.Tokens
  2. Kreirajte proxy za svoju uslugu (u gornjem primjeru serviceProxy)
  3. Pristupite zaglavlju vašeg zahtjeva putem usluge RequestSoapContext
  4. Dodajte token zahtjevu

Također, mislim da biste mogli preskočiti dio "?Wsdl" u adresi jer se odnosi na specifikaciju web usluge. Kada to učinite, možete pokušati pozvati funkciju i vidjeti kako sve funkcionira: ako funkcija treba nešto vratiti, provjerite što ste očekivali.

Neću se zadržavati na pitanju šta je to web usluge i zašto su potrebni. Na internetu postoji mnogo članaka na ovu temu. Pokušat ću samo ukratko pokazati koliko je jednostavno kreirati klijenta za bilo koji web servis u PHP-u.

Postavke

Za upotrebu SOAP u php-u morate povezati SOAP modul (uključen u php5 distribuciju). Pod Windowsom, to se radi jednostavno - potrebno je dodati (naime dodati, pošto ova linija nije samo komentarisana, ona u potpunosti nedostaje) u php.ini:
extension=php_soap.dll

Ne zaboravite da restartujete server ako imate instaliran php kao modul.


Kreiranje SOAP klijenta iz WSDL dokumenta

Kreiranje SOAP klijenta obično se događa od strane WSDL dokument, što je XML dokument u određenom formatu koji u potpunosti opisuje određenu web uslugu. Za detalje o WSDL-u, upućujem vas na web stranicu konzorcijuma W3C - http://www.w3.org/TR/2005/WD-wsdl20-soap11-binding-20050510/.

Glavna stvar koju trebate znati da biste napravili klijenta za web uslugu je znati URL njegovog WSDL dokumenta.
Na primjer, uzmimo web servis "Currency Exchange" sa xmethods.com. Adresa ove web usluge, koja vam omogućava da primate kurseve na mreži, je http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl.

Druga važna stvar je da je iz opisa web servisa potrebno dobiti informacije o tome koje metode ovaj servis pruža i koje parametre treba da mu prenesemo kao ulazne vrijednosti (vrlo slično pozivu obične PHP funkcije ili klase metoda). Obično su ove informacije sadržane u opisu usluge na njenoj web stranici. Naš web servis za dobijanje kurseva obezbeđuje metod getRate() kojem se šifre valuta prosleđuju kao argumenti.

I na kraju, važno je znati šta očekivati ​​kao odgovor: koliko vrijednosti, koji tip, itd. Ovo se također može dobiti iz opisa.
I kao rezultat toga, kod se ispostavlja vrlo jednostavnim i kompaktnim, gotovo elementarnim:

// Korištenje web usluge
// "Kurs valute" sa xmethods.com

// Kreiranje SOAP klijenta iz WSDL dokumenta
$client = novi SoapClient("http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl");

// Pošaljite SOAP zahtjev i primite rezultat
$result = $client->getRate("us", "rusija");

Echo 'Trenutni kurs dolara: ', $rezultat, 'rublja';
?>

Kao što vidite iz koda, potrebno je da prosledite URL WSDL dokumenta konstruktoru klase SoapClient i primite objekat za rad sa željenim veb servisom. Zatim se poziva metoda ovog objekta, čije je ime isto kao i ime same metode web usluge. Ova metoda vraća rezultat koji želimo.

Dakle, ovaj jednostavan primjer ilustruje princip izgradnje SOAP klijenta za web servise u PHP-u. Međutim, u stvarnoj aplikaciji još uvijek treba voditi računa o mnogo čemu, posebno o činjenici da kada se web usluga pozove, ona može biti privremeno nedostupna ili će vratiti grešku. Upotreba bloka se jasno nameće probaj/uhvati/baci :)

mob_info