Sa evolucijom Interneta, pojavila se potreba za stvaranjem distribuiranih aplikacija. Aplikacije instalirane na računaru obično koriste biblioteke koje se nalaze na njemu. Nekoliko programa može koristiti jednu biblioteku. Mogu li se analozi biblioteka postaviti na Internet tako da ih različite stranice mogu pozivati? Ispostavilo se da da.
Preduzeća na svojim stranicama pružaju razne informacije. Na primjer, sa svoje web stranice http://www.Ford.com kompanija Ford objavljuje informacije o modelima i cijenama. Diler ove kompanije želi da ima ove informacije i na svojoj web stranici. Web usluga omogućava web lokaciji potrošača da preuzme informacije sa stranice dobavljača. Potrošačka stranica prikazuje ove informacije na svojim stranicama. Kod za generiranje ovih informacija napisan je jednom, ali ga mnogi potrošači mogu koristiti. Podaci su predstavljeni u običnom tekstu, tako da se mogu koristiti bez obzira na platformu.
Web usluge se široko koriste u aplikacijama za desktop i Internet. One nisu same aplikacije, već izvori podataka za aplikacije. Oni su nestali korisnički interfejs... Web servisi se ne moraju koristiti preko mreže – oni mogu biti dio projekta u kojem se koriste.
Web usluge su funkcionalnost i podaci koji se pružaju za korištenje od strane vanjskih aplikacija koje komuniciraju sa uslugama putem standardnih protokola i formata podataka. Web servisi su potpuno nezavisni od jezika i platforme. Tehnologija web usluga je kamen temeljac Microsoftovog modela programiranja. NET.
Ovo dalji razvoj programiranje komponenti CORBA i DCOM. Međutim, da bi se takve komponente koristile, potrebno ih je registrovati u sistemu potrošača. Ovo nije potrebno za web usluge. Komponente dobro rade na lokalnim mrežama. HTTP nije protokol za poziv udaljene procedure (RPC). Čak i unutar iste organizacije, različite OS koji mogu komunicirati samo preko HTTP-a.
Učinjeno je nekoliko pokušaja da se stvori jezik komunikacije između heterogenih sistema - DCOM, CORBA, RMI, IIOP. Nisu dobili opću distribuciju, jer su svaki od njih promovirali različiti proizvođači i stoga je bio vezan za tehnologije određenog proizvođača. Niko nije hteo da prihvati tuđe standarde. Da bi se prevazišla ova dilema, nekoliko kompanija se složilo da razviju standard neutralan prema dobavljačima za razmenu poruka preko HTTP-a. U maju 2000. IBM, Microsoft, HP, Lotus, SAP, UserLand i drugi pristupili su W3C-u i iznijeli SOAP kao kandidata za takav standard. SOAP je napravio revoluciju u razvoju aplikacija objedinjavajući dva Internet standarda, HTTP i XML.
SOAP
Za interakciju s web uslugama koristi se SOAP protokol baziran na XML-u. Možete koristiti samo XML, ali ovo je previše labav format, u kojem svaki dokument zapravo kreira svoj jezik. SOAP je konvencija o formatu XML dokumenta, o prisustvu određenih elemenata i imenskih prostora u njemu.
SOAP vam omogućava da objavite i koristite složene strukture podataka kao što je DataSet. Istovremeno, lako se uči. Trenutna verzija SAPUN - 1.2.
SOAP je skraćenica od Simple Object Access Protocol. SOAP je dizajniran da aplikacijama olakša komunikaciju preko HTTP-a. To je specifičan format nezavisan od platforme za razmjenu poruka putem Interneta. SOAP poruka je običan XML dokument. Standard
Lirski dio.
Zamislite da ste implementirali ili implementirate određeni sistem koji bi trebao biti dostupan izvana. One. postoji određeni server sa kojim trebate komunicirati. Na primjer web server.
Ovaj server može obavljati mnoge radnje, raditi sa bazom podataka, izvršavati neke zahtjeve trećih strana prema drugim serverima, uključivati se u neku vrstu proračuna itd. živjeti i eventualno razvijati prema svom dobro poznatom scenariju (tj. prema scenariju programera). Osoba nije zainteresirana za komunikaciju s takvim serverom, jer možda neće biti u mogućnosti / htjeti dati lijepe stranice sa slikama i drugim sadržajem prilagođenim korisnicima. Napisan je i radi da bi radio i izdavao podatke na zahtjeve prema njemu, ne mareći da su oni čitljivi, klijent će se sam baviti njima.
Drugi sistemi, koji se odnose na ovaj server, već mogu raspolagati podacima primljenim sa ovog servera po sopstvenom nahođenju - da obrađuju, akumuliraju, izdaju svojim klijentima itd.
Pa, jedna od opcija za komunikaciju sa takvim serverima je SOAP. SOAP xml protokol za razmjenu poruka.
Praktični dio.
Web servis (ovo je ono što server pruža i što klijenti koriste) omogućava komunikaciju sa serverom u jasno strukturiranim porukama. Činjenica je da web servis ne prihvata nikakve podatke. Na svaku poruku koja nije u skladu s pravilima web servis će odgovoriti greškom. Greška će, inače, biti i u obliku xml sa jasnom strukturom (što nije tačno za tekst poruke).
WSDL (jezik opisa web usluga). Na isti način su opisana i pravila po kojima se sastavljaju poruke za web servis koristeći xml i takođe imaju jasnu strukturu. One. ako web usluga pruža mogućnost pozivanja metode, trebala bi obavijestiti klijente koji se parametri koriste za ovu metodu. Ako web usluga očekuje string za metodu Method1 kao parametar i string mora biti nazvan Param1, tada će ova pravila biti navedena u opisu web usluge.
Kao parametri mogu se proslijediti ne samo jednostavni tipovi, već i objekti, kolekcije objekata. Opis objekta se svodi na opis svake komponente objekta. Ako se objekt sastoji od nekoliko polja, tada se svako polje opisuje koji tip, ime (koje moguće vrijednosti). Polja mogu biti i složenog tipa, i tako sve dok se opis tipova ne završi jednostavnim - string, boolean, broj, datum... Međutim, neki specifični tipovi mogu se pokazati jednostavnima, važno je da klijenti mogu razumjeti koje vrijednosti mogu biti sadržane u njima.
Za klijente je dovoljno znati url web servisa, wsdl će uvijek biti tu, pomoću kojeg možete dobiti predstavu o metodama i njihovim parametrima koje ovaj web servis pruža.
Koje su prednosti svih ovih zvona i zviždaljki:
- U većini sistema, opis metoda i tipova se javlja u automatski način rada... One. dovoljno je da programer na serveru to kaže ovu metodu može se pozvati putem web servisa, a wsdl opis će se automatski generirati.
Automatska validacija.
- xml validacija. xml mora biti dobro formiran. neispravan xml - odmah greška klijentu, neka to shvati.
- validacija šeme. xml mora imati specifičnu strukturu. xml ne odgovara shemi - odmah greška klijentu, neka shvati.
- Validaciju podataka vrši sapun-server tako da tipovi podataka, ograničenja odgovaraju opisu.
- Autorizacija i autentifikacija se mogu implementirati zasebna metoda... nativno. ili korištenjem http autorizacije.
- Web servisi mogu raditi i preko sapun protokola i preko http, odnosno putem get zahtjeva. To jest, ako su parametri jednostavni podaci (bez strukture), onda možete jednostavno pozvati uobičajeni get www.site.com/users.asmx/GetUser?Name=Vasia ili post. Međutim, to nije svugdje i ne uvijek.
- ... vidi wikipediju
Dobro strukturiran opis može pročitati svaki sapun klijent. One. bez obzira na web uslugu, klijent će razumjeti koje podatke web servis prihvata. Prema ovom opisu, klijent može izgraditi vlastitu internu strukturu klasa objekata, tzv. binding "i. Kao rezultat toga, programer koji koristi web servis mora napisati nešto poput (pseudokoda):
NewUser: = TSoapUser.Create ("Vasya", "Pupkin", "odmin"); soap.AddUser (NewUser);
Ima i dosta minusa:
- Nerazumno velika veličina poruke. Pa, ovdje je sama priroda xml-a takva da je format suvišan, što je više oznaka, to su beskorisnije informacije. Osim toga, sapun dodaje vlastitu redundantnost. Za intranet sisteme, problem saobraćaja je manje akutan nego za internet, pa zato lokalne mreže traženiji, posebno Sharepoint ima sapun web servis s kojim možete uspješno (i uz određena ograničenja) komunicirati.
- Automatska promjena opisa web usluge može pokvariti sve klijente. Pa to je kao za svaki sistem, ako nije podržana kompatibilnost sa starim metodama, sve će pasti...
- Nije minus, nego mana. Sve akcije za pozivanje metoda moraju biti atomske. Na primjer, radeći s pododjeljkom, možemo pokrenuti transakciju, izvršiti nekoliko zahtjeva, a zatim vratiti ili izvršiti. Nema transakcija u sapunu. Jedan zahtjev, jedan odgovor, razgovor je završen.
- Može biti prilično teško razumjeti opis onoga što je na strani servera (da li sam ja sve ispravno opisao?), šta je na klijentu (šta mi je ovdje napisano?). Bilo je nekoliko puta kada sam morao da se nosim sa klijentskom stranom, i da ubeđujem serverskog programera da su njegovi podaci pogrešno opisani, a on uopšte nije mogao da razume ništa, jer automatsko generisanje, a on, takoreći, ne bi trebalo, ovo je softversko poslovanje. A greška je prirodno bila u kodu metode, programer je jednostavno nije vidio.
- Praksa pokazuje da su programeri web servisa užasno udaljeni od ljudi koji koriste ove web servise. Kao odgovor na bilo koji zahtjev (važeći izvana), može doći do nerazumljive greške "Greška 5. Sve je loše". Sve zavisi od savesti programera :)
- Verovatno se još uvek nečega nisam setio...
Kao primjer, tu je otvoreni web servis belavia:
- http://86.57.245.235/TimeTable/Service.asmx - ulazna tačka, tu je i tekstualni opis metoda za programere treće strane.
- http://86.57.245.235/TimeTable/Service.asmx?WSDL - wsdl opis metoda i tipova primljenih i vraćenih podataka.
- http://86.57.245.235/TimeTable/Service.asmx?op=GetAirportsList - opis određene metode sa primjerom xml zahtjeva i xml odgovora.
Možete ručno kreirati i poslati zahtjev poput:
POST /TimeTable/Service.asmx HTTP / 1.1 Host: 86.57.245.235 Content-Type: text / xml; charset = utf-8 Content-Length: dužina SOAPAction: "http://webservices.belavia.by/GetAirportsList"
odgovor ce stici:
HTTP / 1.1 200 OK Datum: Pon, 30 Sep 2013 00:06:44 GMT Server: Microsoft-IIS / 6.0 X-Powered-By: ASP.NET X-AspNet-Verzija: 4.0.30319 Cache-Control: privatno, max -age = 0 Tip sadržaja: tekst / xml; charset = utf-8 Dužina sadržaja: 2940
Shl Ranije je otvoren Aeroflot web servis, ali nakon što je 1C dodao podršku za sapun na 8k, gomila 1c beta testera uspješno ga je poništila. Sad se tu nešto promijenilo (ne znam adrese, možete potražiti ako ste zainteresovani).
ZZY Odricanje od odgovornosti. Rekao mi je na nivou domaćinstva. Možeš da šutiraš.
Odricanje od odgovornosti:Napisano je dosta članaka na ovu temu i, kao što ste, naravno, pretpostavili, ovo je sljedeći. Možda ćete iz toga naučiti nešto novo, ali ništa super-tajno što sami ne biste mogli proguglati nije ovdje opisano. Samo napomene iz ličnog iskustva.
Uvod
Razmotrit ćemo samo situaciju kada postoji web servis treće strane i zadatak je uspostaviti razmjenu podataka.
Struktura usluge je opisana u datoteci WSDL(jezik opisa engleskog web servisa)
Datoteka je najčešće dostupna sa linka na kojem se nalazi ulazna tačka u sam web servis. Napisao sam "najčešće" jer ima izuzetaka. Na primjer, web-usluga zasnovana na SAP-u ne objavljuje wsdl i može se dobiti samo istovarom iz same aplikacije.
I tako, imamo opis web servisa, login, lozinku. Hajde da se povežemo.
// Definirajte URLServiceNameSpace settings = "http://Somesite.ru"; Korisničko ime = "TestUser"; Lozinka = "q1w2e3"; LocationWSDL = "https://Somesite.ru/WebService/Some?wsdl"; ServiceName = "SomeServiceName"; ConnectionPointName = "SomeService_Port"; // Kreiraj SSL vezu = New SecureConnection OpenSSL (); WSDefinition = Nova WSDefinicija (LocationWSDL, SSL); WSProxy = Novi WSProxy (WSDefinition, ServiceNameSpace URL, ServiceName, ConnectionPointName, SSL); WSProxy.User = Korisničko ime; WSProxy.Password = Lozinka;
Fino! Povezali smo se na web servis! U teoriji, ovo je osnova svake opcije razmjene, jer vam omogućava da kreirate objekt strukture podataka baziran na wsdl-u, a rad sa takvim objektom je zadovoljstvo.
Uzmite u obzir XML koji nam daje SoapUI
Hajde da to opišemo programski
// Kreirajte objekat i popunite ga podacima XDTOFactory = WSDefinition.XDTOFactory; RootType = CustomXDTO.Type (URL ServiceNameSpace, "SUBMISSION"); RootObject = MyXDTOFactory.Create (RootType); RootObject.ID = "4356"; ClientType = CustomXDTO.Type (URL ServiceNameSpace, "CUSTOMER"); ClientObject = OwnXDTOFactory.Create (ClientType); ClientObject.CLIENT_ID = "121212"; ClientObject.SEX = "M"; // F - ženski, M - muški ClientObject.CLIENT_BIRTHDAY = "19900111"; // Automobili klijenata AutoType = OwnFactoryXDTO.Type (URLServiceNameSpace, "CARS"); AutoObject = OwnXDTOFactory.Create (AutoType); AutoObject.CLASS = "Mercedes"; AutoObject.MODEL = "GLS"; ClientObject.CARS.Add (AutoObject); AutoObject = OwnXDTOFactory.Create (AutoType); AutoObject.CLASS = "Audi"; AutoObject.MODEL = "TT"; ClientObject.CARS.Add (AutoObject); RootObject.CUSTOMER.Add (ClientObject);
Podaci su uspješno popunjeni. Sada ih trebate poslati.
U ovom trenutku se pojavljuju mnoge nijanse. Pokušajmo razmotriti svaki.
Recept 1. Slanje cijelog XDTO objekta
Rezultat = WSProxy.AddCustomers (RootObject);
Ostaje samo da obradimo rezultat koji nam je usluga vratila i to je to. Slažem se da je ovo vrlo zgodno!
Ali u praksi to nije uvijek slučaj. Na primjer, 1c se ne slaže sa prefiksiranjem određenih oznaka unutar xml-a kada se imenski prostor korijenske oznake razlikuje od onog djece. U takvim slučajevima morate ručno skupljati sapun. Morao sam se baviti i web servisima koji čekaju čisti xml kao parametar. Ludilo, ali to ipak nije preteško.
Recept 2. Slanje čistog xml-a kao parametra
XMLWriteParameters = Novi XMLWriterParameters ("UTF-8", "1.0", True); MyXML = Novi XML zapis; MyXML.SetString (Opcije XMLWriter); MyXML.WriteXMLDeclaration (); MyXDTOFactory.WriteXML (MyXML, RootObject); XML string = MyXML.Close (); Ako DeleteNamespaceDescription onda pokušaj FirstTagVSRow = StrGetString (XMLString, 2); RootTagName = RootObject.Type ().Naziv; XMLString = StringReplace (XMLString, FirstTagVS string, "<"+ИмяКорневогоТэга+">"); Izuzetak // DescriptionErrors () EndTry; EndIf; Rezultat = WSProxy.AddCustomers (XML string);
Ako ne uklonite prostor imena koji 1c dodaje po defaultu, onda je on postao više od 5 linija koda. Češće nego ne, ja umotavam xml konverziju u funkciju, pošto obično pozivam više metoda.
Recept 3. Slanje izvornog HTTP zahtjeva.
StringSOAP = "U ovom slučaju, sapun ćemo morati sakupljati ručno. U stvari, mi samo umotamo xml iz recepta 2 u ljusku sapuna, gdje, ovisno o zahtjevima web servisa, možemo mijenjati naš sapun kako želimo.
Zatim opisujemo zaglavlja prema dokumentaciji. Neki servisi će mirno prožvakati naš zahtjev bez zaglavlja, ovdje morate pogledati konkretan slučaj. Ako ne znate koja zaglavlja napisati, onda je najlakši način da špijunirate zahtjev u SoapUI prelasku na karticu RAW.
Funkcija za dobijanje Base64 stringa izgleda ovako (špijunirano):
Funkcija GetBase64AuthorizationHeader (korisničko ime, lozinka) FileCoding = TextCode.UTF8; TemporaryFile = GetTemporaryFileName (); Zapis = Novi tekstualni zapis (TemporaryFile, FileCode); Record.Record (Korisničko ime + ":" + Lozinka); Record.Close (); DWData = Novi binarni podaci (TemporaryFile); Rezultat = Base64String (DWData); DeleteFiles (TemporaryFile); Rezultat = Prosjek (Rezultat, 5); Refund Result; EndFunction
Postoji važna stvar. Kada radite sa HTTPConnection, navedite adresu bez navođenja protokola "http: //" i "https: //", inače rizikujete da gubite vrijeme tražeći očiglednu grešku.
Recept 4. Slanje preko WinHttpRequest
WinHttp = Novi COMObject ("WinHttp.WinHttpRequest.5.1"); WinHttp.Opcija (2, "UTF-8"); WinHttp.Option (4, 13056); // intSslErrorIgnoreFlag WinHttp.Option (6, istina); // blnEnableRedirects WinHttp.Option (12, istina); // blnEnableHttpsToHttpRedirects WinHttp.Open ("POST", "https://Somesite.ru/WebService/Some/GetCustomer", 0); WinHttp.SetRequestHeader ("Content-type", "text / xml"); WinHttp.SetCredentials (korisničko ime, lozinka, 0); WinHttp.Send (String SOAP); WinHttp.WaitForResponse (15); XMLResponse = WinHttp.ResponseText ();Ovdje, u suštini, isto kao u prethodnoj verziji, ali radimo sa COM objektom. Navodimo niz veze u cijelosti, zajedno sa protokolom. Posebnu pažnju treba obratiti samo na ignoriranje oznaka greške SSL certifikata. Potrebni su ako radimo na SSL-u, ali bez određenog certifikata, jer u ovoj opciji nije moguće napraviti novu sigurnu vezu (ili ne znam kako). Ostatak mehanizma je sličan prethodnom.
Takođe, pored "WinHttp.WinHttpRequest.5.1", možete koristiti "Microsoft.XMLHTTP", "Msxml2.XMLHTTP", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP.6.0", ako odjednom ne potraje isključeno na WinHttp. Metode su skoro iste, samo je broj parametara različit. Pretpostavljam da je jedna od ovih opcija tvrdo kodirana unutar 1c HTTPRequest objekta.
Trenutno, ovo su svi recepti koje imam. Ako naiđem na nove, svakako ću dopuniti članak.
Obrada rezultata
U receptu 1 najčešće dobijamo gotov XDTO objekat i radimo sa njim kao sa strukturom. U svim ostalim slučajevima, možete pretvoriti xml odgovor u XDTO
Ako je Result.StatusCode = 200 Tada je XMLReader = Novi XMLReader; ReadXML.SetString (Result.GetBodyAsString ()); ObjectResponse = OwnXDTOFactory.ReadXML (ReadXML); Izvještaj (ObjectResponse.Body.Response.RESPONSE_ID); Izvještaj (ObjectResponse.Body.Response.RESPONSE_TEXT); EndIf;
Ovdje je sve jednostavno.
Umjesto zaključka
1. Počnite raditi sa web servisima sa SoapUI programom. Dizajniran je za takav rad i omogućit će vam da brzo shvatite kako određena usluga funkcionira. Postoji članak za savladavanje
2. Ako razmjenjujete sa servisom preko nezaštićenog http kanala i postavlja se pitanje šta tačno 1c šalje u vašim porukama, onda možete koristiti njuškare prometa kao što su Wireshark, Fiddler i drugi. Problem će nastati samo ako koristite ssl vezu.
3. Ako, ipak, web usluga komunicira putem https, tada na udaljeni stroj (bilo koji, glavna stvar nije na nama) stavljamo Nginx server, na koji ćemo kontaktirati, a on će se pakirati sve u https i pošaljite gdje je potrebno ( obrnuti proxy ) i dodajte u standardnu konfiguraciju:
Server (slušajte 0.0.0.0:8080; server_name MyServer; lokacija ~. * (Proxy_pass https://Somesite.ru:8001; proxy_set_header Host $ host; proxy_set_header Autorizacija "Basic
5. Ako autentifikacija uključuje korištenje kolačića, tada je pronađeno sljedeće
P.S. Ako imate pitanja, sugestije za poboljšanje koda, imate svoje recepte koji se razlikuju od opisanih, pronašli ste greške ili mislite da je autor "sjajan" i da mu "nije mjesto u 1c", onda napišite komentare i mi ćemo raspravljati o svemu.
Naslov teme je zaista pitanje, jer Ni sam ne znam šta je to i po prvi put ću pokušati s tim raditi u okviru ovog članka. Jedina stvar koju mogu garantirati da će kod u nastavku raditi, ali moje fraze će biti samo pretpostavke i nagađanja o tome kako ja sam sve ovo razumijem. pa idemo...
Uvod
Moramo početi od onoga zbog čega je kreiran koncept web servisa. U vrijeme kada se ovaj koncept pojavio, u svijetu su već postojale tehnologije koje su omogućavale interakciju aplikacija na daljinu, gdje je jedan program mogao pozvati neku metodu u drugom programu, koji se istovremeno mogao pokrenuti na računaru koji se nalazi u drugom gradu ili čak zemlja. Sve ovo je skraćeno RPC (Remote Procedure Calling). Primjeri uključuju CORBA tehnologije, a za Javu - RMI (Remote Method Invoking). I čini se da je sve u njima dobro, posebno u CORBI, tk. možete raditi s njim u bilo kojem programskom jeziku, ali nešto je ipak nedostajalo. Vjerujem da je nedostatak CORBA-e to što djeluje kroz neke svoje mrežni protokoli umjesto jednostavnog HTTP-a, koji će puzati kroz bilo koji zaštitni zid. Ideja iza web servisa je bila kreiranje RPC-a koji bi se zalijepio u HTTP pakete. Tako je započeo razvoj standarda. Koji su osnovni koncepti ovog standarda:- SOAP... Prije pozivanja udaljene procedure, morate opisati ovaj poziv XML fajl e SOAP format. SOAP je jednostavno jedna od mnogih XML oznaka koje se koriste u web servisima. Sve što želimo negdje poslati putem HTTP-a prvo se pretvara u XML SOAP opis, zatim se stavlja u HTTP paket i šalje na drugi računar na mreži putem TCP/IP-a.
- WSDL... Postoji web servis tj. program čije metode se mogu pozvati na daljinu. Ali standard zahtijeva da se uz ovaj program priloži opis koji kaže da "da, niste pogriješili - ovo je zaista web servis i iz njega možete pozvati takve i takve metode." Ovaj opis je predstavljen drugom XML datotekom koja ima drugačiji format, naime WSDL. One. WSDL je samo XML opisna datoteka za web servis i ništa drugo.
Opšti pristup
Web servisi uvijek imaju klijenta i servera. Server je naš web servis i ponekad se naziva krajnja tačka (poput krajnje tačke gde odlaze SOAP poruke od klijenta). Moramo uraditi sljedeće:- Opišite sučelje naše web usluge
- Implementirajte ovaj interfejs
- Pokrenite našu web uslugu
- Napišite klijenta i daljinski pozovite traženu metodu web usluge
Server
Započnimo IDEA i kreirajmo novi projekat Kreirajte novi projekat... Hajde da unesemo ime HelloWebService i pritisnite dugme Sljedeći, zatim dugme Završi... U folderu src kreirajte paket ru.javarush.ws... U ovom paketu ćemo kreirati sučelje HelloWebService: paket ru. javarush. ws; // ovo su napomene, tj. način da označimo naše klase i metode, // u vezi s tehnologijom web usluga import javax. jws. WebMethod; import javax. jws. WebService; import javax. jws. sapun. SOAPBinding; // kažemo da će naš interfejs raditi kao web servis@WebService // kažemo da će se web servis koristiti za pozivanje metoda@SOAPBinding (style = SOAPBinding. Style. RPC) javni interfejs HelloWebService ( // kažemo da se ova metoda može pozvati na daljinu@WebMethod public String getHelloString (ime stringa); ) U ovom kodu, klase WebService i WebMethod su takozvane napomene i ne rade ništa osim što označavaju naš interfejs i njegovu metodu kao web servis. Isto vrijedi i za klasu SOAPBinding. Jedina razlika je u tome što je SOAPBinding oznaka parametra. V u ovom slučaju parametar style se koristi sa vrijednošću koja kaže da web servis neće raditi kroz poruke dokumenta, već kao klasični RPC, tj. za pozivanje metode. Hajde da implementiramo logiku našeg interfejsa i kreiramo klasu HelloWebServiceImpl u našem paketu. Inače, napominjem da je kraj klase u Impl-u konvencija u Javi, prema kojoj se implementacija interfejsa označava na ovaj način (Impl - od riječi implementacija, tj. implementacija). Ovo nije uslov i slobodno možete da imenujete klasu kako god želite, ali pravila dobre forme to zahtevaju: paket ru. javarush. ws; // ista napomena kao kod opisa interfejsa, import javax. jws. WebService; // ali se ovdje koristi s parametrom endpointInterface, // navodeći potpuno kvalificirano ime klase sučelja naše web usluge@WebService (endpointInterface = "ru.javarush.ws.HelloWebService") javna klasa HelloWebServiceImpl implementira HelloWebService (@Override public String getHelloString (ime stringa) ( // samo vrati pozdrav vrati "Zdravo," + ime + "!" ; )) Pokrenimo naš web servis kao nezavisni server, tj. bez uključivanja Tomcat-a i aplikacijskih servera (ovo je tema za posebnu raspravu). Da biste to učinili, u strukturi projekta u fascikli src hajde da kreiramo paket ru.javarush.endpoint, iu njemu kreiramo HelloWebServicePublisher klasu sa main metodom: package ru. javarush. krajnja tačka; // klasa za pokretanje web servera s web uslugama import javax. xml. ws. Krajnja tačka; // klasa našeg web servisa import ru. javarush. ws. HelloWebServiceImpl; javna klasa HelloWebServicePublisher (javni statički void main (String... args) ( // pokretanje web servera na portu 1986 // i na adresi navedenoj u prvom argumentu, // pokreće web servis proslijeđen u drugom argumentu Krajnja tačka. objaviti ( "http: // localhost: 1986 / wss / hello", novi HelloWebServiceImpl ()); )) Sada pokrenimo ovu klasu klikom Shift + F10... Ništa se ne pojavljuje na konzoli, ali server radi. Ovo možete provjeriti tako što ćete u pretraživač upisati red http: // localhost: 1986 / wss / hello? Wsdl. Stranica koja se otvara, s jedne strane, dokazuje da je web server (http://) pokrenut na našem računalu (localhost) na portu 1986, a s druge strane prikazuje WSDL opis našeg web servisa. Ako zaustavite aplikaciju, opis će postati nedostupan, kao i sam web servis, tako da to nećemo raditi, već ćemo nastaviti sa pisanjem klijenta.Kupac
U fascikli projekta src kreirajte paket ru.javarush.client, iu njemu klasu HelloWebServiceClient sa glavnim metodom: paket ru. javarush. klijent; // potreban za dobivanje wsdl opisa i kroz njega // doći do samog web servisa import java. net. URL; // takvo izvršenje će se dogoditi kada radite sa URL objektom import java. net. MalformedURLException; // klase za raščlanjivanje xml-ku sa wsdl opisom // i dođemo do servisne oznake u njoj import javax. xml. imenskog prostora. QName; import javax. xml. ws. Service; // sučelje našeg web servisa (treba nam više) import ru. javarush. ws. HelloWebService; javna klasa HelloWebServiceClient (javni statički void main (String args) izbacuje MalformedURLException ( // kreiramo vezu do wsdl opisa Url url= novi URL ( "http: // localhost: 1986 / wss / hello? wsdl") ; // Parametre sljedećeg konstruktora gledamo u prvoj oznaci WSDL opisa - definicije // vidi 1. argument u atributu targetNamespace // vidi 2. argument u atributu name QName qname = novo QName ("http: //ws.site/", "HelloWebServiceImplService"); // Sada možemo doći do servisne oznake u wsdl opisu, Servisna usluga= Usluga. kreirati (url, qname); // a zatim do ugniježđene oznake porta, tako da // dobijemo vezu do objekta web usluge udaljenog od nas HelloWebService hello = usluga. getPort (HelloWebService. klasa); // Ura! Sada možete pozvati udaljenu metodu Sistem. van. println (zdravo. getHelloString ("CodeGym")); )) Dao sam maksimum komentara na kod u listingu. Nemam šta da dodam, pa pokrenite (Shift + F10). Trebali bismo vidjeti tekst u konzoli: Zdravo, CodeGym! Ako ga niste vidjeli, vjerovatno ste zaboravili pokrenuti web uslugu.Zaključak
U ovoj temi predstavljen je kratak izlet u web servise. Opet, mnogo toga što sam napisao je moje nagađanje o tome kako to funkcionira, i stoga mu ne treba previše vjerovati. Bio bih zahvalan ako upućeni ljudi oni će me ispraviti, jer ću tada nešto naučiti. UPD.Alexey Boyko
SOAP i XML Web usluge na .Net platformi
XML Web usluge nude ovaj nivo kompatibilnosti i interoperabilnosti između operativnih sistema,
platforme i jezici koji ranije jednostavno nisu bili dostupni.
Andrew Troelsen (MVP (najvredniji profesionalac u Microsoftu))
Ako još niste radili sa XML web servisima, vjerovatno ste čuli riječ "SOAP". Vrijeme je da se uhvatimo u koštac s ovim konceptima.
Intro
Ako vas zanima internet ili manje mreže, velike su šanse da ćete prije ili kasnije naići na XML web servise. XML web usluga nije samo web aplikacija koja može poslati informacije u pretraživač. Umjesto toga, radi se o tehnologiji udaljenog rada koja omogućava da se metode i svojstva objekta preko mreže pozivaju pomoću standardnih HTTP zahtjeva.
U praksi to znači da klijenti takve usluge mogu biti napisani na različitim jezicima i za različite operativne sisteme.
Kao "transport" informacija između servisa i klijenta, možete koristiti HTTP GET ili POST metode.
A možete "prekriti" još jedan protokol - SOAP (Simple Object Access Protocol). To se obično radi, jer je u ovom slučaju moguće prenijeti složene tipove (uključujući i one koje definira korisnik). A klasične metode GET i POST podržavaju samo liste, jednostavne nizove i nizove.
Primjer SOAP Interop
SOAP poruka je XML dokument umotan u tijelo HTTP zahtjeva.
Listing 1. Struktura SOAP poruke
Interakcija između klijenta i servisa je sljedeća:
- klijent kreira SOAP zahtjev i šalje ga servisu;
- servis uključen udaljeni računar izvršava proceduru i šalje SOAP odgovor.
Na primjer, SOAP zahtjev može izgledati ovako, pozivajući metodu HelloWorld () udaljene XML web usluge:
Listing 2. Primjer SOAP zahtjeva
Metoda HelloWorld (), kao što se i očekivalo, vraća string "Hello World!":
Listing 3. Uzorak SOAP odgovora
Xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: xsd = "http://www.w3.org/2001/XMLSchema">
Kreiranje XML web servisa u .NET 2.0
Možete kreirati uslugu Različiti putevi, koristićemo Visual Studio 2005. Kliknite na "File -> New -> Web Site", u prozoru koji se otvori izaberite "ASP.NET web Service". Na adresi navedenoj prilikom kreiranja, naći ćete sljedeće datoteke i direktorije (vidi sliku 1).
U principu, usluga može sadržavati samo jednu datoteku s ekstenzijom * .asmx. (Proširenje * .asmx se koristi za označavanje .Net web servisa.) U ovom slučaju, to nije slučaj, pogledajte sadržaj datoteke Service.asmx:
Listing 4. Service.asmx definira eksterni fajl podrška
<%@ WebService Language="C#" CodeBehind="~/App_Code/Service.cs" class="Service" %>
Atribut CodeBehind navodi eksternu datoteku koja se nalazi u mapi App_Code koja sadrži kod koji implementira metodu HelloWorld ():
Listing 5. Service.cs File Implementacija HelloWorld () metode
korištenje sistema;
koristeći System.Web;
koristeći System.Web.Services;
Javni servis () (
Vrati "Hello World";
Moguće je kreirati jednu datoteku Service.asmx, bez koda za podršku, koja ima istu funkcionalnost:
Listing 6. Service.asmx bez eksternog koda podrške
<%@ WebService Language="C#" class="Service" %>
korištenje sistema;
koristeći System.Web;
koristeći System.Web.Services;
koristeći System.Web.Services.Protocols;
Usluga javne klase: System.Web.Services.WebService
Javni servis () (
Javni string HelloWorld () (
Vrati "Hello World";
Ovo nam ne treba, i nećemo to učiniti.
Kao što vidite, jedini metod u našem web servisu je označen atributom koji obavještava ASP.NET runtime da je ovaj metod dostupan za dolazne HTTP zahtjeve. Članovi koji nisu identificirani ovim atributom neće biti dostupni klijentskim programima.
Ovakva jednostavna usluga sasvim je prikladna za naše eksperimente, ostaje samo da je objavimo.
Objavljivanje XML web servisa koristeći IIS
Ne govorimo o objavljivanju na Internetu, već o stvaranju uslova za testiranje našeg servisa na lokalnom računaru.
Prvi korak je instaliranje IIS-a (Internet Information Server). Da biste to učinili, otvorite prozor "Dodaj ili ukloni programe" i odaberite "Instaliraj Windows komponente". (Neki Windows verzije ne uključuju instalaciju IIS-a kao što je Windows XP Home Edition.)
Bilješka: IIS server bolje je instalirati ranije nego .Net Framework, inače ćete morati konfigurirati IIS da podržava .Net aplikacije pokretanjem uslužnog programa komandna linija aspnet_regiis.exe (sa / i zastavicom).
Kreirajte virtualni direktorij. Ako koristite Windows XP Pro, idite na "Kontrolna tabla -> Administrativni alati -> Internet Information Services". U prozoru koji se otvori odaberite Akcija -> Kreiraj -> Virtuelni imenik.
Pokrenut će se čarobnjak za novi virtualni direktorij. Alias Soap1 i navedite putanju do direktorija u koji želite postaviti uslugu, na primjer C: \ Soap1. Sada kopirajte sadržaj našeg web servisa tamo.
Upišite http: //localhost/soap1/Service.asmx u adresnu traku vašeg pretraživača i trebali biste vidjeti stranicu za testiranje usluge (pogledajte sliku 2).
Pregled SOAP poruka
Probna stranica ne dozvoljava slanje i čitanje SOAP poruka. Iz tog razloga, morat ćete koristiti razvoj treće strane, preporučujem korištenje soapUI. (Ovo je besplatan proizvod dostupan na http://www.soapui.org.)
Nakon instaliranja soapUI, kreirajte novi projekat pod nazivom soap1, ostavljajući polje Initial WSDL praznim (pogledajte sliku 3).
Desni klik na novokreirani projekat i odaberite "Dodaj WSDL iz URL-a". U dijaloškom okviru koji se otvori unesite http: //localhost/soap1/Service.asmx? Wsdl. Sada imamo mogućnost slanja SOAP zahtjeva našoj usluzi i pregled primljenih odgovora. (Zahtjeve će automatski generirati soapUI.)
Šta je ovo WSDL? WSDL dokument opisuje kako klijenti komuniciraju sa web uslugom. Opisuje koje su metode usluge dostupne za eksterno pozivanje, koje parametre prihvataju i šta vraćaju, kao i druge informacije potrebne za daljinsko upravljanje. Takav dokument se može izraditi ručno, ili možete povjeriti njegovo generiranje serveru, za to je dovoljno dodati Wsdl sufiks URL-u koji upućuje na * .asmx datoteku.
Da vidite WSDL dokument za našu uslugu, unesite http: //localhost/soap1/Service.asmx? Wsdl u svoj pretraživač. Informacije iz ovog dokumenta koristi soapUI za automatsko generiranje SOAP zahtjeva.
SOAP Extensions
Kao što ste možda primijetili, kreiranje XML web servisa (kao i klijenta) ne mora se baviti izgledom SOAP poruka. Dovoljno je označiti tražene metode atributom i ASP.NET runtime generiše pakete potrebnog formata.
Na sl. 4 prikazuje zahtjev i odgovor web usluge primljene pomoću programa soapUI.
Uradimo to još jednom. Zahtjev generira soapUI - kada kreirate stvarne klijente za uslugu, također ne morate ručno formatirati SOAP pakete. Takođe nismo direktno učestvovali u kreiranju odgovora servisa. Sve se ovo dešava automatski.
Međutim, vjerovatno ćete morati sami modificirati ove pakete. Na primjer, komprimirajte ili šifrirajte prenesene podatke. Ovo je svrha SOAP ekstenzija.
SOAP ekstenzije su mehanizam koji vam omogućava da proizvoljno mijenjate SOAP poruke koje šaljete i primate.
SOAP poruka "put"
Da biste započeli s programiranjem, morate uzeti u obzir putanju koju SOAP poruka putuje prije nego što je primljena i obrađena odgovarajućom metodom (vidi sliku 5).
SOAP poruka se može smatrati XML dokumentom koji opisuje objekt koji se prenosi preko mreže. Prije korištenja objekta koji je proslijeđen na ovaj način, mora se vratiti (ili, ako želite, sastaviti) iz ovog opisa. XML serijalizator služi ovoj svrsi.
Dolazni paketi se deserializiraju (vraćanje objekta iz XML opisa), a poslani se serijaliziraju (kreiranje XML opisa objekta).
Na sl. 5 prikazuje četiri tačke (BeforeSerialize, AfterDeserialize, BeforeDeserialize, AfterSerialize) na kojima možemo presresti SOAP poruku pomoću SOAP ekstenzija. Izmijenite ga i pošaljite dalje.
Implementacija SOAP proširenja
Za početak, definirajmo zadatak: recimo da želimo modificirati SOAP pakete koje šalje web servis kao što je prikazano na Listingu 7:
Listing 7. Stari i novi odgovori XML web servisa
Xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: xsd = "http://www.w3.org/2001/XMLSchema">
Xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: xsd = "http://www.w3.org/2001/XMLSchema"> Cipher text
Akcioni plan za implementaciju SOAP proširenja:
- Kreirajte dll sa klasom naslijeđenom od SoapExtension.
- Dodajte bin folder na naš web servis i tamo stavite kreirani dll.
- Dodajte web.config datoteku u uslugu i izvršite potrebne izmjene na njoj.
Kasnije ćemo razgovarati o ulozi bin foldera i web.config datoteke.
Kreiranje DLL-a sa SOAP ekstenzijom
Kreirajte novi projekat "Biblioteka razreda" pod nazivom SoapExtensionLib. U ovom projektu trebamo implementirati samo jednu klasu koja će izvršiti modifikacije koje su nam potrebne na SOAP paketima. Ova klasa mora naslijediti klasu SoapExtension.
Listing 8. Kreiranje klase naslijeđene od SoapExtension
korištenje sistema;
koristeći System.Web.Services;
koristeći System.Web.Services.Protocols;
koristeći System.IO;
koristeći System.Net;
koristeći System.Xml;
Svako SOAP proširenje prima kao parametar tok koji sadrži objekt koji će biti proslijeđen mrežom (prije ili nakon serijalizacije). I mora vratiti stream.
SOAP ekstenzija se može zamisliti kao "kutija" koja se može postaviti na jednu ili sve četiri tačke (BeforeSerialize, AfterDeserialize, BeforeDeserialize, AfterSerialize) prikazane na Sl. 5. Na svakoj tački može biti neograničen broj takvih "umetaka" (vidi sliku 6).
Za primanje ovih tokova koristi se metoda ChainStream.
Listing 9. Implementacija ChainStream metode
javna klasa TraceExtension: SoapExtension
Stream wireStream;
Stream appStream;
// metoda kao ulazni parametar
// dobiva tok koji sadrži proslijeđeni objekt
Javno nadjačavanje Stream ChainStream (Stream stream)
WireStream = tok;
AppStream = novi MemoryStream ();
Vrati appStream;
…
Kod BeforeDeserialize, wireStream sadrži primljeni SOAP zahtjev iz mreže. Ovaj SOAP zahtjev treba proslijediti aplikacijskom toku (appStream).
A na mjestu AfterSerialize, trebate poslati SOAP odgovor koji se šalje mreži na wireStream, koji će biti smješten u appStream.
Da biste radili sa nitima u svakoj od četiri tačke, morate implementirati metodu ProcessMessage.
Listing 10. Implementacija metode ProcessMessage koja ne mijenja SOAP poruke
// ProcessMessage radi obaveznu kopiju
// struji u dvije točke (prije Deserialize i AfterSerialize)
Prebaci (poruka.Stage)
// u tački PrijeDeserialize koju morate proći
// SOAP zahtjev iz mrežnog toka (wireStream)
// do toka aplikacije (appStream)
Case SoapMessageStage.BeforeDeserialize:
Kopiraj (wireStream, appStream);
AppStream.Position = 0;
Break;
// u točki AfterSerialize mora biti proslijeđen
// SOAP odgovor iz toka aplikacije u mrežni tok
AppStream.Position = 0;
Break;
void Copy (stream from, Stream to)
TextReader čitač = novi StreamReader (od);
TextWriter writer = novi StreamWriter (za);
Writer.WriteLine (reader.ReadToEnd ());
Writer.Flush ();
Zamislite Listing 10 kao prazan prostor za dalje eksperimentisanje. Ova implementacija ProcessMessage metode nema nikakvog smisla - odlazni SOAP odgovor se ne mijenja ni na koji način. Popravimo ovo:
Listing 11. Implementacija metode ProcessMessage za izmjenu SOAP odgovora
javno nadjačavanje void ProcessMessage (SoapMessage poruka)
Prebaci (poruka.Stage)
Case SoapMessageStage.AfterSerialize:
WriteOutput (poruka);
Break;
// dio koda je izrezan radi uštede prostora
// prepisujemo SOAP odgovor
public void WriteOutput (SoapMessage poruka)
AppStream.Position = 0;
// kreiramo XML dokument iz toka
XmlDocument dokument = novi XmlDocument ();
Document.Load (appStream);
// Da biste koristili XPath morate definirati
// NamespaceManager
XmlNamespaceManager nsmgr = novi XmlNamespaceManager (document.NameTable);
Nsmgr.AddNamespace ("sapun", "http://schemas.xmlsoap.org/soap/envelope/");
XmlNode ResultNode = document.SelectSingleNode ("// sapun: tijelo", nsmgr);
// zamjenjuje sadržaj čvora
ResultNode.InnerText = "ciphertext";
// očisti stream i napiše novi SOAP odgovor na njega
AppStream.SetLength (0);
AppStream.Position = 0;
Document.Save (appStream);
// OBAVEZNA RADNJA
// proslijediti SOAP odgovor iz toka aplikacije (appStream)
// u mrežni tok (wireStream)
AppStream.Position = 0;
Kopiraj (appStream, wireStream);
Zatim morate definirati dvije metode (od kojih je jedna preopterećena, odnosno može se pozvati s različitim skupovima parametara), koje u našem slučaju nisu potrebne. Međutim, moramo ih definirati u skladu s pravilima nasljeđivanja iz klase SoapExtension.
Listing 12. Druge potrebne metode
// U skladu sa pravilima nasljeđivanja, moramo
// definiramo ove metode, ali ih ne koristimo ni na koji način
javni objekat nadjačavanja?
GetInitializer (LogicalMethodInfo methodInfo, SoapExtensionAttribute atribut)
Vrati null;
javni objekt nadjačavanja GetInitializer (Type WebServiceType)
Vrati null;
javno nadjačavanje void Initialize (inicijalizator objekta)
Povratak;
To je to, sastavljamo projekat. Konačno smo dobili dll sa SOAP ekstenzijom. Kompletna lista SoapExtensionLib.dll može se naći na web stranici časopisa u odjeljku "Izvorni kod".
Konfiguriranje web usluge za rad sa SOAP ekstenzijom
Ponovo otvorite naš projekat XML web usluge pomoću Visual Studio-a. Kliknite na "WebSite -> Add Reference" i odaberite SoapExtensionLib.dll koji ste ranije kreirali.
Bin folder će se automatski dodati projektu. Aplikacija automatski referencira * .dll datoteke koje se nalaze u mapi Bin.
Sada stavite sljedeći sadržaj u datoteku Web.Config u direktorij web usluge:
Listing 13. Datoteka Web.Config
Prioritet = "1" Grupa = "0" />
Sada struktura naše usluge izgleda kao ona prikazana na sl. 7. Koristimo datoteku Web.Config da obavijestimo ASP.NET da smo dodali XML Soap Extension na Web uslugu, implementiranu u klasu TraceExtension koja se nalazi u datoteci SoapExtensionLi.dll. Listing 14. Odjeljak webServices u datoteci Web.Config Prioritet = "1" Grupa = "0" />
Kao što već znate, može se napraviti mnogo SOAP ekstenzija, a tok koji nosi proslijeđeni objekt (prije ili poslije serijalizacije) će proći kroz svako od njih. Redoslijed kojim tok teče kroz različite SOAP ekstenzije specificiran je korištenjem atributa prioriteta i grupe. Vrijedi napomenuti da konfiguriranjem Web.Config na ovaj način obavještavamo okruženje da će naša SOAP ekstenzija biti pozvana za svaku metodu usluge označenu atributom. Moguće je kreirati vlastiti atribut i njime označiti samo one metode za koje trebate pozvati SOAP ekstenziju. Listing 15. Primjer korištenja prilagođenog atributa javni string HelloWorld () ( Vrati "Hello World"; Da biste to učinili, dodajte klasu naslijeđenu od SoapExtensionAttribute u SoapExtensionLi.dll (pogledajte sliku 8). Zaključak Ovaj članak odražava glavne točke konstrukcije i rada XML web servisa na .Net platformi. Nadam se da će prezentovani materijal biti sasvim dovoljan da se, ako je potrebno, možete upustiti u dublje proučavanje teme. U kontaktu sa