Tutorial Servicii Web SOAP: Ce este protocolul SOAP?
โก Rezumat inteligent
SOAP (Simple Object Access Protocol) este un protocol bazat pe XML pentru accesarea serviciilor web prin HTTP. Aceastฤ resursฤ explicฤ elementele constitutive SOAP, structura mesajelor, elementele de anvelopฤ ศi de eroare, modelul de comunicare ศi un exemplu practic de serviciu web ASMX.
Ce este SAPUNUL?
SOAP este un protocol bazat pe XML pentru accesarea serviciilor web prin HTTP. Are cรขteva specificaศii care ar putea fi utilizate รฎn toate aplicaศiile.
SOAP este cunoscut sub numele de Simple Object Access Protocol (Protocol simplu de acces la obiecte), dar ulterior a fost prescurtat la SOAP v1.2. SOAP este un protocol sau, cu alte cuvinte, este o definiศie a modului รฎn care serviciile web comunicฤ รฎntre ele sau cu aplicaศiile client care le invocฤ.
SOAP a fost dezvoltat ca un limbaj intermediar, astfel รฎncรขt aplicaศiile construite pe diferite limbaje de programare sฤ poatฤ vorbi cu uศurinศฤ รฎntre ele ศi sฤ evite efortul extrem de dezvoltare.
SOAP Introducere
รn lumea de astฤzi, existฤ un numฤr imens de aplicaศii construite pe diferite limbaje de programare. De exemplu, ar putea exista o aplicaศie web proiectatฤ รฎn Java, altul รฎn .Net ศi altul รฎn PHP.
Schimbul de date รฎntre aplicaศii este crucial รฎn lumea รฎn reศea de astฤzi. Dar schimbul de date รฎntre aceste aplicaศii eterogene ar fi complex. La fel va fi ศi complexitatea codului pentru a realiza acest schimb de date.
Una dintre metodele folosite pentru a combate aceastฤ complexitate este utilizarea XML (Extensible Markup Language) ca limbaj intermediar pentru schimbul de date รฎntre aplicaศii.
Fiecare limbaj de programare poate รฎnศelege limbajul de marcare XML. Prin urmare, XML a fost folosit ca mediu de bazฤ pentru schimbul de date.
รnsฤ nu existฤ specificaศii standard privind utilizarea XML รฎn toate limbajele de programare pentru schimbul de date. Aici intervine software-ul SOAP.
SOAP a fost proiectat sฤ funcศioneze cu XML prin HTTP ศi sฤ aibฤ un fel de specificaศie care ar putea fi utilizatฤ รฎn toate aplicaศiile. Vom analiza mai multe detalii despre protocolul SOAP รฎn capitolele urmฤtoare.
Avantajele SOAP
SOAP este protocolul folosit pentru schimbul de date รฎntre aplicaศii. Mai jos sunt cรขteva dintre motivele pentru care este utilizat SOAP.
- Cรขnd se dezvoltฤping Pentru serviciile web bazate pe SOAP, este nevoie de un limbaj care poate fi utilizat de serviciile web pentru a comunica cu aplicaศiile client. SOAP este mediul perfect, dezvoltat pentru a atinge acest scop. Acest protocol este recomandat ศi de consorศiul W3C, care este organismul de conducere pentru toate standardele web.
- SOAP este un protocol uศor care este utilizat pentru schimbul de date รฎntre aplicaศii. Notaศi cuvรขntul cheie 'uศoarฤรntrucรขt programarea SOAP se bazeazฤ pe limbajul XML, care รฎn sine este un limbaj uศor de schimb de date, prin urmare, ศi SOAP ca protocol se รฎncadreazฤ รฎn aceeaศi categorie.
- SOAP este conceput sฤ fie independent de platformฤ ศi, de asemenea, sฤ fie independent de sistemul de operare. Astfel, protocolul SOAP poate funcศiona cu orice aplicaศii bazate pe limbaj de programare, atรขt pe Windows ศi Linux platforme.
- Funcศioneazฤ pe protocolul HTTP โ SOAP funcศioneazฤ pe protocolul HTTP, care este protocolul implicit utilizat de toate aplicaศiile web. Prin urmare, nu este necesarฤ nicio personalizare pentru a rula serviciile web construite pe protocolul SOAP pentru a funcศiona pe World Wide Web.
Blocuri de construcศie SOAP
Specificaศia SOAP defineศte ceva cunoscut sub numele de โmesaj SOAPโ, care este trimis serviciului web ศi aplicaศiei client.โ
Diagrama de mai jos a arhitecturii SOAP aratฤ diferitele blocuri ale unui mesaj SOAP.
Mesajul SOAP nu este altceva decรขt un simplu document XML care are componentele de mai jos.
- An Plic element care identificฤ documentul XML ca mesaj SOAP โ Aceasta este partea care conศine mesajul SOAP ศi este utilizatฤ pentru a รฎncapsula toate detaliile din mesajul SOAP. Acesta este elementul rฤdฤcinฤ din mesajul SOAP.
- A Antet element care conศine informaศii din antet โ Elementul antet poate conศine informaศii precum acreditฤrile de autentificare, care pot fi utilizate de aplicaศia apelantฤ. De asemenea, poate conศine definiศia tipurilor complexe care ar putea fi utilizate รฎn mesajul SOAP. รn mod implicit, mesajul SOAP poate conศine parametri care pot fi de tipuri simple, cum ar fi ศiruri de caractere ศi numere, dar pot fi ศi un tip de obiect complex.
Un exemplu simplu de serviciu SOAP de tip complex este prezentat mai jos. Sฤ presupunem cฤ dorim sฤ trimitem un tip de date structurat care are o combinaศie รฎntre โNume Tutorialโ ศi โNume Tutorialโ. Descriptionโ, atunci am defini tipul complex aศa cum se aratฤ mai jos. Tipul complex este definit de eticheta elementului Toate elementele necesare ale structurii, รฎmpreunฤ cu tipurile lor de date respective, sunt apoi definite รฎn colecศia de tipuri complexe.
<xsd:complexType> <xsd:sequence> <xsd:element name="Tutorial Name" type="string"/> <xsd:element name="Tutorial Description" type="string"/> </xsd:sequence> </xsd:complexType>
A Corp magazin mobil element care conศine informaศii despre apel ศi rฤspuns โ Acest element conศine datele efective care trebuie trimise รฎntre serviciul web ศi aplicaศia apelantฤ. Mai jos este un exemplu de serviciu web SOAP al corpului SOAP care funcศioneazฤ efectiv pe tipul complex definit รฎn secศiunea antetului. Iatฤ rฤspunsul la Numele tutorialului ศi la Tutorial. Description care este trimis cฤtre aplicaศia de apelare care apeleazฤ acest serviciu web.
<soap:Body> <GetTutorialInfo> <TutorialName>Web Services</TutorialName> <TutorialDescription>All about web services</TutorialDescription> </GetTutorialInfo> </soap:Body>
Structura mesajelor SOAP
Un lucru de remarcat este cฤ mesajele SOAP sunt รฎn mod normal generate automat de serviciul web atunci cรขnd este apelat.
Ori de cรขte ori o aplicaศie client apeleazฤ o metodฤ รฎn serviciul web, serviciul web va genera automat un mesaj SOAP care va avea detaliile necesare ale datelor care vor fi trimise de la serviciul web cฤtre aplicaศia client.
Aศa cum s-a discutat รฎn subiectul anterior al acestui tutorial SOAP, un mesaj SOAP simplu are urmฤtoarele elemente:
- Elementul Plic
- Elementul antet ศi
- Elementul corpului
- Elementul de eroare (Opศional)
Sฤ luฤm mai jos un exemplu de mesaj SOAP simplu ศi sฤ vedem ce face de fapt fiecare element.

- Dupฤ cum se vede din mesajul SOAP de mai sus, prima parte a mesajului SOAP este elementul plic care este folosit pentru a รฎncapsula รฎntregul mesaj SOAP.
- Urmฤtorul element este corpul SOAP care conศine detaliile mesajului real.
- Mesajul nostru conศine un serviciu web numit โGuruโ99WebServiceโ.
- "Guruโ99Webserviceโ acceptฤ un parametru de tipul โintโ ศi are numele TutorialID.
Acum, mesajul SOAP de mai sus va fi transmis รฎntre serviciul web ศi aplicaศia client.
Puteศi vedea cรขt de utile sunt informaศiile de mai sus pentru aplicaศia client. Mesajul SOAP รฎi spune aplicaศiei client numele serviciului web, parametrii pe care รฎi aศteaptฤ ศi tipul fiecฤrui parametru preluat de serviciul web.
Element plic SOAP
Primul bit al blocului de construcศie este plicul SOAP.
Plicul SOAP este folosit pentru a รฎncapsula toate detaliile necesare ale mesajelor SOAP, care sunt schimbate รฎntre serviciul web ศi aplicaศia client.
Elementul plic SOAP este folosit pentru a indica รฎnceputul ศi sfรขrศitul unui mesaj SOAP. Acest lucru permite aplicaศiei client care apeleazฤ serviciul web sฤ ศtie cรขnd se terminฤ mesajul SOAP.
Urmฤtoarele puncte pot fi notate pe elementul plic SOAP.
- Fiecare mesaj SOAP trebuie sฤ aibฤ un element rฤdฤcinฤ Envelope. Este absolut obligatoriu ca un mesaj SOAP sฤ aibฤ un element envelope.
- Fiecare element Plic trebuie sฤ aibฤ cel puศin un element de corp de sฤpun.
- Dacฤ un element Envelope conศine un element antet, acesta trebuie sฤ conศinฤ cel mult unul ศi trebuie sฤ aparฤ ca primul copil al Plicului, รฎnaintea elementului body.
- Plicul se schimbฤ cรขnd versiunile SOAP se schimbฤ.
- Un procesor SOAP compatibil cu v1.1 genereazฤ o eroare la primirea unui mesaj care conศine spaศiul de nume plic v1.2.
- Un procesor SOAP compatibil cu v1.2 genereazฤ o eroare Version Mismatch dacฤ primeศte un mesaj care nu include spaศiul de nume al plicului v1.2.
Mai jos este un exemplu de API SOAP pentru versiunea 1.2 a elementului SOAP envelope.
<?xml version="1.0"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2001/12/soap-envelope" SOAP-ENV:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body> <Guru99WebService xmlns="http://tempuri.org/"> <TutorialID>int</TutorialID> </Guru99WebService> </soap:Body> </SOAP-ENV:Envelope>
Mesajul de eroare
Cรขnd se face o cerere cฤtre un serviciu web SOAP, rฤspunsul returnat poate fi de douฤ forme: un rฤspuns de succes sau un rฤspuns de eroare. Cรขnd se genereazฤ un succes, rฤspunsul de la server va fi รฎntotdeauna un mesaj SOAP. Dar dacฤ se genereazฤ erori SOAP, acestea sunt returnate ca erori โHTTP 500โ.
Mesajul SOAP Fault constฤ din urmฤtoarele elemente.
- <faultCode> โ Acesta este codul care desemneazฤ codul erorii. Codul de eroare poate avea oricare dintre valorile de mai jos:
- SOAP-ENV:VersionMismatch โ Acesta este momentul รฎn care este รฎntรขlnit un spaศiu de nume nevalid pentru elementul SOAP Envelope.
- SOAP-ENV:MustUnderstand โ Un element copil imediat al elementului Header, cu atributul mustUnderstand setat la โ1โ, nu a fost รฎnศeles.
- SOAP-ENV:Client โ โโMesajul a fost format incorect sau conศinea informaศii incorecte.
- SOAP-ENV:Server โ A apฤrut o problemฤ cu serverul, aศa cฤ mesajul nu a putut continua.
- โ Acesta este mesajul text care oferฤ o descriere detaliatฤ a erorii.
- (Opศional) โ Acesta este un ศir de text care indicฤ cine a cauzat defecศiunea.
- (Opศional) โ Acesta este elementul pentru mesajele de eroare specifice aplicaศiei. Deci, aplicaศia ar putea avea un mesaj de eroare specific pentru diferite scenarii logice de afaceri.
Exemplu pentru mesajul de eroare
Un exemplu de mesaj de eroare este prezentat mai jos. Eroarea este generatฤ รฎn scenariul รฎn care clientul รฎncearcฤ sฤ utilizeze o metodฤ numitฤ TutorialID din clasa GetTutorial. Mesajul de eroare de mai jos este generat รฎn cazul รฎn care metoda nu existฤ รฎn clasa definitฤ.
<?xml version='1.0' encoding='UTF-8'?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode xsi:type="xsd:string">SOAP-ENV:Client</faultcode> <faultstring xsi:type="xsd:string"> Failed to locate method (GetTutorialID) in class (GetTutorial) </faultstring> </SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
ieศire:
Cรขnd executaศi codul de mai sus, va afiศa eroarea de genul โEศuat la localizarea metodei (GetTutorialID) รฎn clasa (GetTutorial)โ.
Modelul de comunicare SOAP
Toatฤ comunicarea prin SOAP se face prin protocolul HTTP. รnainte de SOAP, o mulศime de servicii web a folosit stilul standard RPC (Remote Procedure Call) pentru comunicare. Acesta era cel mai simplu tip de comunicare, dar avea multe limitฤri.
Acum, รฎn acest tutorial SOAP API, sฤ luฤm รฎn considerare diagrama de mai jos pentru a vedea cum funcศioneazฤ aceastฤ comunicare. รn acest exemplu, sฤ presupunem cฤ serverul gฤzduieศte un serviciu web care oferฤ 2 metode, ศi anume:
- GetEmployee โ Aceasta ar obศine toate detaliile angajaศilor.
- SetEmployee โ Aceasta ar stabili รฎn consecinศฤ valoarea detaliilor precum departamentul, salariul etc. al unui angajat.
รn comunicarea normalฤ รฎn stil RPC, clientul ar apela doar metodele din cererea sa ศi ar trimite parametrii necesari cฤtre server, iar serverul ar trimite apoi rฤspunsul dorit.
Modelul de comunicare menศionat mai sus are urmฤtoarele limitฤri serioase:
- Nu independent de limbฤ โ Serverul care gฤzduieศte metodele ar fi รฎntr-un anumit limbaj de programare, iar รฎn mod normal apelurile cฤtre server s-ar face doar รฎn acel limbaj de programare.
- Nu protocolul standard โ Cรขnd se efectueazฤ un apel cฤtre procedura de la distanศฤ, apelul nu este efectuat prin protocolul standard. Aceasta a fost o problemฤ, deoarece รฎn mare parte toate comunicฤrile pe web trebuiau fฤcute prin protocolul HTTP.
- firewall-uri โ Deoarece apelurile RPC nu trec prin protocolul normal, porturile separate trebuie sฤ fie deschise pe server pentru a permite clientului sฤ comunice cu serverul. รn mod normal, toate firewall-urile ar bloca acest tip de trafic ศi, รฎn general, era necesarฤ o mulศime de configuraศii pentru a se asigura cฤ acest tip de comunicare รฎntre client ศi server va funcศiona.
Pentru a depฤศi toate limitฤrile menศionate mai sus, SOAP ar utiliza apoi modelul de comunicare de mai jos.
- Clientul ar formata informaศiile referitoare la apelul procedurii ศi orice argumente รฎntr-un mesaj SOAP ศi le-ar trimite serverului ca parte a unei cereri HTTP. Acest proces de รฎncapsulare a datelor รฎntr-un mesaj SOAP era cunoscut sub numele de Marshalling.
- Serverul ar despacheta apoi mesajul trimis de client, ar vedea ce a solicitat clientul ศi apoi ar trimite rฤspunsul corespunzฤtor รฎnapoi clientului sub formฤ de mesaj SOAP. Practica despachetฤriiping O cerere trimisฤ de client este cunoscutฤ sub numele de Demarshalling.
Exemplu practic de SAPUN
Acum รฎn asta SoapUI รn acest tutorial, haideศi sฤ vedem un exemplu practic SOAP. Probabil una dintre cele mai bune metode de a vedea cum sunt generate mesajele SOAP este sฤ vedem un serviciu web รฎn acศiune.
Acest subiect va analiza utilizarea Microsoft.Net framework pentru a construi un serviciu web ASMX. Acest tip de serviciu web acceptฤ atรขt versiunea SOAP 1.1, cรขt ศi versiunea 1.2.
Serviciile web ASMX genereazฤ automat Limbajul de definire a serviciului web (WSDL) document. Acest document WSDL este solicitat de aplicaศia client care apeleazฤ, astfel รฎncรขt aplicaศia sฤ ศtie ce este capabil sฤ facฤ serviciul web.
รn exemplul nostru, vom crea un serviciu web simplu, care va fi utilizat pentru a returna un ศir de caractere aplicaศiei care apeleazฤ serviciul web. Acest serviciu web va fi gฤzduit รฎntr-un Asp.Net aplicatie web. Apoi vom invoca serviciul web ศi vom vedea rezultatul care este returnat de serviciul web.
Visual Studio ne va arฤta, de asemenea, care este mesajul SOAP transmis รฎntre serviciul web ศi aplicaศia apelantฤ. Prima condiศie prealabilฤ pentru configurarea aplicaศiei noastre de serviciu web poate fi รฎndeplinitฤ urmรขnd paศii de mai jos. Asiguraศi-vฤ cฤ aveศi Visual Studio 2013 instalat pe sistemul dvs. pentru acest exemplu.
Pas 1) Primul pas este sฤ creaศi o aplicaศie web ASP.Net goalฤ. Din Visual Studio 2013, faceศi clic pe opศiunea de meniu Fiศier->Proiect nou.
Odatฤ ce faceศi clic pe opศiunea Proiect nou, Visual Studio vฤ va oferi apoi o altฤ casetฤ de dialog pentru a alege tipul de proiect ศi pentru a oferi detaliile necesare ale proiectului. Acest lucru este explicat รฎn pasul urmฤtor.
Pas 2) รn aceastฤ etapฤ,
- Asiguraศi-vฤ cฤ alegeศi mai รฎntรขi C# ศablon web al aplicaศiei web ASP.NET. Proiectul trebuie sฤ fie de acest tip pentru a crea un proiect de servicii SOAP. Alegรขnd aceastฤ opศiune, Visual Studio va efectua apoi paศii necesari pentru a adฤuga fiศierele necesare oricฤrei aplicaศii web.
- Daศi un nume proiectului dvs., care รฎn cazul nostru a fost webservice.asmx. Apoi asiguraศi-vฤ cฤ specificaศi o locaศie unde vor fi stocate fiศierele proiectului.
Dupฤ ce aศi terminat, veศi vedea fiศierul de proiect creat รฎn exploratorul de soluศii din Visual Studio 2013.
Pas 3) รn acest pas, vom adฤuga un fiศier de serviciu Web la proiectul nostru.
- Mai รฎntรขi, faceศi clic dreapta pe fiศierul proiectului, aศa cum se aratฤ mai jos.
- Dupฤ ce faceศi clic dreapta pe fiศierul proiectului, aveศi posibilitatea de a alege opศiunea โAdฤugare->Serviciu Web (ASMX)โ pentru a adฤuga un fiศier de serviciu web. Trebuie doar sฤ furnizaศi numele Serviciului Tutorial pentru fiศierul cu numele serviciului web.
Pas 4) Adฤugaศi urmฤtorul cod รฎn fiศierul asmx al serviciului de instruire.
Code Explicaลฃie:
- Aceastฤ linie de cod oferฤ un nume pentru fiศierul serviciului dvs. web. Acesta este un pas important, deoarece permite aplicaศiei client sฤ apeleze serviciul web prin numele serviciului web.
- รn mod normal, un fiศier de clasฤ este utilizat pentru a รฎncapsula funcศionalitatea unui serviciu web. Deci fiศierul de clasฤ va avea definiศia tuturor metodelor web care vor oferi anumite funcศionalitฤศi aplicaศiei client.
- Aici [WebMethod] este cunoscut ca un atribut care descrie o funcศie. Pasul urmฤtor creeazฤ o funcศie numitฤ โGuru99WebServiceโ, dar odatฤ cu includerea acestui pas de adฤugare a unui atribut [WebMethod], se asigurฤ cฤ aceastฤ metodฤ poate fi invocatฤ de o aplicaศie client. Dacฤ acest atribut nu este prezent, atunci metoda nu poate fi niciodatฤ apelatฤ de o aplicaศie client.
- Aici definim o funcศie numitฤ 'Guru99WebService', care va fi utilizatฤ pentru a returna un ศir de caractere aplicaศiei client apelante. Aceastฤ funcศie este un serviciu web care poate fi apelat de orice aplicaศie client.
- Folosim instrucศiunea return pentru a returna ศirul de caractere โAcesta este un Guru99โ serviciu Web cฤtre aplicaศia client.
Dacฤ codul este executat cu succes, urmฤtoarea ieศire va fi afiศatฤ atunci cรขnd rulaศi codul รฎn browser.
ieศire:
- Rezultatul aratฤ clar cฤ numele serviciului nostru web este โGuru99 Web Serviceโ, care este rezultatul acordฤrii unui nume serviciului nostru web.
- De asemenea, putem vedea cฤ putem invoca serviciul web. Dacฤ facem clic pe butonul Invoke (Invocare), vom primi rฤspunsul de mai jos รฎn browserul web.
Rezultatul de mai sus:
- Aratฤ clar cฤ prin invocarea metodei web, ศirul โAcesta este un GuruSe returneazฤ โ99 Web serviceโ.
- De asemenea, Visual Studio vฤ permite sฤ vizualizaศi solicitarea mesajului SOAP ศi rฤspunsul care este generat atunci cรขnd este apelat serviciul web de mai sus.
Solicitarea SOAP care este generatฤ atunci cรขnd este apelat serviciul web este prezentatฤ mai jos.
Code Explicaลฃie:
- Prima parte a mesajului SOAP este elementul anvelopฤ, care a fost discutat รฎn capitolele anterioare. Acesta este elementul de รฎncapsulare prezent รฎn fiecare mesaj SOAP.
- Corpul SOAP este urmฤtorul element ศi conศine detaliile reale ale mesajului SOAP.
- A treia parte este elementul care specificฤ faptul cฤ dorim sฤ apelฤm serviciul numit โGuru99WebService'.
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soap:Body> <Guru99WebServiceResponse xmlns="http://tempuri.org/"> <Guru99WebServiceResult>string</Guru99WebServiceResult> </Guru99WebServiceResponse> </soap:Body> </soap:Envelope>
Code Explicaลฃie:
- Prima parte a mesajului SOAP este elementul anvelopฤ, care a fost discutat รฎn capitolele anterioare. Acesta este elementul de รฎncapsulare prezent รฎn fiecare mesaj SOAP.
- Corpul SOAP este urmฤtorul element ศi conศine detaliile reale ale mesajului SOAP.
- Partea interesantฤ pe care o veศi vedea acum este atributul โstringโ. Acesta รฎi spune aplicaศiei client cฤ serviciul web apelat returneazฤ un obiect de tip ศir. Acest lucru este foarte util, deoarece altfel aplicaศia client nu ar ศti ce returneazฤ serviciul web.














