- SOAP oznacza P rotocol Simple Object Access
- SOAP jest protokołem komunikacji aplikacji
- SOAP jest formatem do wysyłania i odbierania wiadomości
- SOAP jest niezależny od platformy
- SOAP jest oparty na XML
- SOAP jest rekomendacją W3C
Dlaczego SOAP?
Ważne jest dla aplikacji internetowych, aby móc komunikować się przez Internet.
Najlepszym sposobem komunikowania się między aplikacjami jest przez HTTP, ponieważ HTTP jest obsługiwana przez wszystkie przeglądarki internetowe i serwery. SOAP został stworzony, aby tego dokonać.
SOAP to sposób komunikowania się pomiędzy aplikacjami do działających na różnych systemach operacyjnych, z różnych technologii i języków programowania.
SOAP Building Blocks
Komunikat SOAP jest zwykłym dokumentem XML zawierający następujące elementy:
- Element Koperta identyfikujący dokument XML jako komunikat SOAP
- Element nagłówek, który zawiera informacje nagłówka
- Element ciała, który zawiera informacje na połączenia i odpowiedzi
- Element Fault zawierających błędów i informacje o statusie
Wszystkie powyższe elementy są deklarowane w domyślnej przestrzeni nazw do koperty SOAP:
http://www.w3.org/2003/05/soap-envelope/
a domyślna przestrzeń nazw dla kodowania SOAP i typów danych jest:
http://www.w3.org/2003/05/soap-encoding
Zasady składni
Oto kilka ważnych zasad składni:
- Komunikat SOAP muszą być zakodowane za pomocą XML
- Komunikat SOAP muszą używać nazw SOAP Envelope
- Komunikat SOAP muszą używać nazw SOAP Kodowanie
- Komunikat SOAP nie może zawierać odniesienie DTD
- Komunikat SOAP nie może zawierać instrukcje przetwarzania XML
Szkielet SOAP Message
<?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>
Koperta Element SOAP
Wymagana elementem SOAP Koperta jest element główny komunikatu SOAP. Ten element definiuje dokument XML jako wiadomość 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ło
Zauważ xmlns: nazw mydła w powyższym przykładzie. Należy zawsze mieć wartość: "http://www.w3.org/2003/05/soap-envelope/" .
Przestrzeń nazw określa kopertę kopercie SOAP.
Jeśli jest używana inna przestrzeń nazw, aplikacja generuje błąd i odrzuca wiadomość.
encodingStyle Atrybut
encodingStyle atrybut jest używany do definiowania typów danych używanych w dokumencie. Ten atrybut może pojawić się na dowolnym elemencie SOAP, i odnosi się do zawartości elementu i wszystkich elementów podrzędnych.
Komunikat SOAP 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>
SOAP Header Element
Opcjonalne SOAP Header zawiera informacje specyficzne dla aplikacji (like authentication, payment, etc) o komunikacie SOAP.
Jeśli element nagłówka jest obecny, to musi być pierwszym elementem podrzędnym elementu kopert.
Note: Wszystkie bezpośrednie elementy podrzędne elementu nagłówka musi nazw kwalifikacjach.
<?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="http://www.w3ii.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
Powyższy przykład zawiera nagłówek z "Trans" elementu, a "mustUnderstand" atrybutu o wartości 1, a wartość 234.
SOAP definiuje trzy atrybuty w domyślnej przestrzeni nazw. Atrybuty te są następujące: mustUnderstand, aktor i encodingStyle.
Atrybuty zdefiniowane w nagłówku SOAP definiuje jak odbiorca powinien przetwarzać komunikat SOAP.
mustUnderstand Atrybut
Atrybut SOAP mustUnderstand mogą być wykorzystane do wskazania, czy wpis w nagłówku jest obowiązkowe lub opcjonalne dla odbiorcy przetwarzać.
Jeśli dodać mustUnderstand = "1" do elementu podrzędnego elementu nagłówka oznacza to, że odbiornik przetwarzania nagłówka musi rozpoznać element. Jeśli odbiornik nie rozpoznaje elementu nie powiedzie się podczas przetwarzania nagłówku.
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="http://www.w3ii.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
actor Atrybut
Komunikat SOAP mogą przemieszczać się z nadajnika do odbiornika poprzez przepuszczenie różne punkty końcowe na drodze komunikatów. Jednakże, nie wszystkie części wiadomości Mydło może być przeznaczony do ostatecznego końcowego, zamiast tego, może być przeznaczone do jednego lub więcej punktów końcowych na ścieżce komunikatów.
Atrybut SOAP aktor służy do adresowania elementu nagłówka 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="http://www.w3ii.com/transaction/"
soap:actor="http://www.w3ii.com/appml/">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
encodingStyle Atrybut
encodingStyle atrybut jest używany do definiowania typów danych używanych w dokumencie. Ten atrybut może pojawić się na dowolnym elemencie SOAP i będzie stosować się do treści tego elementu i wszystkich elementów podrzędnych.
Komunikat SOAP ma domyślnego kodowania.
Składnia
soap:encodingStyle="URI"
SOAP ciała Element
Wymagana elementem mydło do ciała zawiera rzeczywisty komunikat SOAP przeznaczony do ostatecznego punktu końcowego komunikatu.
Natychmiastowe elementy podrzędne elementu mydło do ciała może być kwalifikowana 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="http://www.w3ii.com/prices">
<m:Item>Apples</m:Item>
</m:GetPrice>
</soap:Body>
</soap:Envelope>
Powyższy przykład żąda cenę jabłek. Zauważmy, że m: getPrice a elementy Element powyżej elementy specyficzne dla aplikacji. Nie są one częścią nazw SOAP.
Odpowiedź SOAP mógłby wyglądać następująco:
<?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="http://www.w3ii.com/prices">
<m:Price>1.90</m:Price>
</m:GetPriceResponse>
</soap:Body>
</soap:Envelope>
SOAP Fault Element
Opcjonalne SOAP Fault jest używany do wskazywania komunikatów o błędach.
Element SOAP Fault posiada błędy i informacje o stanie dla wiadomości SOAP.
Jeśli element Błąd występuje, musi pojawić się jako element potomny elementu nadwozia. Element Błąd może pojawić się tylko raz w komunikacie SOAP.
Element SOAP Fault zawiera następujące elementy podrzędne:
sub Element | Opis |
---|---|
<faultcode> | Kod identyfikacji usterki |
<faultstring> | Ludzka czytelne wyjaśnienie winy |
<faultactor> | Informacje o tym, kto spowodował awarię się zdarzyć |
<detail> | Mieści aplikacji specyficzne informacje o błędach związanych z elementu body |
Kody błędów SOAP
Wartości faultcode zdefiniowane poniżej mogą być wykorzystywane w elemencie faultcode opisując wady:
Błąd | Opis |
---|---|
VersionMismatch | Znaleziono nieprawidłowy nazw dla elementu SOAP Envelope |
MustUnderstand | Natychmiastowe element podrzędny elementu Nagłówek z mustUnderstand atrybut wartość "1" , nie było zrozumiałe |
Client | Wiadomość została nieprawidłowo uformowane lub zawierały nieprawdziwe informacje |
Server | Wystąpił problem z serwerem, więc wiadomość nie może kontynuować |
Protokół HTTP
HTTP komunikuje się przez TCP / IP. Klient HTTP łączy się z serwerem HTTP przy użyciu protokołu TCP. Po ustanowieniu połączenia, klient może wysłać komunikat żądania HTTP do serwera:
POST /item HTTP/1.1
Host: 189.123.255.239
Content-Type: text/plain
Content-Length: 200
Następnie serwer przetwarza żądanie i wysyła odpowiedź HTTP z powrotem do klienta. Odpowiedź zawiera kod stanu wskazującą status wniosku:
200 OK
Content-Type: text/plain
Content-Length: 200
W powyższym przykładzie, serwer zwrócił kod statusu 200. Jest to standardowy kod sukces HTTP.
Jeśli serwer nie mógł zdekodować żądanie, może to powróciło coś takiego:
400 Bad Request
Content-Length: 0
SOAP Binding
Specyfikacja SOAP określa strukturę komunikatów SOAP, a nie jak są one wymieniane. Lukę tę wypełnia to, co nazywa "SOAP Bindings" . Wiązania SOAP są mechanizmy, które pozwalają komunikatów SOAP być efektywnie przesyłane za pomocą protokołu transportowego.
Większość implementacji SOAP dostarczają powiązania dla wspólnych protokołów transportowych, takich jak HTTP lub SMTP.
HTTP jest synchroniczne i powszechnie stosowane. Żądanie HTTP SOAP określa co najmniej dwa nagłówki http: Content-Type i Content-Length.
SMTP jest asynchroniczna i jest stosowany w ostateczności lub szczególnych przypadkach.
Implementacje Java mydła zwykle stanowią specyficzne wiązanie do JMS (Java Messaging System) protokołu.
Typ zawartości
Nagłówek Content-Type na żądanie i odpowiedź SOAP określa typ MIME dla wiadomości i kodowanie znaków (optional) stosowanego do ciała 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
Content-Length
Nagłówek Content-Length dla żądania SOAP i odpowiedzi 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ło
W poniższym przykładzie, żądanie GetStockPrice jest wysyłany do serwera. Wniosek ma parametr StockName oraz parametr cenowy, który zostanie zwrócony w odpowiedzi. Przestrzeń nazw dla 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>