Pages

1/16/2008

SOAP

SOAP Binding

WSDL includes a binding for SOAP 1.1 endpoints, which supports the specification of the following protocol specific information:

  • An indication that a binding is bound to the SOAP 1.1 protocol
  • A way of specifying an address for a SOAP endpoint.
  • The URI for the SOAPAction HTTP header for the HTTP binding of SOAP
  • A list of definitions for Headers that are transmitted as part of the SOAP Envelope

This binding grammar it is not an exhaustive specification since the set of SOAP bindings is evolving. Nothing precludes additional SOAP bindings to be derived from portions of this grammar. For example:

  • SOAP bindings that do not employ a URI addressing scheme may substitute another addressing scheme by replacing the soap:address element defined in section 3.8.
  • SOAP bindings that do not require a SOAPAction omit the soapAction attribute defined in section 3.4.

3.1 SOAP Examples

In the following example, a SubscribeToQuotes SOAP 1.1 one-way message is sent to a StockQuote service via a SMTP binding. The request takes a ticker symbol of type string, and includes a header defining the subscription URI.

Example 3. SOAP binding of one-way operation over SMTP using a SOAP Header

<?xml version="1.0"?>

<definitions name="StockQuote"

targetNamespace="http://example.com/stockquote.wsdl"

xmlns:tns="http://example.com/stockquote.wsdl"

xmlns:xsd1="http://example.com/stockquote.xsd"

xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"

xmlns="http://schemas.xmlsoap.org/wsdl/">

<message name="SubscribeToQuotes">

<part name="body" element="xsd1:SubscribeToQuotes"/>

<part name="subscribeheader" element="xsd1:SubscriptionHeader"/>

</message>

<portType name="StockQuotePortType">

<operation name="SubscribeToQuotes">

<input message="tns:SubscribeToQuotes"/>

</operation>

</portType>

<binding name="StockQuoteSoap" type="tns:StockQuotePortType">

<soap:binding style="document" transport="http://example.com/smtp"/>

<operation name="SubscribeToQuotes">

<input message="tns:SubscribeToQuotes">

<soap:body parts="body" use="literal"/>

<soap:header message="tns:SubscribeToQuotes" part="subscribeheader" use="literal"/>

</input>

</operation>

</binding>

<service name="StockQuoteService">

<port name="StockQuotePort" binding="tns:StockQuoteSoap">

<soap:address location="mailto:subscribe@example.com"/>

</port>

</service>

<types>

<schema targetNamespace="http://example.com/stockquote.xsd"

xmlns="http://www.w3.org/2000/10/XMLSchema">

<element name="SubscribeToQuotes">

<complexType>

<all>

<element name="tickerSymbol" type="string"/>

</all>

</complexType>

</element>

<element name="SubscriptionHeader" type="uriReference"/>

</schema>

</types>

</definitions>

This example describes that a GetTradePrice SOAP 1.1 request may be sent to a StockQuote service via the SOAP 1.1 HTTP binding. The request takes a ticker symbol of type string, a time of type timeInstant, and returns the price as a float in the SOAP response.

Example 4. SOAP binding of request-response RPC operation over HTTP

<?xml version="1.0"?>

<definitions name="StockQuote"

targetNamespace="http://example.com/stockquote.wsdl"

xmlns:tns="http://example.com/stockquote.wsdl"

xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"

xmlns:xsd1="http://example.com/stockquote.xsd"

xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"

xmlns="http://schemas.xmlsoap.org/wsdl/">

<message name="GetTradePriceInput">

<part name="tickerSymbol" element="xsd:string"/>

<part name="time" element="xsd:timeInstant"/>

</message>

<message name="GetTradePriceOutput">

<part name="result" type="xsd:float"/>

</message>

<portType name="StockQuotePortType">

<operation name="GetTradePrice">

<input message="tns:GetTradePriceInput"/>

<output message="tns:GetTradePriceOutput"/>

</operation>

</portType>

<binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">

<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

<operation name="GetTradePrice">

<soap:operation soapAction="http://example.com/GetTradePrice"/>

<input>

<soap:body use="encoded" namespace="http://example.com/stockquote"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

</input>

<output>

<soap:body use="encoded" namespace="http://example.com/stockquote"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

</output>

</operation>>

</binding>

<service name="StockQuoteService">

<documentation>My first service</documentation>

<port name="StockQuotePort" binding="tns:StockQuoteBinding">

<soap:address location="http://example.com/stockquote"/>

</port>

</service>

</definitions>

This example describes that a GetTradePrices SOAP 1.1 request may be sent to a StockQuote service via the SOAP 1.1 HTTP binding. The request takes a stock quote symbol string, an application defined TimePeriod structure containing a start and end time and returns an array of stock prices recorded by the service within that period of time, as well as the frequency at which they were recorded as the SOAP response. The RPC signature that corresponds to this service has in parameters tickerSymbol and timePeriod followed by the output parameter frequency, and returns an array of floats.

Example 5. SOAP binding of request-response RPC operation over HTTP

<?xml version="1.0"?>

<definitions name="StockQuote"

targetNamespace="http://example.com/stockquote.wsdl"

xmlns:tns="http://example.com/stockquote.wsdl"

xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"

xmlns:xsd1="http://example.com/stockquote/schema"

xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"

xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"

xmlns="http://schemas.xmlsoap.org/wsdl/">

<types>

<schema targetNamespace="http://example.com/stockquote/schema"

xmlns="http://www.w3.org/2000/10/XMLSchema">

<complexType name="TimePeriod">

<all>

<element name="startTime" type="xsd:timeInstant"/>

<element name="endTime" type="xsd:timeInstant"/>

</all>

</complexType>

<complexType name="ArrayOfFloat">

<complexContent>

<restriction base="soapenc:Array">

<attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:float[]"/>

</restriction>

</complexContent>

</complexType>

</schema>

</types>

<message name="GetTradePricesInput">

<part name="tickerSymbol" element="xsd:string"/>

<part name="timePeriod" element="xsd1:TimePeriod"/>

</message>

<message name="GetTradePricesOutput">

<part name="result" type="xsd1:ArrayOfFloat"/>

<part name="frequency" type="xsd:float"/>

</message>

<portType name="StockQuotePortType">

<operation name="GetLastTradePrice" parameterOrder="tickerSymbol timePeriod frequency">

<input message="tns:GetTradePricesInput"/>

<output message="tns:GetTradePricesOutput"/>

</operation>

</portType>

<binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">

<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

<operation name="GetTradePrices">

<soap:operation soapAction="http://example.com/GetTradePrices"/>

<input>

<soap:body use="encoded" namespace="http://example.com/stockquote"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

</input>

<output>

<soap:body use="encoded" namespace="http://example.com/stockquote"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

</output>

</operation>>

</binding>

<service name="StockQuoteService">

<documentation>My first service</documentation>

<port name="StockQuotePort" binding="tns:StockQuoteBinding">

<soap:address location="http://example.com/stockquote"/>

</port>

</service>

</definitions>

No comments: