Sapone XML
- SOAP sta per Simple O bject A ccess P rotocol
- SOAP è un protocollo di comunicazione dell'applicazione
- SOAP è un formato per inviare e ricevere messaggi
- SOAP è indipendente dalla piattaforma
- SOAP è basato su XML
- SOAP è una raccomandazione del W3C
Perché SAPONE?
È importante che le applicazioni Web siano in grado di comunicare su Internet.
Il modo migliore per comunicare tra le applicazioni è tramite HTTP, poiché HTTP è supportato da tutti i browser e server Internet. SOAP è stato creato per raggiungere questo obiettivo.
SOAP fornisce un modo per comunicare tra applicazioni in esecuzione su diversi sistemi operativi, con diverse tecnologie e linguaggi di programmazione.
Blocchi di costruzione del SAPONE
Un messaggio SOAP è un normale documento XML contenente i seguenti elementi:
- Un elemento Envelope che identifica il documento XML come messaggio SOAP
- Un elemento Header che contiene informazioni sull'intestazione
- Un elemento Body che contiene informazioni sulla chiamata e sulla risposta
- Un elemento Fault contenente errori e informazioni sullo stato
Tutti gli elementi sopra sono dichiarati nello spazio dei nomi predefinito per la busta SOAP:
http://www.w3.org/2003/05/soap-envelope/
e lo spazio dei nomi predefinito per la codifica SOAP e i tipi di dati è:
http://www.w3.org/2003/05/soap-encoding
Regole di sintassi
Ecco alcune importanti regole di sintassi:
- Un messaggio SOAP DEVE essere codificato utilizzando XML
- Un messaggio SOAP DEVE utilizzare lo spazio dei nomi SOAP Envelope
- Un messaggio SOAP NON deve contenere un riferimento DTD
- Un messaggio SOAP NON deve contenere istruzioni di elaborazione XML
Messaggio di sapone scheletro
<?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>
L'elemento busta SOAP
L'elemento SOAP Envelope richiesto è l'elemento radice di un messaggio SOAP. Questo elemento definisce il documento XML come un messaggio SOAP.
Esempio
<?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>
Lo spazio dei nomi xmlns:soap
Notare lo spazio dei nomi xmlns:soap nell'esempio sopra. Dovrebbe sempre avere il valore di: "http://www.w3.org/2003/05/soap-envelope/".
Lo spazio dei nomi definisce la busta come busta SOAP.
Se viene utilizzato uno spazio dei nomi diverso, l'applicazione genera un errore ed elimina il messaggio.
L'attributo encodingStyle
L'attributo encodingStyle viene utilizzato per definire i tipi di dati utilizzati nel documento. Questo attributo può apparire su qualsiasi elemento SOAP e si applica al contenuto dell'elemento ea tutti gli elementi figlio.
Un messaggio SOAP non ha una codifica predefinita.
Sintassi
soap:encodingStyle="URI"
Esempio
<?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>
L'elemento di intestazione SOAP
L'elemento opzionale SOAP Header contiene informazioni specifiche dell'applicazione (come autenticazione, pagamento, ecc.) sul messaggio SOAP.
Se l'elemento Header è presente, deve essere il primo elemento figlio dell'elemento Envelope.
Nota: tutti gli elementi figlio immediati dell'elemento Header devono essere qualificati per lo spazio dei nomi.
<?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>
L'esempio sopra contiene un'intestazione con un elemento "Trans", un attributo "mustUnderstand" con un valore di 1 e un valore di 234.
SOAP definisce tre attributi nello spazio dei nomi predefinito. Questi attributi sono: mustUnderstand, attore e encodingStyle.
Gli attributi definiti nell'intestazione SOAP definiscono come un destinatario deve elaborare il messaggio SOAP.
L'attributo mustUnderstand
L'attributo SOAP mustUnderstand può essere utilizzato per indicare se una voce di intestazione è obbligatoria o facoltativa per l'elaborazione da parte del destinatario.
Se aggiungi mustUnderstand="1" a un elemento figlio dell'elemento Header, indica che il destinatario che elabora l'Header deve riconoscere l'elemento. Se il ricevitore non riconosce l'elemento fallirà durante l'elaborazione dell'intestazione.
Sintassi
soap:mustUnderstand="0|1"
Esempio
<?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>
L'attributo attore
Un messaggio SOAP può viaggiare da un mittente a un destinatario passando diversi endpoint lungo il percorso del messaggio. Tuttavia, non tutte le parti di un messaggio SOAP possono essere destinate all'endpoint finale, ma possono essere destinate a uno o più endpoint sul percorso del messaggio.
L'attributo attore SOAP viene utilizzato per indirizzare l'elemento Header a un endpoint specifico.
Sintassi
soap:actor="URI"
Esempio
<?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>
L'attributo encodingStyle
L'attributo encodingStyle viene utilizzato per definire i tipi di dati utilizzati nel documento. Questo attributo può apparire su qualsiasi elemento SOAP e si applicherà al contenuto di quell'elemento ea tutti gli elementi figlio.
Un messaggio SOAP non ha una codifica predefinita.
Sintassi
soap:encodingStyle="URI"
L'elemento del corpo SAPONE
L'elemento SOAP Body richiesto contiene il messaggio SOAP effettivo destinato all'endpoint finale del messaggio.
Gli elementi figlio immediati dell'elemento SOAP Body possono essere qualificati per lo spazio dei nomi.
Esempio
<?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>
L'esempio sopra richiede il prezzo delle mele. Si noti che gli elementi m:GetPrice e Item sopra sono elementi specifici dell'applicazione. Non fanno parte dello spazio dei nomi SOAP.
Una risposta SOAP potrebbe assomigliare a questa:
<?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>
L'elemento di errore del SOAP
L'elemento opzionale SOAP Fault viene utilizzato per indicare i messaggi di errore.
L'elemento SOAP Fault contiene gli errori e le informazioni sullo stato per un messaggio SOAP.
Se è presente un elemento Fault, deve apparire come elemento figlio dell'elemento Body. Un elemento Fault può apparire solo una volta in un messaggio SOAP.
L'elemento SOAP Fault ha i seguenti sottoelementi:
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 |
Codici di errore del SOAP
I valori del codice di errore definiti di seguito devono essere utilizzati nell'elemento codice di errore quando si descrivono i guasti:
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 |
Il protocollo HTTP
HTTP comunica su TCP/IP. Un client HTTP si connette a un server HTTP tramite TCP. Dopo aver stabilito una connessione, il client può inviare un messaggio di richiesta HTTP al server:
POST /item HTTP/1.1
Host: 189.123.255.239
Content-Type: text/plain
Content-Length: 200
Il server quindi elabora la richiesta e invia una risposta HTTP al client. La risposta contiene un codice di stato che indica lo stato della richiesta:
200 OK
Content-Type: text/plain
Content-Length: 200
Nell'esempio sopra, il server ha restituito un codice di stato di 200. Questo è il codice di successo standard per HTTP.
Se il server non è stato in grado di decodificare la richiesta, potrebbe aver restituito qualcosa del genere:
400 Bad Request
Content-Length: 0
Rilegatura del SAPONE
La specifica SOAP definisce la struttura dei messaggi SOAP, non il modo in cui vengono scambiati. Questa lacuna è colmata da ciò che viene chiamato "SOAP Bindings". I binding SOAP sono meccanismi che consentono di scambiare efficacemente i messaggi SOAP utilizzando un protocollo di trasporto.
La maggior parte delle implementazioni SOAP fornisce collegamenti per protocolli di trasporto comuni, come HTTP o SMTP.
HTTP è sincrono e ampiamente utilizzato. Una richiesta HTTP SOAP specifica almeno due intestazioni HTTP: Content-Type e Content-Length.
SMTP è asincrono e viene utilizzato in ultima istanza o in casi particolari.
Le implementazioni Java di SOAP di solito forniscono un'associazione specifica per il protocollo JMS (Java Messaging System).
Tipo di contenuto
L'intestazione Content-Type per una richiesta e una risposta SOAP definisce il tipo MIME per il messaggio e la codifica dei caratteri (opzionale) utilizzata per il corpo XML della richiesta o della risposta.
Sintassi
Content-Type: MIMEType; charset=character-encoding
Esempio
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Contenuto-lunghezza
L'intestazione Content-Length per una richiesta e una risposta SOAP specifica il numero di byte nel corpo della richiesta o della risposta.
Sintassi
Content-Length: bytes
Esempio
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250
Un esempio di sapone
Nell'esempio seguente, una richiesta GetStockPrice viene inviata a un server. La richiesta ha un parametro StockName e un parametro Price che verrà restituito nella risposta. Lo spazio dei nomi per la funzione è definito in "http://www.example.org/stock".
Una richiesta di SAPONE:
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>
La risposta di 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>