SOAP
Introduction
SOAP
is a simple XML-based protocol to let applications exchange
information over HTTP.
Or
more simply: SOAP is a protocol for accessing a Web Service.
Why
SOAP?
It
is important for application development to allow Internet
communication between programs.
Today's
applications communicate using Remote Procedure Calls (RPC) between
objects like DCOM and CORBA. Since RPC represents a compatibility and
security problem, firewalls and proxy servers will normally block
this kind of traffic.
A
better way to communicate between applications is over HTTP, because
HTTP is supported by all Internet browsers and servers. SOAP was
created to accomplish this.
SOAP
Building Blocks
A
SOAP message is an ordinary XML document containing the following
elements:
An
Envelope element that identifies the XML document as a
SOAP message ( Mandatory )
A
Header element that contains header information ( Optional
)
A
Body element that contains call and response information (
Mandatory )
A
Fault element containing errors and status information (
Optional )
Syntax
Rules
-
A SOAP message MUST be encoded using XML
-
A SOAP message MUST use the SOAP Envelope namespace
-
A SOAP message MUST use the SOAP Encoding namespace
-
A SOAP message must NOT contain a DTD reference
-
A SOAP message must NOT contain XML Processing Instructions
SOAP
Message Structure
<?xml
version="1.0"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://www.w3.org/2001/12/soap-envelope"
SOAP-ENV:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<SOAP-ENV:Header>
...
</SOAP-ENV:Header>
<SOAP-ENV:Body>
...
...
<SOAP-ENV:Fault>
...
...
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP_ENV:Envelope>
SOAP
Envelope
Element
The
required SOAP Envelope element is the root element of a SOAP message.
This
element defines the XML document as a SOAP message.
<?xml
version="1.0"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://www.w3.org/2001/12/soap-envelope"
…..
</SOAP_ENV:Envelope>
xmlns
: soap Namespace
*
The value of the Namespace (xmlns
) should always "http://www.w3.org/2001/12/soap-envelope".
*
The namespace defines the Envelope as a SOAP Envelope.
*
If a different namespace is used, the application generates an error
and discards the message.
encodingStyle
: This attribute is used to define
the data types used in the document.
*
This attribute may appear on any SOAP element, and applies to the
element's contents and all child elements.
*
A SOAP message has no default encoding.
Syntax
- encodingStyle="URI"
SOAP
Header Element
The
optional SOAP Header element contains application-specific
information (like authentication, payment, etc) about the SOAP
message.
*
If the Header element is present, it must be the first child element
of the Envelope element.
<soap:Header>
<m:Trans
xmlns:m="http://www.w3.org/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
SOAP
defines three attributes in the default namespace
("http://www.w3.org/2001/12/soap-envelope"). These
attributes are:
1.
mustUnderstand
2.
actor
3.
encodingStyle.
*
The attributes defined in the SOAP Header defines how a recipient
should process the SOAP message.
1.
mustUnderstand Attribute
The
SOAP mustUnderstand attribute can be used to indicate whether
a header entry is mandatory or optional
for the recipient to process.
Syntax
soap : mustUnderstand="0|1"
2.
actor Attribute
The
SOAP actor attribute is used to address
the Header element to a specific endpoint.
Syntax
soap : actor="URI"
ex
-
<soap:Header>
<m:Trans
xmlns:m="http://www.w3schools.com/transaction/"
soap:actor="http://www.w3schools.com/appml/">234
</m:Trans>
</soap:Header>
3.
encodingStyle Attribute
This
is used to define the data types
used in the document.
This
attribute may appear on any SOAP element, and it will apply to that
element's contents and all child elements.
A
SOAP message has no default encoding.
Syntax :
soap : encodingStyle="URI"
SOAP
Body Element
The
required SOAP Body element contains the actual SOAP message intended
for the ultimate endpoint of the message.
Immediate
child elements of the SOAP Body element may be namespace-qualified.
Ex
-
<?xml
version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body>
<m:GetPrice
xmlns:m="http://www.w3schools.com/prices">
<m:Item>Apples</m:Item>
</m:GetPrice>
</soap:Body>
</soap:Envelope>
The
example above requests the price of apples. Note that the m:GetPrice
and the Item elements above are application-specific elements. They
are not a part of the SOAP namespace.
A
SOAP response could look something like this:
<?xml
version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body>
<m:GetPriceResponse
xmlns:m="http://www.w3schools.com/prices">
<m:Price>1.90</m:Price>
</m:GetPriceResponse>
</soap:Body>
</soap:Envelope>
SOAP
Fault
Element
The
SOAP Fault element holds errors and
status information for a SOAP
message.
The
optional SOAP Fault element is used to indicate error messages.
If
a Fault element is present, it must appear as a child element of the
Body element.
A
Fault element can only appear once in a SOAP message.
The
SOAP Fault element has the following sub
elements:
<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
SOAP
Fault Codes -
The
faultcode values defined below must be used in the faultcode element
when describing faults:
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
SOAP
HTTP Binding
A
SOAP method is an HTTP request/response that complies with the SOAP
encoding rules.
HTTP
+ XML = SOAP
*
A SOAP request could be an HTTP POST or an HTTP GET request.
*
The HTTP POST request specifies at least two HTTP headers:
-
Content-Type
-
Content-Length
Content-Type
The
Content-Type header for a SOAP request and response defines the MIME
type for the message and the character encoding (optional) used for
the XML body of the request or response.
Syntax
: Content-Type:
MIMEType; charset=character-encoding
Example
:
POST
/item HTTP/1.1
Content-Type:
application/soap+xml; charset=utf-8
Content-Length
The
Content-Length header for a SOAP request and response specifies the
number of bytes in the body of the request or response.
Syntax
: Content-Length:
bytes
Example
:
POST
/item HTTP/1.1
Content-Type:
application/soap+xml; charset=utf-8
Content-Length:
250