0% found this document useful (0 votes)
65 views56 pages

SOAP II: Data Encoding: Marlon Pierce, Bryan Carpenter, Geoffrey Fox Community Grids Lab Indiana University

The document discusses SOAP data encoding. It describes how SOAP uses a graph-based abstract data model to represent data, with nodes and edges. This model is then encoded in XML for transmission. SOAP provides some encoding rules but does not require them. Simple values like strings and integers include an xsi:type attribute to specify their type. Arrays and structs are also supported, with arrays using position to distinguish elements and structs using element names. The encoding is designed to be general purpose and flexible.

Uploaded by

Farooq Mohammed
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
65 views56 pages

SOAP II: Data Encoding: Marlon Pierce, Bryan Carpenter, Geoffrey Fox Community Grids Lab Indiana University

The document discusses SOAP data encoding. It describes how SOAP uses a graph-based abstract data model to represent data, with nodes and edges. This model is then encoded in XML for transmission. SOAP provides some encoding rules but does not require them. Simple values like strings and integers include an xsi:type attribute to specify their type. Arrays and structs are also supported, with arrays using position to distinguish elements and structs using element names. The encoding is designed to be general purpose and flexible.

Uploaded by

Farooq Mohammed
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 56

SOAP II: Data Encoding

Marlon Pierce, Bryan Carpenter, Geoffrey Fox


Community Grids Lab
Indiana University
[email protected]
http://www.grid2004.org/spring2004
Review: SOAP Message Payloads
• SOAP has a very simple structure:
– Envelopes wrap body and optional header elements.
• SOAP body elements may contain any sort of XML
– Literally, use <any> wildcard to include other XML.
• SOAP does not provide specific encoding restrictions.
• Instead, provides conventions that you can follow for
different message styles.
– RPC is a common convention.
• Remember: SOAP designers were trying to design it to
be general purpose.
– SOAP encoding and data models are optional
SOAP Data Models
SOAP’s Abstract Data Model
• SOAP data may be optional
represented using Node-Edge
Graphs.
• Edges connect nodes
– Have a direction Node 1
– An edge is labeled with an
XML QName.
• A node may have 0 or more Edge
inbound and outbound edges.
• Implicitly, Node 2 describes
Node 1.
• A few other notes:
– Nodes may point to
themselves. Node 3 Node 2
– Nodes may have inbound
edges originating from more
than one Node.
Nodes and Values
• Nodes have values.
– Values may be either simple Node 1
(lexical) or compound.
• A simple value may be (for
example) a string.
– It has no outgoing edges
• A complex value is a node with Node 2
both inbound and outbound (complex)
edges.
• For example, Node 1 has a
value, Node 2, that is
structured.
• Complex values may be either Node 3 Node 4
structs or arrays.
Complex Types: Structs and Arrays
• A compound value is a graph node with zero or
more outbound edges.
• Outbound edges may be distinguished by either
labels or by position.
• Nodes may be one of two sorts:
– Struct: all outbound edges are distinguished solely by
labels.
– Array: all outbound edges are distinguished solely by
position order.
• Obviously we are zeroing in on programming
language data structures.
Abstract Data Models
• The SOAP Data Model is an abstract model
– Directed, labeled graph
• It will be expressed in XML.
• The graph model implies semantics about data
structures that are not in the XML itself.
– XML describes only syntax.
• Implicitly, nodes in the graph model resemble
nouns, while the edges represent predicates.
• We will revisit this in later lectures on the
Semantic Web.
Graphs to XML
• SOAP nodes and edges are not readily apparent
in simple XML encoding rules.
– Normally, an XML element in the SOAP body acts as
both the edge and the node of the abstract model.
• However, SOAP does have an internal
referencing system.
– Use it when pointing from one element to another.
– Here, the XML-to-graph correspondence is more
obvious.
SOAP Encoding
Intro: Encoding Conventions
• SOAP header and body tags <xs:element name="Body"
can be used to contain type="tns:Body" />
arbitrary XML <xs:complexType name="Body">
– Specifically, they can contain <xs:sequence>
an arbitrary sequence of tags,
replacing the <any> tag. <xs:any
– These tags from other namespace="##any"
schemas can contain child processContents="lax"
tags and be quite complex. minOccurs="0“
– See body definition on the maxOccurs="unbounded"
right. />
• And that’s all it specifies.   </xs:sequence>
• SOAP thus does not impose a   <xs:anyAttribute
content model. namespace="##other"
• Content models are defined by processContents="lax" />
convention and are optional. </xs:complexType>
Encoding Overview
• Data models such as the SOAP graph model are abstract.
– Represented as graphs.
• For transfer between client and server in a SOAP message, we
encode them in XML.
• We typically should provide encoding rules along with the message
so that the recipient knows how to process.
• SOAP provides some encoding rule definitions:
– http://schemas.xmlsoap.org/soap/encoding/
– But these rules are not required and must be explicitly included.
– Note this is NOT part of the SOAP message schema.
• Terminology:
– Serialization: transforming a model instance into an XML instance.
– Deserialization: transforming the XML back to the model.
Specifying Encoding
• Encoding is specified using the <soapenv:Body>
encodingStyle attribute. <ns1:echo
– This is optional soapenv:encodingStyle="http://
– There may be no encoding style schemas.xmlsoap.org/soap/enc
• This attribute can appear in the oding/"
envelope, body, or headers. xmlns:ns1=“…">
– The example from previous <!--
lecture puts it in the body.
The rest of the payload
– The value is the standard SOAP
encoding rules. -->
• Thus, each part may use different </soapenv:Body>
encoding rules.
– If present, the envelope has the
default value for the message.
– Headers and body elements may
override this within their scope.
Encoding Simple Values
• Our echo service exchanges strings. The actual
message is encoded like this:
– <in0 xsi:type="xsd:string">Hello World</in0>
• xsi:type means that <in0> will take string values.
– And string means explicitly xsd:string, or string from
the XML schema itself.
• In general, all encoded elements should provide
xsi:type elements to help the recipient decode
the message.
Simple Type Encoding Examples
Java examples SOAP Encoding
• int a=3; • <a xsi:type=“xsd:int”>
10
• float pi=3.14
</a>
• String s=“Hello”; • <pi xsi:type=“xsd:float”>
3.14
</pi>
• <s xsi:type=“xsd:string”>
Hello
</s>
Explanation of Simple Type
Encoding
• The XML snippets have two namespaces (would
be specified in the SOAP envelope typically).
– xsd: the XML schema. Provides definitions of
common simple types like floats, ints, and strings.
– xsi: the XML Schema Instance. Provides the
definition of the type element and its possible values.
• Basic rule: each element must be given a type
and a value.
– Types come from XSI, values from XSD.
• In general, all SOAP encoded values must have
a type.
XML Schema Instance
• A very simple supplemental XML schema that
provides only four attribute definitions.
• Type is used when an element needs to
explicitly define its type rather than implicitly,
through a schema.
– The value of xsi:type is a qualified name.
• This is needed when the schema may not be
available (in case of SOAP).
– May also be needed in schema inheritance
• See earlier XML schema lectures on “Polymorphism”
Example for Encoding Arrays in
SOAP 1.1
• Java Arrays
– int[3] myArray={23,10,32};

• Possible SOAP 1.1 Encoding:


<myArray xsi:type=“SOAP-ENC:Array
SOAP-ENC:arrayType=“xsd:int[3]”>
<v1>21</v1>
<v2>10</v2>
<v3>32</v3>
</myArray>
An Explanation
• We started out as before, mapping the Java
array name to an element and defining an
xsi:type.
• But there is no array in the XML schema data
definitions.
– XSD doesn’t preclude it, but it is a complex type to be
defined elsewhere.
– The SOAP encoding schema defines it.
• We also made use of the SOAP encoding
schema’s arrayType attribute to specify the type
of array (3 integers).
• We then provide the values.
Encoding a Java Class in SOAP
• Note first that a general Java class (like a Vector
or BufferedReader) does not serialize in XML.
• But JavaBeans (or if you prefer, Java data
objects) do serialize.
– A bean is a class with accessor (get/set) methods
associated with each of its data types.
– Can be mapped to C structs.
• XML Beans and Castor are two popular Java-to-
XML converters.
Example of Encoding a Java Bean
• Java class
class MyBean {
String Name=“Marlon”;
public String getName() {return Name;}
public void setName(String n) {Name=n;}
}
• Possible SOAP Encoding of the data (as a
struct)
<MyBean>
<name xsi:type=“xsd:string”>Marlon</name>
</MyBean>
Structs
• Structs are defined in the <xs:element name="Struct"
type="tns:Struct" />
SOAP Encoding schema <xs:group name="Struct">
as shown. <xs:sequence>
  <xs:any namespace="##any"
• Really, they just are used minOccurs="0"
to hold yet more maxOccurs="unbounded"
processContents="lax" />
sequences of arbitrary   </xs:sequence>
XML. </xs:group>
• Struct elements are <xs:complexType name="Struct">
intended to be accessed   <xs:group ref="tns:Struct"
minOccurs="0" />
by name   <xs:attributeGroup
– Rather than order, as ref="tns:commonAttributes" />
Arrays. </xs:complexType>
SOAP 1.1 Arrays
• As stated several times, <xs:complexType
SOAP encoding includes name="Array">
rules for expressing <xs:group ref="tns:Array"
arrays. minOccurs="0" />
• These were significantly   <xs:attributeGroup
revised between SOAP ref="tns:arrayAttribut
1.1 and SOAP 1.2. es" />
• You will still see both   <xs:attributeGroup
styles, so I’ll cover both. ref="tns:commonAttri
• The basic array type butes" />
(shown) was intended to </xs:complexType>
hold 0 or 1 Array groups.
SOAP 1.1 Array Group
• Array elements contain <xs:group name="Array">
zero or more array <xs:sequence>
groups.
  <xs:any
• The array group in turn is namespace="##any"
a sequence of <any> minOccurs="0"
tags. maxOccurs="unbounded"
• So the array group can processContents="lax" />
hold arbitrary XML.   </xs:sequence>
</xs:group>
SOAP 1.1 Array Attributes
• The array group itself is just for <xs:attributeGroup
holding arbitrary XML. name="arrayAttributes">
• The array attributes are used to   <xs:attribute ref="tns:arrayType" />
further refine our definition.   <xs:attribute ref="tns:offset" />
• The array definition may provide   </xs:attributeGroup>
an arrayType definition and an <xs:attribute name="offset"
offset.
type="tns:arrayCoordinate" />
• Offsets can be used to send
partial arrays.
• According to the SOAP Encoding <xs:attribute name="arrayType"
schema itself, these are only type="xs:string" />
required to be strings.
<xs:simpleType
name="arrayCoordinate">
<xs:restriction base="xs:string" />
</xs:simpleType>
Specifying Array Sizes in SOAP 1.1
• The arrayType specifies only that the it takes a string
value.
• The SOAP specification (part 2) does provide the rules.
• First, it should have the form enc:arraySize.
– Encoding can be an XSD type, but not necessarily.
– Ex: xsd:int[5], xsd:string[2,3], p:Person[5]
– The last is an array of five persons, defined in p.
• Second, use the following notation:
– [] is a 1D array.
– [][] is a array of 1D arrays
– [,] is a 2D array.
– And so on.
Encoding Arrays in SOAP 1.2
• Array encodings have been <xs:attribute name="arraySize"
revised and simplified in the type="tns:arraySize" />
latest SOAP specifications. <xs:attribute name="itemType"
– http://www.w3.org/2003/05/so type="xs:QName" />
ap-encoding
• ArrayType elements are
derived from a generic <xs:attributeGroup
nodeType element. name="arrayAttributes">
• Now arrays have two attributes   <xs:attribute
– itemType is the the type of the
ref="tns:arraySize" />
array (String, int, XML   <xs:attribute
complex type). ref="tns:itemType" />
– arraySize </xs:attributeGroup>
SOAP 1.2 Array Sizes
• The arraySize attribute (shown below). The
regular expression means
– I can use a “*” for an unspecified size, OR
– I can specify the size with a range of digits
– I may include multiple groupings of digits for multi-
dimensional arrays, with digit groups separated by
white spaces.

<xs:simpleType name="arraySize">
<xs:restriction base="tns:arraySizeBase">
  <xs:pattern value="(\*|(\d+))(\s+\d+)*" />
  </xs:restriction>
</xs:simpleType>
Comparison of 1.1 and 1.2 Arrays
<numbers <numbers
enc:arrayType="xs:int[2]"> enc:itemType="xs:int"
enc:arraySize="2">
<number>3
<number>3
</number> <number>4
</number> <number>4
</number>
</number>
</numbers>
</numbers>
SOAP 1.1 Encoding’s Common
Attributes
• As we have seen, both <xs:attributeGroup
structs and arrays contain name="commonAttributes
a group called ">
commonAttributes.   <xs:attribute name="id"
• The definition is shown at type="xs:ID" />
the right.   <xs:attribute name="href"
• The ID and the HREF type="xs:anyURI" />
attributes are used to   <xs:anyAttribute
make internal references namespace="##other"
within the SOAP processContents="lax" />
message payload. </xs:attributeGroup>
References and IDs
• As you know, XML provides a simple tree model for
data.
• While you can convert many data models into trees, it
will lead to redundancy.
• The problem is that data models are graphs, which may
be more complicated than simple trees.
• Consider a typical manager/employee data model.
– Managers are an extension of the more general employee class.
– Assume in following example we have defined an appropriate
schema.
Before/After Referencing
(SOAP 1.1 Encoding)
<manager> <manager id=“GCF”>
<fname>Geoffrey</> <fname>Geoffrey</>
<lname>Fox</> <lname>Fox</>
</manager> </manager>
<employee> <employee>
<fname>Marlon</> <fname>Marlon</>
<lname>Pierce</> <lname>Pierce</>
<manager> <manager href=“#gcf”>
<fname>Geoffrey</> </employee>
<lname>Fox</>
</manager>
</employee>
References, IDs and Graphs
• References serve two
purposes.
– They save space by employee
avoiding duplication
• A good thing in a
message. href=“#gcf”
– They lower the potential for
errors.
• They also return us to the
graph model.
– Normal nodes and edges manager
get mapped into one
element information item.
– Ref nodes actually split the
edge and node.
References in SOAP 1.2
• SOAP 1.1 required all <manager id=“GCF”>
references to point to <fname>Geoffrey</>
other top level elements.
<lname>Fox</>
• SOPA 1.2 changed this,
</manager>
so now refs can point to
child elements in a graph <employee>
as well as top level <fname>Marlon</>
elements. <lname>Pierce</>
– See next figure
<manager ref=“gcf”>
• They also changed the
</employee>
tag names and values, so
the encoding looks
slightly different.
SOAP 1.1 and 1.2 Refs
<e:Books> <e:Books>
<e:Book> <e:Book>
<title>My Life and Work </title> <title>My Life and Work </title>
<author href="#henryford" /> <author id="henryford" >
</e:Book> <name>Henry Ford</name>
<e:Book> </author>
<title>Today and Tomorrow</title> </e:Book>
<author href="#henryford" /> <e:Book>
</e:Book> <title>Today and Tomorrow
</e:Books> </title>
<author ref="henryford" />
<author id="henryford"> </e:Book>
<name>Henry Ford</name> </e:Books>
</author>
Using SOAP for Remote
Procedure Calls
The Story So Far…
• We have defined a general purpose abstract
data model.
• We have looked at SOAP encoding.
– SOAP does not provide standard encoding rules, but
instead provides a pluggable encoding style attribute.
• We examined a specific set of encoding rules
that may be optionally used.
• We are now ready to look at a special case of
SOAP encodings suitable for remote procedure
calls (RPC).
Requirements for RPC with SOAP
• RPC is just a way to • Information needed for
invoke a remote RPC:
operation and get some – Location of service
data back. – The method name
– All of your Web Service – The method values
examples use RPC • The values must be
• How do we do this with associated with the
SOAP? We encode method’s argument
carefully to avoid names.
ambiguity.
• But it really is just
common sense.
Location of the Service
• Obviously the SOAP message needs to get
sent to the right place.
• The location (URL) of the service is not
actually encoded in SOAP.
• Instead, it is part of the transport protocol used
to carry the SOAP message.
• For SOAP over HTTP, this is part of the HTTP
Header:
POST /axis/service/echo HTTP/1.0
Host: www.myservice.com
RPC Invocation
• Consider the remote invocation of the following
Java method:
– public String echoService(String toEcho);
• RPC invocation conventions are the following:
– The invocation is represented by a single struct.
– The struct is named after the operation (echoService).
– The struct has an outbound edge for each transmitted
parameter.
– Each transmitted parameter is an outbound edge with
a label corresponding to the parameter name.
SOAP Message by Hand
<env:Envelope xmlns:env=“…” xmlns:xsd=“…”
xmlns:xsi=“…”
env:encodingStyle=“…”>
<env:Body>
<e:echoService xmlns:e=“…”>
<e:toEcho xsi:type=“xsd:string”>Hello
</e:toEcho>
</e:echoService>
</env:Body>
</env:Envelope>
Notes
• I have omitted the namespace URIs, but you
should know that they are the SOAP, XML, and
XSI schemas.
• I also omitted the encoding style URI, but it is
the SOAP encoding schema.
– Required by RPC convention.
• I assume there is a namespace (e:) that defines
all of the operation and parameter elements.
• The body follows the simple rules:
– One struct, named after the method.
– One child element for each input parameter.
RPC Responses
• These follow similar rules as requests.
– We need one (and only one) struct for the remote
operation.
– This time, the label of the struct is not important.
– This struct has one child element (edge) for each
argument.
– The child elements are labeled to correspond to the
operational parameters.
• The response may also distinguish the “return”
value.
RPC Return Values
• Often in RPC we need to distinguish one of the
output values as the “return value”.
– Legacy of C and other programming languages.
• We do this by labeling the return type like this:
<rpc:result>ex:myReturn</rpc:result>
<ex:myReturn xsi:type=“xsd:int”>0</>
• The rpc namespace is
– http://www.w3c.org/2003/05/soap-rpc
An RPC Response
<env:Envelope xmlns:env=“…” xmlns:xsd=“…”
xmlns:xsi=“…” env:encodingStyle=“…”>
<env:Body>
<e:echoResponse
xmlns:rpc=“…”
xmlns:e=“…”>
<rpc:result>e:echoReturn</rpc:result>
<e:echoReturn xsi:type=“xsd:string”>
Hello
</e:echoReturn>
</e:echoResponse>
</env:Body>
</env:Envelope>
Going Beyond Simple Types
• Our simple example just communicates in single
strings.
• But it is straightforward to write SOAP encodings
for remote procedures that use
– Single simple type arguments of other types (ints,
floats, and so on).
– Arrays
– Data objects (structs)
– Multiple arguments, both simple and compound.
Discovering the Descriptions for
RPC
• The RPC encoding rules are based on
some big assumptions:
– You know the location of the service.
– You know the names of the operations.
– You know the parameter names and types of
each operation.
• How you learn this is out of SOAP’s
scope.
• WSDL is one obvious way.
Relation to WSDL Bindings
• Recall from last WSDL lecture that the
<binding> element binds WSDL portTypes
to SOAP or other message formats.
• Binding to SOAP specified the following:
– RPC or Document Style
– HTTP for transport
– SOAP encoding for the body elements
The WSDL Binding for Echo
<wsdl:binding name="EchoSoapBinding" type="impl:Echo">
  <wsdlsoap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="echo">
  <wsdlsoap:operation soapAction="" />
<wsdl:input name="echoRequest">
  <wsdlsoap:body
encodingStyle="http://schemas.xmlsoap.org/so ap/encoding/"
namespace=“…" use="encoded" />
  </wsdl:input>
<wsdl:output name="echoResponse">
  <wsdlsoap:body
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace=“…" use="encoded" />
  </wsdl:output>
</wsdl:operation>
</wsdl:binding>
RPC Style for Body Elements
• The body element just contains <soapenv:Body>
XML. <ns1:echo
• Our WSDL specified RPC style soapenv:encodingStyle=""
encoding. xmlns:ns1="">
– So we will structure our body <in0 xsi:type="xsd:string">
element to look like the WSDL
method. Hello World
• First, the body contains an </in0>
element <echo> that corresponds </ns1:echo>
to the remote comnand. </soapenv:Body>
– Using namespace ns1 to connect
<echo> to its WSDL definition
• Then the tag contains the element
<in0> which contains the payload.
Connection of WSDL Definitions
and SOAP Message for RPC
<wsdl:message <soapenv:Body>
name="echoRequest"> <ns1:echo
<wsdl:part name="in0" soapenv:encodingStyle=""
type="xsd:string" /> xmlns:ns1="">
</wsdl:message> <in0 xsi:type="xsd:string">
Hello World
<wsdl:portType name="Echo"> </in0>
<wsdl:operation name="echo" </ns1:echo>
parameterOrder="in0”>
</soapenv:Body>
<wsdl:input
message="impl:echoRequest
name="echoRequest" />
</wsdl:operation>
</wsdl:portType>
WSDL-RPC Mappings for
Response
<wsdl:portType name="Echo"> <soapenv:Body>
<wsdl:operation name="echo" <ns1:echoResponse
parameterOrder="in0"> env:encodingStyle=“…”
… xmlns:ns1=“…">
<wsdl:output
message="echoResponse” <echoReturn xsi:type=“String“>
Hello World
name="echoResponse" /> </echoReturn>
</wsdl:operation> </ns1:echoResponse>
</wsdl:portType> </soapenv:Body>

<wsdl:message
name="echoResponse">
  <wsdl:part name="echoReturn"
type="xsd:string" />
</wsdl:message>
Alternative Encoding
Schemes
Wrap Up
• As we have seen, SOAP itself does not provide
encoding rules for message payloads.
– Instead, it provides a pluggable encoding style
attribute.
• SOAP encoding rules are optional, but likely to
be commonly supported in software like Axis.
• SOAP encoding’s three main parts for RPC:
– Abstract Data Model
– XML Encoding of model
– Further conventions for RPC
• What about other encodings?
Alternative Encoding Schemes
• SOAP encoding uses graph models for data but,
apart from references, does not explicitly map
the parts of the graph to different XML elements.
• There are other XML data encoding schemes
that make a much more explicit connection
between the graph and the encoding.
• The Resource Description Framework is one
such scheme.
• So we may choose to use RDF instead of SOAP
encoding in a SOAP message.
RDF Encoding Example of Echo
<?xml version=‘1.0’ ?>
<env:Envelope xmlns:env=“…”>
<env:Body
env:encodingStyle=“http://www.w3c.org/1999/02/22-rdf-syntax-
ns#”>
<rdf:RDF>
<rdf:Description about=“echo service uri”>
<e:echoService>
<e:in0>Hello</e:in0>
</e:echoService>
</rdf:Description>
</rdf:RDF>
</env:Body>
</env:Envelope>
RDF Encoding Notes
• We will look at RDF in detail in next week’s
lectures.
• Basic idea is that <rdf:Description> tags are
envelopes for xml tags from other schemas.
• The <Description>’s about attribute tells you
what is being described.
• Note that standard Web Service engines do not
support RDF or other encodings.
– You would need to extend it yourself.
– But it is possible.

You might also like