Mydło XML
- SOAP oznacza S imple Object Access Protocol _ _
- SOAP to protokół komunikacyjny aplikacji
- SOAP to format do wysyłania i odbierania wiadomości
- SOAP jest niezależny od platformy
- SOAP jest oparty na XML
- SOAP jest rekomendacją W3C
Dlaczego MYDŁO?
Ważne jest, aby aplikacje internetowe mogły komunikować się przez Internet.
Najlepszym sposobem komunikacji między aplikacjami jest HTTP, ponieważ HTTP jest obsługiwany przez wszystkie przeglądarki internetowe i serwery. SOAP został stworzony, aby to osiągnąć.
SOAP zapewnia sposób komunikacji między aplikacjami działającymi w różnych systemach operacyjnych, z różnymi technologiami i językami programowania.
Bloki konstrukcyjne SOAP
Komunikat SOAP to zwykły dokument XML zawierający następujące elementy:
- Element Koperta, który identyfikuje dokument XML jako wiadomość SOAP
- Element Header, który zawiera informacje nagłówka
- Element Body zawierający informacje o wezwaniach i odpowiedziach
- Element Fault zawierający informacje o błędach i statusie
Wszystkie powyższe elementy są zadeklarowane w domyślnej przestrzeni nazw dla koperty SOAP:
http://www.w3.org/2003/05/koperta-mydlana/
a domyślna przestrzeń nazw dla kodowania SOAP i typów danych to:
http://www.w3.org/2003/05/soap-encoding
Zasady składni
Oto kilka ważnych zasad składni:
- Wiadomość SOAP MUSI być zakodowana przy użyciu XML
- Wiadomość SOAP MUSI używać przestrzeni nazw SOAP Envelope
- Wiadomość SOAP NIE może zawierać odniesienia do DTD
- Wiadomość SOAP NIE może zawierać instrukcji przetwarzania XML
Szkielet SOAP Wiadomość
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
...
</soap:Header>
<soap:Body>
...
<soap:Fault>
...
</soap:Fault>
</soap:Body>
</soap:Envelope>
Element koperty z mydłem
Wymagany element Koperta SOAP jest elementem głównym komunikatu SOAP. Ten element definiuje dokument XML jako komunikat SOAP.
Przykład
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
...
Message information goes here
...
</soap:Envelope>
xmlns:przestrzeń nazw mydła
Zwróć uwagę na przestrzeń nazw xmlns:soap w powyższym przykładzie. Powinien zawsze mieć wartość: „http://www.w3.org/2003/05/soap-envelope/”.
Przestrzeń nazw definiuje kopertę jako kopertę SOAP.
Jeśli używana jest inna przestrzeń nazw, aplikacja generuje błąd i odrzuca komunikat.
Atrybut kodowaniaStyle
Atrybut kodowanieStyle służy do definiowania typów danych używanych w dokumencie. Ten atrybut może pojawić się w dowolnym elemencie SOAP i dotyczy zawartości elementu oraz wszystkich elementów podrzędnych.
Komunikat SOAP nie ma domyślnego kodowania.
Składnia
soap:encodingStyle="URI"
Przykład
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
...
Message information goes here
...
</soap:Envelope>
Element nagłówka SOAP
Opcjonalny element SOAP Header zawiera informacje specyficzne dla aplikacji (takie jak uwierzytelnianie, płatność itp.) dotyczące komunikatu SOAP.
Jeśli element Header jest obecny, musi to być pierwszy element podrzędny elementu Envelope.
Uwaga: Wszystkie bezpośrednie elementy podrzędne elementu Header muszą być kwalifikowane w przestrzeni nazw.
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.w3schools.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
Powyższy przykład zawiera nagłówek z elementem „Trans”, atrybutem „mustUnderstand” o wartości 1 i wartości 234.
SOAP definiuje trzy atrybuty w domyślnej przestrzeni nazw. Te atrybuty to: mustUnderstand, aktor i encodingStyle.
Atrybuty zdefiniowane w nagłówku SOAP określają, jak odbiorca powinien przetwarzać komunikat SOAP.
Atrybut musi zrozumieć
Atrybut SOAP mustUnderstand może służyć do wskazania, czy wpis nagłówka jest obowiązkowy, czy opcjonalny dla odbiorcy do przetworzenia.
Jeśli dodasz mustUnderstand="1" do elementu podrzędnego elementu Header, oznacza to, że odbiorca przetwarzający Header musi rozpoznać element. Jeśli odbiornik nie rozpozna elementu, nie powiedzie się podczas przetwarzania nagłówka.
Składnia
soap:mustUnderstand="0|1"
Przykład
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.w3schools.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
Aktor Atrybut
Komunikat SOAP może podróżować od nadawcy do odbiorcy, przekazując różne punkty końcowe na ścieżce komunikatu. Jednak nie wszystkie części komunikatu SOAP mogą być przeznaczone dla ostatecznego punktu końcowego, zamiast tego mogą być przeznaczone dla jednego lub większej liczby punktów końcowych na ścieżce komunikatu.
Atrybut aktor SOAP służy do adresowania elementu Header do określonego punktu końcowego.
Składnia
soap:actor="URI"
Przykład
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.w3schools.com/transaction/"
soap:actor="https://www.w3schools.com/code/">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
Atrybut kodowaniaStyle
Atrybut kodowanieStyle służy do definiowania typów danych używanych w dokumencie. Ten atrybut może pojawić się w dowolnym elemencie SOAP i będzie miał zastosowanie do zawartości tego elementu oraz wszystkich elementów podrzędnych.
Komunikat SOAP nie ma domyślnego kodowania.
Składnia
soap:encodingStyle="URI"
Mydło Body Element
Wymagany element treści SOAP zawiera rzeczywisty komunikat SOAP przeznaczony dla ostatecznego punktu końcowego komunikatu.
Bezpośrednie elementy podrzędne elementu treści SOAP mogą być kwalifikowane w przestrzeni nazw.
Przykład
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<m:GetPrice xmlns:m="https://www.w3schools.com/prices">
<m:Item>Apples</m:Item>
</m:GetPrice>
</soap:Body>
</soap:Envelope>
Powyższy przykład żąda ceny jabłek. Zauważ, że elementy m:GetPrice i Item powyżej są elementami specyficznymi dla aplikacji. Nie są częścią przestrzeni nazw SOAP.
Odpowiedź SOAP może wyglądać mniej więcej tak:
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<m:GetPriceResponse xmlns:m="https://www.w3schools.com/prices">
<m:Price>1.90</m:Price>
</m:GetPriceResponse>
</soap:Body>
</soap:Envelope>
Element błędu SOAP
Opcjonalny element SOAP Fault służy do wskazywania komunikatów o błędach.
Element SOAP Fault zawiera informacje o błędach i stanie dla komunikatu SOAP.
Jeśli element Fault jest obecny, musi pojawić się jako element podrzędny elementu Body. Element Fault może pojawić się tylko raz w komunikacie SOAP.
Element SOAP Fault ma następujące elementy podrzędne:
Sub Element | Description |
---|---|
<faultcode> | A code for identifying the fault |
<faultstring> | A human readable explanation of the fault |
<faultactor> | Information about who caused the fault to happen |
<detail> |
Holds application specific error information related to the Body element |
Kody błędów SOAP
Wartości kodu błędu zdefiniowane poniżej muszą być używane w elemencie kodu błędu podczas opisywania błędów:
Error | Description |
---|---|
VersionMismatch | Found an invalid namespace for the SOAP Envelope element |
MustUnderstand | An immediate child element of the Header element, with the mustUnderstand attribute set to "1", was not understood |
Client | The message was incorrectly formed or contained incorrect information |
Server | There was a problem with the server so the message could not proceed |
Protokół HTTP
HTTP komunikuje się przez TCP/IP. Klient HTTP łączy się z serwerem HTTP za pomocą protokołu TCP. Po nawiązaniu połączenia klient może wysłać do serwera komunikat żądania HTTP:
POST /item HTTP/1.1
Host: 189.123.255.239
Content-Type: text/plain
Content-Length: 200
Serwer następnie przetwarza żądanie i wysyła odpowiedź HTTP z powrotem do klienta. Odpowiedź zawiera kod statusu, który wskazuje status żądania:
200 OK
Content-Type: text/plain
Content-Length: 200
W powyższym przykładzie serwer zwrócił kod stanu 200. Jest to standardowy kod sukcesu dla HTTP.
Jeśli serwer nie mógł zdekodować żądania, mógł zwrócić coś takiego:
400 Bad Request
Content-Length: 0
Wiązanie SOAP
Specyfikacja SOAP definiuje strukturę komunikatów SOAP, a nie sposób ich wymiany. Tę lukę wypełniają tzw. „wiązania SOAP”. Powiązania SOAP to mechanizmy, które umożliwiają efektywną wymianę komunikatów SOAP za pomocą protokołu transportowego.
Większość implementacji protokołu SOAP zapewnia powiązania dla popularnych protokołów transportowych, takich jak HTTP lub SMTP.
HTTP jest synchroniczny i szeroko stosowany. Żądanie SOAP HTTP określa co najmniej dwa nagłówki HTTP: Content-Type i Content-Length.
SMTP jest asynchroniczny i jest używany w ostateczności lub w szczególnych przypadkach.
Implementacje protokołu SOAP w języku Java zwykle zapewniają określone powiązanie dla protokołu JMS (Java Messaging System).
Typ zawartości
Nagłówek Content-Type żądania i odpowiedzi SOAP definiuje typ MIME wiadomości i kodowanie znaków (opcjonalnie) używane w treści XML żądania lub odpowiedzi.
Składnia
Content-Type: MIMEType; charset=character-encoding
Przykład
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Długość treści
Nagłówek Content-Length dla żądania i odpowiedzi SOAP określa liczbę bajtów w treści żądania lub odpowiedzi.
Składnia
Content-Length: bytes
Przykład
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250
Przykład mydła
W poniższym przykładzie żądanie GetStockPrice jest wysyłane do serwera. Żądanie zawiera parametr StockName oraz parametr Price, który zostanie zwrócony w odpowiedzi. Przestrzeń nazw funkcji jest zdefiniowana w „http://www.example.org/stock”.
Żądanie SOAP:
POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body xmlns:m="http://www.example.org/stock">
<m:GetStockPrice>
<m:StockName>IBM</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>
Odpowiedź SOAP:
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body xmlns:m="http://www.example.org/stock">
<m:GetStockPriceResponse>
<m:Price>34.5</m:Price>
</m:GetStockPriceResponse>
</soap:Body>
</soap:Envelope>