[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [Elist Home]
Subject: SOAP binding
Per the 8/15 telecon, I've attached a description of a SOAP binding that revises the content of chapter 6 of the baseline proposal. This description is aligned with the proposed separation of batch elements from a core specification of single operation request and response. ciao, Christine Tomlinson Sun Microsystems
DSML v2 Binding for SOAP over HTTP/HTTPS The following describes a method of using SOAP over HTTP/1.1 and HTTPS/1.1 as a transport for DSML v2 requests and responses. The version of SOAP for this binding is SOAP 1.1. The use of other transports for SOAP, e.g., SMTP, would be subject to additional considerations not addressed here. The namespace for the core DSMLv2 is "urn:oasis-open:dsml:2" and for the Batch elements is "urn:oasis-open:dsml:2:batch." These namespaces are used at the top-level element of the <body> of each SOAP request and response. Default namespace designations MAY be used. All SOAP requests and responses in this binding MUST use the xml encoding "UTF-8". Each SOAP request is either a <batch:request> as defined in DSML_Batch.xsd or a DSMLRequest as defined in the core DSMLv2.xsd. Any DSMLv2/SOAP compliant server MUST accept all defined forms of request. A SOAP node SHOULD indicate in the 'SOAPAction' header field the element name of the top-level element in the <body> of the SOAP request. Note that sending a single DSMLRequest (i.e., one that is not contained within a <batch:request>) is most effective if "Connection: Keep-Alive" is used on the underlying HTTP/HTTPS connection. Each SOAP response is either a <batch:response> or a <batch:searchResponse> as defined in DSML_Batch.xsd or a DSMLResponse as defined in the core DSMLv2.xsd. The response to a <dsml:searchRequest> is always a <batch:searchResponse> If a DSML v2 response contains an <dsml:errorResponse> then a SOAP fault element with the faultcode: 'Client' is returned and the DSML response is contained in the 'detail' of the fault element. For example: <?xml version="1.0" encoding="UTF-8" ?> <se:Envelope xmlns:se='http://schemas.xmlsoap.org/soap/envelope'> <se:Header/> <se:Body> <se:Fault> <faultcode>se:Client</faultcode> <faultstring>DSML Client error</faultstring> <detail> <dsml:errorResponse xmlns:dsml="urn:oasis-open:dsml:2" type="couldNotConnect"> <dsml:message>Cannot connect to a DSML server</dsml:message> </dsml:errorResponse> </detail> </se:Fault> </se:Body> </se:Envelope> If a DSML v2 response contains an LDAPResult with a ResultCode corresponding to any LDAPErrorCode other than: 'success', 'compareFalse' or 'compareTrue' then a SOAP fault element with the faultcode: 'Server' is returned and the DSML response is contained in the 'detail' of the fault element. For example: <?xml version="1.0" encoding="UTF-8" ?> <se:Envelope xmlns:se='http://schemas.xmlsoap.org/soap/envelope'> <se:Header/> <se:Body> <se:Fault> <faultcode>se:Server</faultcode> <faultstring>DSML Server error</faultstring> <detail> <batch:response xmlns:dsml="urn:oasis-open:dsml:2" xmlns:batch="urn:oasis-open:dsml:2:batch"> <dsml:modifyResponse> <resultCode code="53" descr="unwillingToPerform"/> <errorMessage>System Attribute may not be modified</errorMessage> </dsml:modifyResponse> <dsml:addResponse> <resultCode code="0"/> </dsml:addResponse> <dsml:naddResponse> <resultCode code="0" descr="success"/> <control>...</control> <control>...</control> </dsml:addResponse> </batch:response> </detail> </se:Fault> </se:Body> </se:Envelope> SOAP headers SHOULD not be sent in requests and MUST be ignored by the recipient except in the case of a MustUnderstand. In the event that a recipient receives a request with a MustUnderstand header then a SOAP Fault of type MustUnderstand is returned.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:oasis-open:dsml:2" targetNamespace="urn:oasis-open:dsml:2" elementFormDefault="qualified"> <!-- DSML Requests --> <xsd:group name="DSMLRequest"> <xsd:choice> <xsd:element name="bindRequest" type="BindRequest" /> <xsd:element name="searchRequest" type="SearchRequest" /> <xsd:element name="modifyRequest" type="ModifyRequest" /> <xsd:element name="addRequest" type="AddRequest" /> <xsd:element name="delRequest" type="DelRequest" /> <xsd:element name="modDNRequest" type="ModifyDNRequest" /> <xsd:element name="compareRequest" type="CompareRequest" /> <xsd:element name="abandonRequest" type="AbandonRequest" /> <xsd:element name="extendedReq" type="ExtendedRequest" /> </xsd:choice> </xsd:group> <!-- DSML Responses --> <xsd:group name="DSMLResponse"> <xsd:choice> <xsd:element name="bindResponse" type="LDAPResult"/> <xsd:element name="searchResultEntry" type="SearchResultEntry"/> <xsd:element name="searchResultReference" type="SearchResultReference"/> <xsd:element name="searchResultDone" type="LDAPResult"/> <xsd:element name="modifyResponse" type="LDAPResult" /> <xsd:element name="addResponse" type="LDAPResult" /> <xsd:element name="delResponse" type="LDAPResult" /> <xsd:element name="modDNResponse" type="LDAPResult" /> <xsd:element name="compareResponse" type="LDAPResult" /> <xsd:element name="extendedResp" type="ExtendedResponse" /> <xsd:element name="errorResponse" type="ErrorResponse" /> </xsd:choice> </xsd:group> <!-- ***** DsmlDN ***** --> <xsd:simpleType name="DsmlDN"> <xsd:restriction base="xsd:string"/> </xsd:simpleType> <!-- ***** DsmlRDN ***** --> <xsd:simpleType name="DsmlRDN"> <xsd:restriction base="xsd:string"/> </xsd:simpleType> <!-- ***** Request ID ***** --> <xsd:simpleType name="RequestID"> <xsd:restriction base="xsd:string"/> </xsd:simpleType> <!-- ***** OID ***** --> <xsd:simpleType name="OID"> <xsd:union memberTypes="NumericOID xsd:NMTOKEN"/> </xsd:simpleType> <xsd:simpleType name="NumericOID"> <xsd:restriction base="xsd:string"> <xsd:pattern value="[0-2].[0-9]+[.[0-9]+]*"/> </xsd:restriction> </xsd:simpleType> <!-- ***** ExtensionTypeID ***** --> <xsd:simpleType name="ExtensionTypeID"> <xsd:union memberTypes="NumericOID xsd:anyURI"/> </xsd:simpleType> <!-- ***** MAX Integer ***** --> <xsd:simpleType name="MAXINT"> <xsd:restriction base="xsd:unsignedInt"> <xsd:maxInclusive value="2147483647" /> </xsd:restriction> </xsd:simpleType> <!-- **** DSML Value **** --> <xsd:complexType name="DsmlValue"> <xsd:choice> <xsd:element name="utf8" type="xsd:string"/> <xsd:element name="binary" type="xsd:base64Binary"/> <xsd:element name="uri" type="xsd:anyURI"/> </xsd:choice> </xsd:complexType> <!-- **** DSML Any external XML structure **** --> <xsd:complexType name="DsmlANY"> <xsd:sequence> <xsd:any/> </xsd:sequence> </xsd:complexType> <!-- **** DSML Control **** --> <xsd:complexType name="Control"> <xsd:sequence> <xsd:element name="controlValue" minOccurs="0" maxOccurs="1" type="DsmlANY"/> </xsd:sequence> <xsd:attribute name="type" use="required" type="ExtensionTypeID"/> <xsd:attribute name="criticality" use="optional" default="false" type="xsd:boolean" /> </xsd:complexType> <!-- **** DSML Filter **** --> <xsd:complexType name="Filter"> <xsd:group minOccurs="1" maxOccurs="1" ref="FilterGroup"/> </xsd:complexType> <xsd:group name="FilterGroup"> <xsd:sequence> <xsd:choice minOccurs="1" maxOccurs="1" > <xsd:element name="and" type="FilterSet"/> <xsd:element name="or" type="FilterSet"/> <xsd:element name="not" type="Filter"/> <xsd:element name="equalityMatch" type="AttributeValueAssertion"/> <xsd:element name="substrings" type="SubstringFilter"/> <xsd:element name="greaterOrEqual" type="AttributeValueAssertion"/> <xsd:element name="lessOrEqual" type="AttributeValueAssertion"/> <xsd:element name="present" type="AttributeDescription"/> <xsd:element name="approxMatch" type="AttributeValueAssertion"/> <xsd:element name="extensibleMatch" type="MatchingRuleAssertion"/> </xsd:choice> </xsd:sequence> </xsd:group> <xsd:complexType name="FilterSet"> <xsd:sequence> <xsd:group minOccurs="0" maxOccurs="unbounded" ref="FilterGroup"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="AttributeValueAssertion"> <xsd:sequence> <xsd:element name="value" type="DsmlValue"/> </xsd:sequence> <xsd:attribute name="desc" type="OID"/> </xsd:complexType> <xsd:complexType name="AttributeDescription"> <xsd:attribute name="desc" type="OID"/> </xsd:complexType> <xsd:complexType name="SubstringFilter"> <xsd:sequence> <xsd:choice minOccurs="1" maxOccurs="unbounded"> <xsd:element name="initial" type="DsmlValue"/> <xsd:element name="any" type="DsmlValue"/> <xsd:element name="final" type="DsmlValue"/> </xsd:choice> </xsd:sequence> <xsd:attribute name="desc" type="OID"/> </xsd:complexType> <xsd:complexType name="MatchingRuleAssertion"> <xsd:sequence> <xsd:element name="value" type="DsmlValue"/> </xsd:sequence> <xsd:attribute name="dnAttributes" use="optional" type="xsd:boolean" default="false"/> <xsd:attribute name="matchingRule" use="optional" type="OID"/> <xsd:attribute name="desc" use="optional" type="OID"/> </xsd:complexType> <!-- *************** DSML MESSAGE ******************** --> <xsd:complexType name="DsmlMessage"> <xsd:sequence> <xsd:element name="control" minOccurs="0" maxOccurs="unbounded" type="Control"/> </xsd:sequence> <xsd:attribute name="requestID" use="optional" type="RequestID" /> </xsd:complexType> <!-- *************** LDAP RESULT ********************* --> <xsd:simpleType name="LDAPErrorCode"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="success" /> <xsd:enumeration value="operationsError" /> <xsd:enumeration value="protocolError" /> <xsd:enumeration value="timeLimitExceeded" /> <xsd:enumeration value="sizeLimitExceeded" /> <xsd:enumeration value="compareFalse" /> <xsd:enumeration value="compareTrue" /> <xsd:enumeration value="authMethodNotSupported" /> <xsd:enumeration value="strongAuthRequired" /> <xsd:enumeration value="referral" /> <xsd:enumeration value="adminLimitExceeded" /> <xsd:enumeration value="unavailableCriticalExtension" /> <xsd:enumeration value="confidentialityRequired" /> <xsd:enumeration value="saslBindInProgress" /> <xsd:enumeration value="noSuchAttribute" /> <xsd:enumeration value="undefinedAttributeType" /> <xsd:enumeration value="inappropriateMatching" /> <xsd:enumeration value="constraintViolation" /> <xsd:enumeration value="attributeOrValueExists" /> <xsd:enumeration value="invalidAttributeSyntax" /> <xsd:enumeration value="noSuchObject" /> <xsd:enumeration value="aliasProblem" /> <xsd:enumeration value="invalidDNSyntax" /> <xsd:enumeration value="aliasDerefencingProblem" /> <xsd:enumeration value="inappropriateAuthentication" /> <xsd:enumeration value="invalidCredentials" /> <xsd:enumeration value="insufficientAccessRights" /> <xsd:enumeration value="busy" /> <xsd:enumeration value="unavailable" /> <xsd:enumeration value="unwillingToPerform" /> <xsd:enumeration value="loopDetect" /> <xsd:enumeration value="namingViolation" /> <xsd:enumeration value="objectClassViolation" /> <xsd:enumeration value="notAllowedOnNonLeaf" /> <xsd:enumeration value="notAllowedOnRDN" /> <xsd:enumeration value="entryAlreadyExists" /> <xsd:enumeration value="objectClassModsProhibited" /> <xsd:enumeration value="affectMultipleDSAs" /> <xsd:enumeration value="other" /> </xsd:restriction> </xsd:simpleType> <xsd:complexType name="ResultCode"> <xsd:attribute name="code" type="xsd:int"/> <xsd:attribute name="descr" use="optional" type="LDAPErrorCode"/> </xsd:complexType> <xsd:complexType name="LDAPResult"> <xsd:complexContent> <xsd:extension base="DsmlMessage"> <xsd:sequence> <xsd:element name="resultCode" minOccurs="1" maxOccurs="1" type="ResultCode"/> <xsd:element name="errorMessage" minOccurs="0" maxOccurs="1" default="" type="xsd:string" /> <xsd:element name="referral" minOccurs="0" maxOccurs="unbounded" default="" type="xsd:anyURI" /> </xsd:sequence> <xsd:attribute name="matchedDN" use="optional" default="" type="DsmlDN"/> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:complexType name="ErrorResponse"> <xsd:sequence> <xsd:element name="message" minOccurs="0" type="xsd:string"/> <xsd:element name="detail" minOccurs="0"> <xsd:complexType> <xsd:sequence> <xsd:any/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:attribute name="requestID" use="optional" type="RequestID" /> <xsd:attribute name="type"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="notAttempted"/> <xsd:enumeration value="couldNotConnect"/> <xsd:enumeration value="connectionClosed"/> <xsd:enumeration value="other"/> </xsd:restriction> </xsd:simpleType> </xsd:attribute> </xsd:complexType> <!-- *************** Bind ********************* --> <xsd:complexType name="BindRequest"> <xsd:complexContent> <xsd:extension base="DsmlMessage"> <xsd:attribute name="principal" use="required" type="DsmlDN"/> </xsd:extension> </xsd:complexContent> </xsd:complexType> <!-- *************** Search ********************* --> <xsd:complexType name="AttributeDescriptions"> <xsd:sequence minOccurs="0" maxOccurs="unbounded"> <xsd:element name="attribute" type="AttributeDescription"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="SearchRequest"> <xsd:complexContent> <xsd:extension base="DsmlMessage"> <xsd:sequence> <xsd:element name="filter" minOccurs="1" maxOccurs="1" type="Filter" /> <xsd:element name="attributes" minOccurs="0" maxOccurs="1" type="AttributeDescriptions"/> </xsd:sequence> <xsd:attribute name="dn" use="required" type="DsmlDN" /> <xsd:attribute name="scope" use="required"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="baseObject" /> <xsd:enumeration value="singleLevel" /> <xsd:enumeration value="wholeSubtree" /> </xsd:restriction> </xsd:simpleType> </xsd:attribute> <xsd:attribute name="derefAliases" use="required"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="neverDerefAliases" /> <xsd:enumeration value="derefInSearching" /> <xsd:enumeration value="derefFindingBaseObj" /> <xsd:enumeration value="derefAlways" /> </xsd:restriction> </xsd:simpleType> </xsd:attribute> <xsd:attribute name="sizeLimit" use="optional" default="0" type="MAXINT" /> <xsd:attribute name="timeLimit" use="optional" default="0" type="MAXINT" /> <xsd:attribute name="typesOnly" use="optional" default="false" type="xsd:boolean" /> </xsd:extension> </xsd:complexContent> </xsd:complexType> <!-- ***** Search Result Entry ***** --> <xsd:complexType name="SearchResultEntry"> <xsd:complexContent> <xsd:extension base="DsmlMessage"> <xsd:sequence> <xsd:element name="attr" minOccurs="0" maxOccurs="unbounded" type="DsmlAttr"/> </xsd:sequence> <xsd:attribute name="dn" use="required" type="DsmlDN"/> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:complexType name="DsmlAttr"> <xsd:sequence> <xsd:element name="value" minOccurs="0" maxOccurs="unbounded" type="DsmlValue"/> </xsd:sequence> <xsd:attribute name="desc" use="required" type="OID"/> </xsd:complexType> <xsd:complexType name="DsmlModification"> <xsd:sequence> <xsd:element name="value" minOccurs="0" maxOccurs="unbounded" type="DsmlValue"/> </xsd:sequence> <xsd:attribute name="desc" use="required" type="OID"/> <xsd:attribute name="operation" use="required" > <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="add" /> <xsd:enumeration value="delete" /> <xsd:enumeration value="replace" /> </xsd:restriction> </xsd:simpleType> </xsd:attribute> </xsd:complexType> <!-- ***** Search Result Reference ***** --> <xsd:complexType name="SearchResultReference"> <xsd:complexContent> <xsd:extension base="DsmlMessage"> <xsd:sequence> <xsd:element name="ref" minOccurs="1" maxOccurs="unbounded" type="xsd:anyURI" /> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <!-- ************* MODIFY ******************** --> <xsd:complexType name="ModifyRequest"> <xsd:complexContent> <xsd:extension base="DsmlMessage"> <xsd:sequence> <xsd:element name="attr" minOccurs="0" maxOccurs="unbounded" type="DsmlModification" /> </xsd:sequence> <xsd:attribute name="dn" use="required" type="DsmlDN" /> </xsd:extension> </xsd:complexContent> </xsd:complexType> <!-- *************** ADD ********************* --> <xsd:complexType name="AddRequest"> <xsd:complexContent> <xsd:extension base="DsmlMessage"> <xsd:sequence> <xsd:element name="attr" minOccurs="0" maxOccurs="unbounded" type="DsmlAttr" /> </xsd:sequence> <xsd:attribute name="dn" use="required" type="DsmlDN"/> </xsd:extension> </xsd:complexContent> </xsd:complexType> <!-- *************** DELETE ********************* --> <xsd:complexType name="DelRequest"> <xsd:complexContent> <xsd:extension base="DsmlMessage"> <xsd:attribute name="dn" use="required" type="DsmlDN"/> </xsd:extension> </xsd:complexContent> </xsd:complexType> <!-- *************** MODIFY DN ********************* --> <xsd:complexType name="ModifyDNRequest"> <xsd:complexContent> <xsd:extension base="DsmlMessage"> <xsd:attribute name="dn" use="required" type="DsmlDN"/> <xsd:attribute name="newrdn" use="required" type="DsmlRDN"/> <xsd:attribute name="deleteoldrdn" use="optional" default="true" type="xsd:boolean"/> <xsd:attribute name="newSuperior" use="optional" type="DsmlDN"/> </xsd:extension> </xsd:complexContent> </xsd:complexType> <!-- ************* COMPARE ******************** --> <xsd:complexType name="CompareRequest"> <xsd:complexContent> <xsd:extension base="DsmlMessage"> <xsd:sequence> <xsd:element name="attr" minOccurs="1" maxOccurs="1" type="AttributeValueAssertion" /> </xsd:sequence> <xsd:attribute name="dn" use="required" type="DsmlDN"/> </xsd:extension> </xsd:complexContent> </xsd:complexType> <!-- ***** ABANDON ***** --> <xsd:complexType name="AbandonRequest"> <xsd:complexContent> <xsd:extension base="DsmlMessage"> <xsd:attribute name="abandonID" use="required" type="RequestID"/> </xsd:extension> </xsd:complexContent> </xsd:complexType> <!-- ************* EXTENDED OPERATION ******************** --> <xsd:complexType name="ExtendedRequest"> <xsd:complexContent> <xsd:extension base="DsmlMessage"> <xsd:sequence> <xsd:element name="requestName" minOccurs="1" maxOccurs="1" type="ExtensionTypeID"/> <xsd:element name="requestValue" minOccurs="0" maxOccurs="1" type="DsmlANY"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:complexType name="ExtendedResponse"> <xsd:complexContent> <xsd:extension base="LDAPResult"> <xsd:sequence> <xsd:element name="responseName" minOccurs="0" maxOccurs="1" type="ExtensionTypeID"/> <xsd:element name="response" minOccurs="0" maxOccurs="1" type="DsmlANY"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <!-- ********************END base SCHEMA ********************* --> </xsd:schema>
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema targetNamespace="urn:oasis-open:dsml:2:batch" xmlns:dsml="urn:oasis-open:dsml:2" xmlns="urn:oasis-open:dsml:2:batch" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xsd:import namespace="urn:oasis-open:dsml:2" schemaLocation="DSMLv2B.xsd"/> <!-- *************** DSMLv2.0 Batch Envelopes ********************* --> <xsd:element name="request" type="BatchRequest"/> <xsd:element name="response" type="BatchResponse"/> <xsd:element name="searchResponse" type="SearchResponse"/> <!-- **** DSML Batch Request Envelope **** --> <xsd:complexType name="BatchRequest"> <xsd:sequence> <xsd:element name="requestID" minOccurs="0" maxOccurs="1" type="xsd:string" /> <xsd:group ref="dsml:DSMLRequest" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="processing" use="optional" default="sequential"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="sequential"/> <xsd:enumeration value="parallel"/> </xsd:restriction> </xsd:simpleType> </xsd:attribute> <xsd:attribute name="onError" use="optional" default="exit"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="resume"/> <xsd:enumeration value="exit"/> </xsd:restriction> </xsd:simpleType> </xsd:attribute> </xsd:complexType> <!-- **** DSML Batch Response Envelope **** --> <xsd:complexType name="BatchResponse"> <xsd:sequence> <xsd:element name="requestID" minOccurs="0" maxOccurs="1" type="xsd:string" /> <xsd:group ref="dsml:DSMLResponse" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <!-- **** DSML Batch Response Envelope **** --> <xsd:complexType name="SearchResponse"> <xsd:sequence> <xsd:element name="searchResultEntry" minOccurs="0" maxOccurs="unbounded" type="dsml:SearchResultEntry" /> <xsd:element name="searchResultReference" minOccurs="0" maxOccurs="unbounded" type="dsml:SearchResultReference"/> <xsd:element name="searchResultDone" minOccurs="1" maxOccurs="1" type="dsml:LDAPResult" /> </xsd:sequence> </xsd:complexType> </xsd:schema>
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [Elist Home]
Powered by eList eXpress LLC