WORDS
Webb-api:er: Soap
Ett api definierar ett gränssnitt för användning av ett bibliotek eller tjänst i en applikation. Ett webb-api definierar ett sådant api, som kan användas med webbtekniker.
Två tekniker - närapå modeord? - som brukar nämnas är Soap och Rest. Dessa kan man alltså använda för att skapa ett webb-api, men hur, och vad innebär begreppen? Finns ytterligare alternativ?
På sätt och vis är dessa tekniker varandras motpoler. Soap är stort, komplicerat, standardiserat och ganska automatiserat, medan Rest är mycket mindre, enklare och kräver mer manuell handpåläggning. I det här inlägget beskriver jag översiktligt Soap.
På den tiden då XML skulle användas för alla nya standarder, skapades också Soap. Såsom Soap ofta används idag, består det av två delar:
- Tjänstekontraktet, som beskriver vilka anrop som kan göras, och vilken data som skickas som input och vilken som kan komma ut som output. Allt detta är skrivet med standarden "Wsdl" (uttalat whizz dell, på svenska kanske vissdell).
- Meddelandet för både ett anrop och ett svar består av tre delar: ett "envelope" (kuvert) som innehåller en header och en body.
Det faktum att tjänstekontraktet, Wsdl:en, är en komplett beskrivning av webb-api:et, gör att det går lätt att automatisera integrationer av detta. T.ex. i .Net-världen kan man enkelt både skapa ett Soap-api och konsumera ett.
Exempelmeddelande
Ett Soap-anrop, snott från Wikipedia:
POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 296
SOAPAction: "http://www.w3.org/2003/05/soap-envelope"
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:m="http://www.example.org">
<soap:Header>
</soap:Header>
<soap:Body>
<m:GetStockPrice>
<m:StockName>GOOG</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>
Svaret skulle kunna se ut såhär:
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: 309
<?xml version = "1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" xmlns:m="http://www.example.org">
<soap:Header>
</soap:Header>
<soap:Body>
<m:GetStockPriceResponse>
<m:Price>1145.99</m:Price>
</m:GetStockPriceResponse>
</soap:Body>
</soap:Envelope>
I .Net
För att skapa ett Soap-api med .Net, så skapar man en vanlig klass och anger med några attribut vilka metoder som ska vara tillgängliga i via Soap. Microsoft använder aldrig ordet "Soap", men det är det som skapas när man använder WCF för webb-api:er.
För att konsumera ett Soap-api med .Net, så lägger man till en servicereferens till en Wsdl, och så skapar Visual Studio automatiskt upp all klisterkod som behövs. För att sedan anropa api:et i exemplet ovan, så är detta allt som krävs:
decimal result = stockService.GetStockPrice("GOOG");
Mer
Det finns ett verktyg för att snabbt testa Soap-anrop: Soap UI.
Men en helt annan approach är att använda Rest, som jag ska beskriva i mitt nästa inlägg.