SMEX stands for Simple Message Exchange, and SMEX-D for SMEX Descriptor, an XML language designed to provide simple descriptions of a wide range of Web-Service message exchanges, both REST-based and SOAP-based.
A SMEX is a pair of messages sent between two systems referred to as the client and server. The first message, from client to server, is called the request; the second, from server to client, the response. A SMEX might represent a complete transaction in the RPC style, or one step in an extended conversation between client and server, or between multiple co-operating computers.
Amazon.com Example · Here is a SMEX-D instance describing an Amazon.com ItemSearch transaction.
A SMEX-D Instance · In this discussion, the acronym “NSX” stands for “Non-SOAP XML”, i.e. an XML document whose root element is not in the SOAP namespace. ¶
A SMEX request may take one of three forms:
Name-value pairs.
An NSX message.
A SOAP message.
A SMEX response may take one of three forms:
No reply, in which case the “exchange” is a one-way message transmission consisting only of the request.
An NSX message.
A SOAP message.
The namespace for SMEX-D is http://smex-d.net/ns/
.
All elements in a SMEX instance are in the SMEX-D namespace,
and all attributes are in no namespace, unless otherwise specified.
A SMEX-D instance’s root element is <smex-d>
.
The <smex-d>
element must have two child elements,
<request>
and <response>
.
The <smex-d>
element may have an update
attribute whose value must be one of true
or false
.
The default value of update
is
false
.
update="false"
asserts that this message exchange operation
is “safe and idempotent” as the terms are defined in
HTTP
1.1; true
means that there is no assertion of safety or
idempotence.
<smex-d>
must have an href
attribute, whose
value must be a URI to which the SMEX request is to be sent.
The request
Element ·
<request>
must have a form
attribute whose
value
must be one of pairs
, soap
, or nsx
. ¶
The request message is transmitted from client to server
via HTTP, using either the POST
or
GET
verb.
If the containing <smex-d>
element has
update="true"
, or the request form is nsx
or
soap
, then the
client must use the HTTP POST
verb.
otherwise, it should use GET
.
The response
Element ·
<response>
must have a form
attribute whose
value must be one of soap
, nsx
, or
none
.
The last value means that there is no response expected to the request. ¶
The response message is transmitted from the server to the client as an HTTP response to the request message.
Name-Value Pairs ·
<request>
elements with form="pairs"
have
zero or more child <pair>
elements.
Each <pair>
element must have a name
attribute
whose value must be a
Name, in XML terms.
<pair>
may have a child <enum>
element, which,
if provided, contains one or more <v>
elements containing
the allowed values. ¶
If there is no <enum>
, the values are constrained using the
type
attribute, whose value is a string identifying one of
the 19 primitive datatypes from
XML
Schema section 3.2.
The default value is string
.
Here is an example of such a <request>
element:
<request form="pairs">
<pair name="user" />
<pair name="max-weight" type="decimal" />
<pair name="rgb"><enum><v>R</v><v>G</v><v>B</v></enum></pair>
</request>
A request in pairs
form is to be transmitted from the client
to the server using the usual URL-encoding techniques for GET
and
name-value pairs for POST
.
The language
Element ·
This element is used to describe the language used in an NSX message, or in
a SOAP message’s header or body, by specifying either its namespace or
one or more schemas, or both.
<language>
may have a namespace
attribute,
whose value must
be an XML Namespace Name identifying the language used in the NSX message. ¶
It may also contain contain one or more <schema>
elements, each identifying a schema that constrains the message.
A <schema>
element must have a flavor
attribute, whose value must be one or more of relaxng
,
xsd
, or schematron
.
If omitted, the default value is relaxng
.
<schema>
may also have a root
attribute, whose
value must be a
Name, in XML terms,
giving the required root element.
<schema>
must have an href
attribute whose
value is a URI for the schema.
<language>
must have either a namespace
attribute or at least one child <schema>
element.
An example of <language>
:
<language namespace="http://example.com/ns/invoices">
<schema root="simple-invoice" href="http://example.com/schemas/invoice" />
</language>
Defining NSX Messages ·
<request>
and <response>
elements with
form="nsx"
specify that the request or response takes the form
of an XML document whose root is not in the SOAP namespace.
Such elements must contain a single <language>
element
which describes the language in the message. ¶
An example of an NSX <request>
element:
<request form="nsx">
<language namespace="http://example.com/ns/invoices" />
</request>
Defining SOAP Messages ·
<request>
and <response>
elements with
form="soap"
specify that the request or response is an XML
document whose infoset is a
SOAP 1.2
Message.
Such an element must contain two children, <header>
and
<body>
.
Each of these children must contain one or more <language>
elements which describe the elements that may appear as top-level children of
the SOAP header and body. ¶
An example of a SOAP <response>
element:
<response form="soap">
<header>
<language namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing" />
<language>
<schema href="http://example.com/schemas/query" />
</language>
</header>
<body>
<language>
<schema href="http://example.com/schemas/invoice" />
</language>
</body>
</response>