- Published on
SOAP API - základy
Úvod
V tomto článku si vysvětlíme, co je to SOAP API, jak funguje, jaká je jeho struktura a jak se liší od přístupu REST API.
Přidáme i příklady SOAP zpráv, WSDL souboru a porovnáme volání SOAP a REST na stejném scénáři.
Co je SOAP API
SOAP (Simple Object Access Protocol) je protokol pro výměnu dat mezi systémy, který využívá XML jako formát zprávy.
Typicky běží přes HTTP nebo HTTPS, ale může využívat i jiné transportní protokoly (SMTP, JMS apod.).
SOAP se používá hlavně tam, kde je potřeba:
- Striktní formální popis služby (WSDL)
- Silná typová kontrola (XSD schémata)
- Pokročilá bezpečnost (WS-Security)
- Enterprise integrace (banky, pojišťovny, telco…)
Struktura SOAP zprávy
SOAP zpráva má jasně definované části:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<!-- Nepovinné: metadata, autentizace, WS-Security tokeny -->
</soap:Header>
<soap:Body>
<!-- Vlastní obsah zprávy -->
<GetUserDetails xmlns="http://example.com/user">
<UserId>123</UserId>
</GetUserDetails>
</soap:Body>
</soap:Envelope>
Hlavní části:
- Envelope – obálka celé zprávy
- Header – volitelné metadata (bezpečnost, routing)
- Body – samotná data nebo odpověď
- Fault – speciální formát pro chyby
WSDL – Definice služby
WSDL (Web Services Description Language) je XML dokument, který popisuje:
- strukturu požadavků a odpovědí
- datové typy (XSD schémata)
- adresu služby (endpoint)
- dostupné operace (metody)
Z WSDL lze automaticky generovat klienta v mnoha jazycích (Java, C#, Python…)
Struktura WSDL a význam oddílů
Každý WSDL dokument může obsahovat tyto hlavní oddíly:
| Oddíl | Účel |
|---|---|
<types> | Definuje datové typy pomocí XML Schema (XSD). |
<message> | Popisuje „balíček“ dat pro request a response – obsahuje odkazy na elementy z <types>. |
<portType> | Definuje rozhraní služby – seznam operací, které služba poskytuje, a jejich vstupní/výstupní zprávy. |
<binding> | Určuje konkrétní způsob volání – protokol, formát zprávy a styl (např. document/literal). |
<service> | Určuje, kde služba běží – URL endpointu a konkrétní port. |
SOAP vs REST – Hlavní rozdíly
| Vlastnost | SOAP | REST |
|---|---|---|
| Protokol | Vlastní protokol (často HTTP) | Architektonický styl nad HTTP |
| Formát dat | XML | JSON, XML, YAML… |
| Popis služby | WSDL | OpenAPI (Swagger) – volitelný |
| Bezpečnost | WS-Security | HTTPS, OAuth2, JWT |
| Struktura | Pevná (Envelope, Header, Body) | Volná |
| Použití | Enterprise, banky, legacy systémy | Moderní web a mobilní aplikace |
Bezpečnost v SOAP
SOAP podporuje WS-Security, což může zahrnovat:
- podpis zpráv (XML Signature)
- šifrování (XML Encryption)
- tokeny (UsernameToken, SAML, Kerberos)
- časová razítka
To je zásadní rozdíl oproti REST, který většinou používá jednodušší autentizaci (OAuth2, JWT…). V SOAP je bezpečnost integrovaná přímo v samotné zprávě. Bezpečná komunikace je tak zajištěná i v případě, kdy zpráva putuje přes několik systémů.
Ukázka – stejné volání v SOAP a REST
SOAP request
POST /UserService HTTP/1.1
Host: api.example.com
Content-Type: text/xml; charset=utf-8
SOAPAction: "GetUserDetails"
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<auth:UsernameToken xmlns:auth="http://example.com/auth">
<auth:Username>test</auth:Username>
<auth:Password>secret</auth:Password>
</auth:UsernameToken>
</soap:Header>
<soap:Body>
<GetUserDetails xmlns="http://example.com/user">
<UserId>123</UserId>
</GetUserDetails>
</soap:Body>
</soap:Envelope>
SOAP response
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetUserDetailsResponse xmlns="http://example.com/user">
<User>
<Id>123</Id>
<Name>John Doe</Name>
<Email>john@example.com</Email>
</User>
</GetUserDetailsResponse>
</soap:Body>
</soap:Envelope>
REST request
GET /users/123 HTTP/1.1
Host: api.example.com
Authorization: Bearer eyJhbGciOi...
REST response
{
"id": 123,
"name": "John Doe",
"email": "john@example.com"
}
| Vlastnost | SOAP | REST |
|---|---|---|
| Protokol | Vlastní protokol (často HTTP) | Architektonický styl nad HTTP |
| Formát dat | XML | JSON, XML, YAML… |
🔍 Hlavní rozdíly v ukázce
| SOAP | REST | |
|---|---|---|
| Formát | XML s pevnou strukturou (Envelope, Header, Body) | JSON (nebo XML), volnější |
| Bezpečnost | Vložená do XML (WS-Security) | HTTP hlavičky (Bearer token, OAuth2) |
| Endpointy | Často jeden endpoint pro všechny metody | Každá operace má vlastní URL |
| Objem dat | Více dat navíc (namespace, tagy) | Stručné |
| Popis služby | WSDL | OpenAPI (Swagger) nebo bez |
Ukázkové WSDL
Tento příklad obsahuje metody:
GetUserDetailsDepositWithdraw
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://example.com/bank"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.com/bank">
<!-- Typy (XSD schéma) -->
<types>
<xsd:schema targetNamespace="http://example.com/bank">
<!-- GetUserDetails -->
<xsd:element name="GetUserDetails">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="UserId" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="GetUserDetailsResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="User">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Id" type="xsd:int"/>
<xsd:element name="Name" type="xsd:string"/>
<xsd:element name="Email" type="xsd:string"/>
<xsd:element name="Balance" type="xsd:decimal"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<!-- Deposit -->
<xsd:element name="Deposit">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="UserId" type="xsd:int"/>
<xsd:element name="Amount" type="xsd:decimal"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="DepositResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="NewBalance" type="xsd:decimal"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<!-- Withdraw -->
<xsd:element name="Withdraw">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="UserId" type="xsd:int"/>
<xsd:element name="Amount" type="xsd:decimal"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="WithdrawResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="NewBalance" type="xsd:decimal"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</types>
<!-- PortType – seznam operací -->
<portType name="BankServicePortType">
<operation name="GetUserDetails">
<input message="tns:GetUserDetailsRequest"/>
<output message="tns:GetUserDetailsResponse"/>
</operation>
<operation name="Deposit">
<input message="tns:DepositRequest"/>
<output message="tns:DepositResponse"/>
</operation>
<operation name="Withdraw">
<input message="tns:WithdrawRequest"/>
<output message="tns:WithdrawResponse"/>
</operation>
</portType>
<!-- Zprávy -->
<message name="GetUserDetailsRequest">
<part name="parameters" element="tns:GetUserDetails"/>
</message>
<message name="GetUserDetailsResponse">
<part name="parameters" element="tns:GetUserDetailsResponse"/>
</message>
<message name="DepositRequest">
<part name="parameters" element="tns:Deposit"/>
</message>
<message name="DepositResponse">
<part name="parameters" element="tns:DepositResponse"/>
</message>
<message name="WithdrawRequest">
<part name="parameters" element="tns:Withdraw"/>
</message>
<message name="WithdrawResponse">
<part name="parameters" element="tns:WithdrawResponse"/>
</message>
<!-- Binding – formát a protokol -->
<binding name="BankServiceBinding" type="tns:BankServicePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetUserDetails">
<soap:operation soapAction="http://example.com/bank/GetUserDetails"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
<operation name="Deposit">
<soap:operation soapAction="http://example.com/bank/Deposit"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
<operation name="Withdraw">
<soap:operation soapAction="http://example.com/bank/Withdraw"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<!-- Service – adresa služby -->
<service name="BankService">
<port name="BankServicePort" binding="tns:BankServiceBinding">
<soap:address location="https://api.example.com/BankService"/>
</port>
</service>
</definitions>
Shrnutí
- SOAP je striktně definovaný protokol pro výměnu dat (většinou XML) s pevnou strukturou a podporou WSDL.
- REST je architektonický styl nad HTTP, flexibilnější a jednodušší.
- SOAP se hodí pro enterprise prostředí s vysokými nároky na bezpečnost a standardizaci.
- REST se hodí pro moderní webová a mobilní API.

