Il SOAP Encoding di un messaggio viene impostato tramite l’attributo SOAP-ENV:encodingStyle, specificato nell’elemento SOAP-ENV:Envelope.
Nell’attributo encodingStyle avremo:
- Se intendiamo usare il SOAP Encoding 1.1 il valore http://schemas.xmlsoap.org/soap/encoding/
- Se intendiamo usare il SOAP Encoding 1.2 il valore http://www.w3.org/2001/12/soap-encoding
I tipi di dati SOAP si dividono in due grandi categorie: i tipi semplici (o scalari) ed i tipi composti (anche detti compound).
SOAP-ENCODING DI TIPI SEMPLICI
I tipi semplici contengono esattamente un valore, come ad esempio il cognome, il prezzo, o la descrizione del prodotto, essi vengono serializzati all’interno di un elemento detto accessor del valore. Di seguito si riepilogano i principali tipi semplici, tale tabella è stata estrapolata dalla guida dei tipi XML del W3C.
TIPO SEMPLICE | ESEMPIO |
---|---|
string | “example” |
boolean | true, false, 1, 0 |
double | -INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN |
decimal | -1.23, 0, 123.4, 1000.00 |
month | 1999-05 |
year | 1999 |
century | 19 |
timeDuration | P1Y2M3DT10H30M12.3S |
binary | 100010 |
uriReference | http://www.example.com/doc.html#ID5 |
language | en-GB, en-US, fr |
NMTOKEN | US |
NMTOKENS | US UK |
QName | po:Address |
integer | -126789, -1, 0, 1, 126789 |
nonPositiveInteger | -126789, -1, 0 |
negativeInteger | -126789, -1 |
long | -1, 12678967543233 |
int | -1, 126789675 |
short | -1, 12678 |
byte | -1, 126 |
nonNegativeInteger | 0, 1, 126789 |
unsignedLong | 0, 12678967543233 |
unsignedInt | 0, 1267896754 |
unsignedShort | 0, 12678 |
unsignedByte | 0, 126 |
positiveInteger | 1, 126789 |
date | 1999-05-31, —05 |
time | 13:20:00.000, 13:20:00.000-05:00 |
In questi messaggi il tipo semplice è specificato nell’attributo xsi:type (proveniente dal namespace http://www.w3.org/1999/XMLSchema-instance) sempre specificato nell’elemento SOAP-ENV:Envelope.
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd:="http://www.w3.org/1999/XMLSchema"> <SOAP-ENV:Body> <m:SayHelloTo xmlns:m="https://www.gianlucadivincenzo.it/helloworld"> <name xsi:type="xsd:string">Gianluca</name> </m:SayHelloTo> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
Il corpo del messaggio SOAP in questo caso possiede un solo valore, accessibile tramite l’accessor name.
SOAP-ENCODING DI TIPI COMPOSTI
Particolari strutture dati possono prevedere più accessor in questo caso effettueremo una distinzione tra serializzazione di strutture e serializzazione di arrays.SOAP ENCODING DI STRUTTURE
Una struttura dati in SOAP è codificata mediante un elemento che a sua volta contiene altri elementi nidificati, che sono gli accessor dei singoli membri della struttura. Gli accessor dei singoli membri sono sempre locali e non possono essere puntati dall’esterno.Di seguito si riporta un codice di esempio per la serializzazione di una struttura.
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <e:Book xmlns:e="https://www.gianlucadivincenzo.it/book"> <author>Gianluca Di Vincenzo</author> <intro>Questa è una struttura con due membri.</intro> </e:Book> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
dove la struttura è definita nel Namespace XML https://www.gianlucadivincenzo.it/book che possiede il seguente complexType.
<element name="Book"> <complexType> <element name="author" type="xsd:string"/> <element name="intro" type="xsd:string"/> </complexType> </element> |
E’ possibile anche serializzare più strutture che prevedono dei puntatori, tale tipologia di soap encoding è detta multi-reference.
SOAP ENCODING DI ARRAYS
Il SOAP Encoding fornisce anche un elemento Array, che può essere usato per la serializzazione di matrici e di vettori.
Le istanze di un elemento di tipo Array devono contenere l’attributo arrayType che specifica il tipo degli elementi dell’Array.
Ad esempio, il seguente attributo specifica un array di 10 valori double:
arrayType="xsd:double[10]" |
mentre quì si mostra un esempio di una matrice di double:
arrayType="xsd:string[5,5]" |
Infine per completare la trattazione si propone la serializzazione di un messaggio che prevede al suo interno una matrice (o anche detto array multidimensionale).
<p:Persona> <nome>Gianluca Di Vincenzo</nome> <phoneNumbers SOAP-ENC:arrayType="p:phoneNumber[2,2]"> <phoneNumber>Home - Phone</phoneNumber> <phoneNumber>Home - Fax</phoneNumber> <phoneNumber>Office - Phone</phoneNumber> <phoneNumber>Office - Fax</phoneNumber> </phoneNumbers> </p:Persona> |
dove nel Namespace XML è definito il complexType Persona.
<element name="ArrayOfPhoneNumbers"> <complexType> <element name="phoneNumber" type="phoneNumber" maxOccurs="unbounded" /> </complexType> <anyAttribute/> </element> <element name="Persona"> <complexType> <element name="nome" type="string"/> <element name="phoneNumbers" type="ArrayOfPhoneNumbers" /> </complexType> </element> |