SOAP Web Services-vejledning: Hvad er SOAP-protokollen?
โก Smart opsummering
SOAP (Simple Object Access Protocol) er en XML-baseret protokol til adgang til webtjenester via HTTP. Denne ressource forklarer SOAP-byggesten, meddelelsesstruktur, envelope- og fault-elementerne, kommunikationsmodellen og et praktisk eksempel pรฅ ASMX-webtjenester.
Hvad er SOAP?
SOAP er en XML-baseret protokol til adgang til webtjenester via HTTP. Den har nogle specifikationer, der kan bruges pรฅ tvรฆrs af alle applikationer.
SOAP er kendt som Simple Object Access Protocol, men blev senere forkortet til SOAP v1.2. SOAP er en protokol eller, med andre ord, en definition af, hvordan webtjenester kommunikerer med hinanden eller kommunikerer med klientapplikationer, der aktiverer dem.
SOAP blev udviklet som et mellemsprog, sรฅ applikationer bygget pรฅ forskellige programmeringssprog nemt kunne tale med hinanden og undgรฅ den ekstreme udviklingsindsats.
SรBE introduktion
I dagens verden findes der et enormt antal applikationer, der er bygget pรฅ forskellige programmeringssprog. For eksempel kunne der vรฆre en webapplikation designet i Java, en anden i .Net, og en anden i PHP.
Udveksling af data mellem applikationer er afgรธrende i dagens netvรฆrksverden. Men dataudveksling mellem disse heterogene applikationer ville vรฆre kompleks. Det vil ogsรฅ vรฆre kompleksiteten af โโkoden for at opnรฅ denne dataudveksling.
En af de metoder, der bruges til at bekรฆmpe denne kompleksitet, er at bruge XML (Extensible Markup Language) som mellemsprog til udveksling af data mellem applikationer.
Ethvert programmeringssprog kan forstรฅ XML markup sproget. Derfor blev XML brugt som det underliggende medium til dataudveksling.
Men der er ingen standardspecifikationer for brugen af โโXML pรฅ tvรฆrs af alle programmeringssprog til dataudveksling. Det er her, SOAP-software kommer ind i billedet.
SOAP er designet til at arbejde med XML over HTTP og har en slags specifikation, som kan bruges pรฅ tvรฆrs af alle applikationer. Vi vil se nรฆrmere pรฅ detaljerne om SOAP-protokollen i de efterfรธlgende kapitler.
Fordele ved SOAP
SOAP er den protokol, der bruges til dataudveksling mellem applikationer. Nedenfor er nogle af grundene til, hvorfor SOAP bruges.
- Nรฅr udvikletping SOAP-baserede webtjenester, du skal bruge et sprog, som webtjenester kan bruge til at kommunikere med klientapplikationer. SOAP er det perfekte medie, der blev udviklet til at opnรฅ dette formรฅl. Denne protokol anbefales ogsรฅ af W3C-konsortiet, som er det styrende organ for alle webstandarder.
- SOAP er en letvรฆgtsprotokol, der bruges til dataudveksling mellem applikationer. Bemรฆrk nรธgleordet 'lysDa SOAP-programmering er baseret pรฅ XML-sproget, som i sig selv er et letvรฆgtssprog til dataudveksling, falder SOAP som protokol ogsรฅ i samme kategori.
- SOAP er designet til at vรฆre platformuafhรฆngig og er ogsรฅ designet til at vรฆre operativsystemuafhรฆngig. Sรฅ SOAP-protokollen kan fungere med alle programmeringssprogsbaserede applikationer pรฅ begge Windows og Linux platforme.
- Det fungerer pรฅ HTTP-protokollen โ SOAP fungerer pรฅ HTTP-protokollen, som er standardprotokollen, der bruges af alle webapplikationer. Derfor er der ingen form for tilpasning, der krรฆves for at kรธre webtjenesterne, der er bygget pรฅ SOAP-protokollen, sรฅ de fungerer pรฅ World Wide Web.
SรBE byggeklodser
SOAP-specifikationen definerer noget kendt som en "SOAP besked", som er det, der sendes til webtjenesten og klientapplikationen.
Nedenstรฅende diagram over SOAP-arkitektur viser de forskellige byggesten i en SOAP-meddelelse.
SOAP-meddelelsen er intet andet end blot et XML-dokument, som har nedenstรฅende komponenter.
- An Kuvert element, der identificerer XML-dokumentet som en SOAP-meddelelse โ Dette er den indeholdende del af SOAP-meddelelsen og bruges til at indkapsle alle detaljerne i SOAP-meddelelsen. Dette er rodelementet i SOAP-meddelelsen.
- A Header element, der indeholder headeroplysninger โ Headerelementet kan indeholde oplysninger sรฅsom godkendelsesoplysninger, som kan bruges af den kaldende applikation. Det kan ogsรฅ indeholde definitionen af โโkomplekse typer, der kan bruges i SOAP-meddelelsen. Som standard kan SOAP-meddelelsen indeholde parametre, der kan vรฆre af simple typer sรฅsom strenge og tal, men som ogsรฅ kan vรฆre en kompleks objekttype.
Et simpelt SOAP-serviceeksempel af en kompleks type er vist nedenfor. Antag, at vi รธnskede at sende en struktureret datatype, der havde en kombination af et "Tutorial Name" og et "Tutorial". Descriptionโ, sรฅ ville vi definere den komplekse type som vist nedenfor. Den komplekse type er defineret af elementtagget Alle de nรธdvendige elementer i strukturen sammen med deres respektive datatyper defineres derefter i den komplekse typesamling.
<xsd:complexType> <xsd:sequence> <xsd:element name="Tutorial Name" type="string"/> <xsd:element name="Tutorial Description" type="string"/> </xsd:sequence> </xsd:complexType>
A Fylde element, der indeholder oplysninger om opkald og svar โ Dette element indeholder de faktiske data, der skal sendes mellem webtjenesten og den kaldende applikation. Nedenfor er et SOAP-webtjenesteeksempel pรฅ SOAP-kroppen, der rent faktisk fungerer pรฅ den komplekse type, der er defineret i header-sektionen. Her er svaret fra Tutorial Name og Tutorial. Description, der sendes til den opkaldende applikation, som kalder denne webtjeneste.
<soap:Body> <GetTutorialInfo> <TutorialName>Web Services</TutorialName> <TutorialDescription>All about web services</TutorialDescription> </GetTutorialInfo> </soap:Body>
SOAP-meddelelsesstruktur
En ting at bemรฆrke er, at SOAP-beskeder normalt automatisk genereres af webtjenesten, nรฅr den kaldes.
Nรฅr en klientapplikation kalder en metode i webtjenesten, vil webtjenesten automatisk generere en SOAP-meddelelse, som vil have de nรธdvendige detaljer om de data, som vil blive sendt fra webtjenesten til klientapplikationen.
Som diskuteret i det forrige emne i denne SOAP-vejledning, har en simpel SOAP-meddelelse fรธlgende elementer:
- Konvolutelementet
- Header-elementet, og
- Kropselementet
- Fejlelementet (valgfrit)
Lad os se pรฅ et eksempel nedenfor pรฅ en simpel SOAP-besked og se, hvad hvert element rent faktisk gรธr.

- Som det ses af ovenstรฅende SOAP-meddelelse, er den fรธrste del af SOAP-meddelelsen kuvertelementet, som bruges til at indkapsle hele SOAP-meddelelsen.
- Det nรฆste element er SOAP-legemet, som indeholder detaljerne i den faktiske besked.
- Vores besked indeholder en webtjeneste med navnet "Guru99WebServiceโ.
- Den "Guru99Webserviceโ accepterer en parameter af typen 'int' og har navnet TutorialID.
Nu vil ovenstรฅende SOAP-meddelelse blive sendt mellem webtjenesten og klientapplikationen.
Du kan se, hvor nyttige ovenstรฅende oplysninger er for klientapplikationen. SOAP-meddelelsen fortรฆller klientapplikationen, hvad webtjenestens navn er, hvilke parametre den forventer, og hvilken type hver parameter er, som webtjenesten bruger.
Sรฆbekuvertelement
Den fรธrste del af byggestenen er SOAP Envelope.
SOAP-konvolutten bruges til at indkapsle alle de nรธdvendige detaljer om SOAP-meddelelserne, som udveksles mellem webservicen og klientapplikationen.
SOAP-kuvertelementet bruges til at angive begyndelsen og slutningen af โโen SOAP-meddelelse. Dette gรธr det muligt for klientapplikationen, der kalder webtjenesten, at vide, hvornรฅr SOAP-meddelelsen slutter.
Fรธlgende punkter kan noteres pรฅ SOAP-kuvertelementet.
- Hver SOAP-meddelelse skal have et rod-Envelope-element. Det er absolut obligatorisk for en SOAP-meddelelse at have et envelope-element.
- Hvert Envelope-element skal have mindst รฉt โโsรฆbeelement.
- Hvis et kuvertelement indeholder et overskriftselement, mรฅ det ikke indeholde mere end รฉt, og det skal vises som det fรธrste underordnede af konvolutten fรธr brรธdelementet.
- Konvolutten รฆndres, nรฅr SOAP-versionerne รฆndres.
- En v1.1-kompatibel SOAP-processor genererer en fejl ved modtagelse af en meddelelse, der indeholder v1.2-envelope-navneomrรฅdet.
- En v1.2-kompatibel SOAP-processor genererer en Version Mismatch-fejl, hvis den modtager en meddelelse, der ikke inkluderer v1.2-envelope-navneomrรฅdet.
Nedenfor er et SOAP API-eksempel pรฅ version 1.2 af SOAP-envelope-elementet.
<?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>
Fejlmeddelelsen
Nรฅr en anmodning sendes til en SOAP-webtjeneste, kan det returnerede svar have to former: et vellykket svar eller et fejlsvar. Nรฅr der genereres et vellykket svar, vil svaret fra serveren altid vรฆre en SOAP-meddelelse. Men hvis der genereres SOAP-fejl, returneres de som "HTTP 500"-fejl.
SOAP-fejlmeddelelsen bestรฅr af fรธlgende elementer.
- <faultCode> โ Dette er koden, der angiver fejlkoden. Fejlkoden kan vรฆre en af โโfรธlgende vรฆrdier:
- SOAP-ENV:VersionMismatch โ Dette er, nรฅr et ugyldigt navneomrรฅde for SOAP Envelope-elementet stรธdes pรฅ.
- SOAP-ENV:MustUnderstand โ Et umiddelbart underordnet element af Header-elementet, med mustUnderstand-attributten sat til "1", blev ikke forstรฅet.
- SOAP-ENV:Client โ โโMeddelelsen var forkert udformet eller indeholdt forkerte oplysninger.
- SOAP-ENV:Server โ Der var et problem med serveren, sรฅ beskeden kunne ikke fortsรฆtte.
- โ Dette er tekstmeddelelsen, der giver en detaljeret beskrivelse af fejlen.
- (Valgfri) โ Dette er en tekststreng, der angiver, hvem der har forรฅrsaget fejlen.
- (Valgfri) โ Dette er elementet for applikationsspecifikke fejlmeddelelser. Sรฅ applikationen kunne have en specifik fejlmeddelelse for forskellige forretningslogiske scenarier.
Eksempel pรฅ fejlmeddelelse
Et eksempel pรฅ en fejlmeddelelse er givet nedenfor. Fejlen genereres i det scenarie, hvor klienten forsรธger at bruge en metode kaldet TutorialID i klassen GetTutorial. Nedenstรฅende fejlmeddelelse genereres, hvis metoden ikke findes i den definerede klasse.
<?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>
Output:
Nรฅr du udfรธrer ovenstรฅende kode, vil den vise fejlen "Kunne ikke finde metoden (GetTutorialID) i klassen (GetTutorial)".
SOAP kommunikationsmodel
Al kommunikation via SOAP foregรฅr via HTTP-protokollen. Forud for SOAP, en masse webservices brugt standard RPC (Remote Procedure Call) stil til kommunikation. Dette var den enkleste form for kommunikation, men den havde mange begrรฆnsninger.
I denne SOAP API-tutorial vil vi se pรฅ nedenstรฅende diagram for at se, hvordan denne kommunikation fungerer. I dette eksempel antager vi, at serveren er vรฆrt for en webtjeneste, der tilbyder to metoder som:
- Fรฅ medarbejder โ Dette ville indhente alle medarbejderoplysninger.
- Sรฆt medarbejder โ Dette ville indstille vรฆrdien af โโdetaljer som en medarbejders afdeling, lรธn osv. i overensstemmelse hermed.
I den normale RPC-stil kommunikation ville klienten blot kalde metoderne i sin anmodning og sende de nรธdvendige parametre til serveren, og serveren ville derefter sende det รธnskede svar.
Ovenstรฅende kommunikationsmodel har fรธlgende alvorlige begrรฆnsninger:
- Ikke sproguafhรฆngig โ Serveren, der er vรฆrt for metoderne, ville vรฆre i et bestemt programmeringssprog, og normalt ville kaldene til serveren kun vรฆre i det programmeringssprog.
- Ikke standardprotokollen โ Nรฅr der foretages et opkald til fjernproceduren, udfรธres opkaldet ikke via standardprotokollen. Dette var et problem, da stort set al kommunikation over nettet skulle ske via HTTP-protokollen.
- Firewalls โ Da RPC-opkald ikke gรฅr via den normale protokol, skal separate porte vรฆre รฅbne pรฅ serveren for at tillade klienten at kommunikere med serveren. Normalt ville alle firewalls blokere denne form for trafik, og en masse konfiguration var generelt pรฅkrรฆvet for at sikre, at denne form for kommunikation mellem klienten og serveren ville fungere.
For at overvinde alle de ovennรฆvnte begrรฆnsninger, ville SOAP derefter bruge nedenstรฅende kommunikationsmodel.
- Klienten ville formatere informationen vedrรธrende procedurekaldet og eventuelle argumenter i en SOAP-meddelelse og sende den til serveren som en del af en HTTP-anmodning. Denne proces med at indkapsle dataene i en SOAP-meddelelse var kendt som Marshalling.
- Serveren ville derefter udpakke den besked, som klienten sendte, se, hvad klienten anmodede om, og derefter sende det relevante svar tilbage til klienten som en SOAP-besked. Praksis med udpakningping en anmodning sendt af klienten kaldes Demarshalling.
Eksempel pรฅ praktisk SOAP
Nu i dette SoapUI I denne vejledning kan vi se et praktisk SOAP-eksempel. En af de bedste mรฅder at se, hvordan SOAP-meddelelser genereres, er nok at se en webtjeneste i aktion.
Dette emne vil se pรฅ brugen af Microsoft.Net framework til at bygge en ASMX webservice. Denne type webservice understรธtter bรฅde SOAP version 1.1 og version 1.2.
ASMX webtjenester genererer automatisk Web Service Definition Language (WSDL) dokument. Dette WSDL-dokument krรฆves af den kaldende klientapplikation, sรฅ applikationen ved, hvad webtjenesten er i stand til at gรธre.
I vores eksempel skal vi oprette en simpel webtjeneste, som skal bruges til at returnere en streng til den applikation, der kalder webtjenesten. Denne webtjeneste vil blive hostet i en Asp.Net webapplikation. Vi vil derefter pรฅberรฅbe os webservicen og se resultatet, der returneres af webservicen.
Visual Studio viser os ogsรฅ, hvad SOAP-beskeden er, der sendes mellem webtjenesten og den kaldende applikation. Den fรธrste forudsรฆtning for at konfigurere vores webtjenesteapplikation kan gรธres ved at fรธlge nedenstรฅende trin. Sรธrg for, at du har Visual Studio 2013 installeret pรฅ dit system i dette eksempel.
Trin 1) Det fรธrste trin er at oprette en tom ASP.Net webapplikation. Fra Visual Studio 2013 skal du klikke pรฅ menupunktet Filer->Nyt projekt.
Nรฅr du klikker pรฅ indstillingen Nyt projekt, giver Visual Studio dig en anden dialogboks til at vรฆlge projekttype og give de nรธdvendige detaljer om projektet. Dette forklares i nรฆste trin.
Trin 2) I dette trin,
- Sรธrg for fรธrst at vรฆlge C# Webskabelon til ASP.NET-webapplikation. Projektet skal vรฆre af denne type for at kunne oprette et SOAP-serviceprojekt. Ved at vรฆlge denne indstilling vil Visual Studio derefter udfรธre de nรธdvendige trin for at tilfรธje nรธdvendige filer, som enhver webbaseret applikation har brug for.
- Giv dit projekt et navn, som i vores tilfรฆlde er webservice.asmx. Sรธrg derefter for at angive en placering, hvor projektfilerne skal gemmes.
Nรฅr det er gjort, vil du se den projektfil, der er oprettet i din lรธsningsbrowser i Visual Studio 2013.
Trin 3) I dette trin vil vi tilfรธje en webservicefil til vores projekt.
- Hรธjreklik fรธrst pรฅ projektfilen som vist nedenfor.
- Nรฅr du hรธjreklikker pรฅ projektfilen, har du mulighed for at vรฆlge indstillingen "Tilfรธj->Webtjeneste (ASMX)" for at tilfรธje en webtjenestefil. Angiv blot navnet pรฅ Tutorial Service til webtjenestenavnfilen.
Trin 4) Tilfรธj fรธlgende kode til din Tutorial Service asmx-fil.
Code Forklaring:
- Denne kodelinje giver et navn til din webservicefil. Dette er et vigtigt skridt, fordi det giver mulighed for, at klientapplikationen ringer til webtjenesten via navnet pรฅ webtjenesten.
- Normalt bruges en klassefil til at indkapsle funktionaliteten af โโen webtjeneste. Sรฅ klassefilen vil have definitionen af โโalle webmetoder, som vil give en vis funktionalitet til klientapplikationen.
- Her er [WebMethod] kendt som en attribut, der beskriver en funktion. Det efterfรธlgende trin opretter en funktion kaldet "Guru99WebServiceโ, men med inkluderingen af โโdette trin med at tilfรธje en [WebMethod]-attribut, sikrer det, at denne metode kan kaldes af en klientapplikation. Hvis denne attribut ikke er pรฅ plads, kan metoden aldrig kaldes af en klientapplikation.
- Her definerer vi en funktion kaldet 'Guru99WebService', som vil blive brugt til at returnere en streng til den kaldende klientapplikation. Denne funktion er en webtjeneste, der kan kaldes af enhver klientapplikation.
- Vi bruger return-sรฆtningen til at returnere strengen "Dette er en Guru99 Webtjenesteโ til klientapplikationen.
Hvis koden eksekveres med succes, vil fรธlgende output blive vist, nรฅr du kรธrer din kode i browseren.
Output:
- Outputtet viser tydeligt, at navnet pรฅ vores webtjeneste er "Guru99 Web Serviceโ, som er resultatet af at give vores webtjeneste et navn.
- Vi kan ogsรฅ se, at vi kan kalde webtjenesten. Hvis vi klikker pรฅ knappen "Invoke", fรฅr vi nedenstรฅende svar i webbrowseren.
Ovenstรฅende output:
- Det viser tydeligt, at ved at kalde web-metoden, bliver strengen "Dette er en Guru"99 Webtjeneste" returneres.
- Visual Studio giver dig ogsรฅ mulighed for at se SOAP-meddelelsesanmodningen og -svaret, som genereres, nรฅr ovenstรฅende webservice kaldes.
SOAP-anmodningen, som genereres, nรฅr webtjenesten kaldes, er vist nedenfor.
Code Forklaring:
- Den fรธrste del af SOAP-meddelelsen er envelope-elementet, som blev diskuteret i de foregรฅende kapitler. Dette er det indkapslende element, der findes i alle SOAP-meddelelser.
- SOAP Body er det nรฆste element og indeholder de faktiske detaljer om SOAP-meddelelsen.
- Den tredje del er det element, der specificerer, at vi vil kalde tjenesten, som kaldes '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 Forklaring:
- Den fรธrste del af SOAP-meddelelsen er envelope-elementet, som blev diskuteret i de foregรฅende kapitler. Dette er det indkapslende element, der findes i alle SOAP-meddelelser.
- SOAP Body er det nรฆste element og indeholder de faktiske detaljer om SOAP-meddelelsen.
- Den interessante del, du vil se nu, er attributten 'string'. Denne fortรฆller klientapplikationen, at den webtjeneste, der kaldes, returnerer et objekt af typen string. Dette er meget nyttigt, fordi klientapplikationen ellers ikke ville vide, hvad webtjenesten returnerer.














