网站源码程序下载,怎样让自己的网站被收录,网站如何推广方式,字体中国设计网恩#xff0c;我想说的是#xff0c;是不是经常有人在开发的时候#xff0c;特别是和第三方有接口的时候#xff0c;走的是SOAP协议#xff0c;然后用户给你一个WSDL文件#xff0c;说按照上面的进行适配#xff0c;嘿嘿#xff0c;这个时候#xff0c;要是你以前没有… 恩我想说的是是不是经常有人在开发的时候特别是和第三方有接口的时候走的是SOAP协议然后用户给你一个WSDL文件说按照上面的进行适配嘿嘿这个时候要是你以前没有开发过肯定会傻眼那如果你想学习的话就认真的看下面的讲解咯
一、WSDL概述 WebServices Description Language (WSDL Web服务语言)是一个用于精确描述Web Service的文档格式。 WSDL非常适合于用作代码生成器它能够读取WSDL文档并且可以为访问Web服务生成一个程序化的接口大多数软件供应商和主要的标准机构包括 W3C、WS-I和OASIS都支持WSDL。例如JAX-RPC provider例如BEA Weblogic通过API用WSDL生成相应的占位程序IBM WebSphere、Microsoft.NET以及Apache Axis都有自己的工具生成相关的代码。下图是一个例子 上面的例子JAX-RPC通过读取WSDL文档创建JAX-RPC RMI接口endpoint接口和实现此接口的网络占位程序stub。客户端程序通过RMI接口Stub和Web Service服务端交换SAOP消息。
二、WSDL基本结构 WSDL文档是一个遵循WSDL XML模式的XML文档文档实例类似于SOAP文档是一个遵循SOAP XML模式的XML文档文档实例 一个WSDL文档的根元素是definitions元素WSDL文档包含7个重要的元素types, import, message, portType, operations, binding和service元素。 三、WSDL声明 3.1 XML声明 ? xml version1.0 encodingUTF-8 ?WSDL的声明必须定义成使用UTF-8 或者UTF-16 编码。 3.2 definition元素 所有WSDL文档的根元素都是definition元素。 definitions name BookQuoteWS targetNamespace http://www.Monson-Haefel.com/jwsbook/BookQuote xmlns:mh http://www.Monson-Haefel.com/jwsbook/BookQuote xmlns:soapbind http://schemas.xmlsoap.org/wsdl/soap/ xmlns:xsd http://www.w3.org/2001/XMLSchema xmlns http://schemas.xmlsoap.org/wsdl/ definition元素中一般包括若干个XML命名空间 http://schemas.xmlsoap.org/wsdl/是默认的命名空间这样就可以不用显式地定义每一个WSDL元素的命名空间了例如 types messages portType …文档中所有的元素缺省应该属于这个命名空间。definition元素的的一个属性是name此属性不重要可以没有 定义了targetNamespace命名空间它为在模式中显式创建的所有新类型均声明了XML命名空间而且上面的例子中赋予了mh前缀。 !-- message elements describe the input and output parameters -- message name GetBookPriceRequest part name isbn type xsd:string / / message message name GetBookPriceResponse part name price type xsd:float / / message !-- portType element describes the abstract interface of a Web service -- portType name BookQuote operation name getBookPrice input name isbn message mh:GetBookPriceRequest / output name price message mh:GetBookPriceResponse / / operation / portType 上面的例子中message元素利用name属性指定了标签例如GetBookPriceRequest这些标签会自动使用targetNamespace的命名空间标签了的messages元素通常被称为定义。 文档中的其他元素用标签和命名空间前缀去应用定义例如上面的例子中input元素是使用mh:GetBookPriceRequest来引用标签GetBookPriceRequest。 3.3 Types元素 Types元素用作一个容器定义了自定义的特殊数据类型在声明消息部分有效负载的时候messages定义使用了types元素中定义的数据类型与元素。 ? xml version1.0 encodingUTF-8 ? definitions name BookQuoteWS targetNamespace http://www.Monson-Haefel.com/jwsbook/BookQuote xmlns:mh http://www.Monson-Haefel.com/jwsbook/BookQuote xmlns:soapbind http://schemas.xmlsoap.org/wsdl/soap/ xmlns:xsd http://www.w3.org/2001/XMLSchema xmlns http://schemas.xmlsoap.org/wsdl/ types xsd:schema targetNamespace http://www.Monson-Haefel.com/jwsbook/BookQuote !-- The ISBN simple type -- xsd:simpleType name ISBN xsd:restriction base xsd:string xsd:pattern value [0-9]{9}[0-9Xx] / / xsd:restriction / xsd:simpleType / xsd:schema / types Types元素作为一个容器用来定义XML模式内置的数据类型即复杂类型和定制的简单类现详细见Web Service XML文章中没有描述的各种数据类型。例如ISBN。 上面的例子中types元素中直接嵌套了一个完整的W3C XML模式文档此文档中targetNamespace必须是一个有效的非空值而且必须属于由WSDL文档。 3.4 Import元素 Import元素可以让当前的文档使用其他WSDL文档中指定命名空间中的定义。 definitions name AllMhWebServices xmlns http://schemas.xmlsoap.org/wsdl/ import namespace http://www.Monson-Haefel.com/jwsbook/BookQuote location http://www.Monson-Haefel.com/jwsbook/BookPrice.wsdl / import namespace http://www.Monson-Haefel.com/jwsbook/po location http://www.Monson-Haefel.com/jwsbook/wsdl/PurchaseOrder.wsdl / import namespace http://www.Monson-Haefel.com/jwsbook/Shipping location http://www.Monson-Haefel.com/jwsbook/wsdl/Shipping.wsdl / / definitions WSDL的import元素必须声明两个属性即namespace属性和location属性。 namespace属性必须和正导入的WSDL文档中声明的targetNamespace相匹配。 location属性必须指向一个实际的WSDL文档。 四、WSDL抽象接口 Message、portType和operation元素用于描述Web服务的抽象接口相当于JAVA或者C中编程中的类的接口。其中portType相当于类接口的名称operation相当于接口中包含的函数message相当于函数的参数和返回值。 4.1 Message元素 Message元素描述了Web服务的有效负载。相当于函数调用中的参数和返回值。 message name GetBulkBookPriceRequest part name isbn type xsd:string / part name quantity type xsd:int / / message message name GetBulkBookPriceResponse part name price type mh:prices / / message RPC式样的Web服务的message服务GetBulkBookPriceRequest表示消息的输入相当于函数的参数GetBulkBookPriceResponse表示消息的输出相当于函数的返回值Web Service的输入和输出参数可以是多个一个特点每一个输入或者输出使用part元素定义RPC样式必须使用type来定义类型RPC样式用类型来数据定义过程调用调用中的每一个元素表示某一个类型的参数。 types xsd:schema targetNamespace http://www.Monson-Haefel.com/jwsbook/PO !-- Import the PurchaseOrder XML schema document -- xsd:import namespace http://www.Monson-Haefel.com/jwsbook/PO schemaLocation http://www.Monson-Haefel.com/jwsbook/po.xsd / / xsd:schema / types !-- message elements describe the input and output parameters -- message name SubmitPurchaseOrderMessage part name order element mh:purchaseOrder / / message 文档式样Web服务的Messages元素当用户采用文档式样消息传递模式的时候messages元素要应用types定义中的顶级元素。具体顶级元素的定义和XML schema详见Web Server XML文档。消息部分使用element属性定义文档式样的消息传递要交换XML文档并且应用它们的顶级元素。注Messages元素的RPC/Document试样对应了SOAP RPC/Document消息传递模式详细见Web Server SOAP相关文档 types xsd:schema targetNamespace http://www.Monson-Haefel.com/jwsbook/PO !-- Import the PurchaseOrder XML schema document -- xsd:element name InvalidIsbnFaultDetail xsd:complexType xsd:sequence xsd:element name offending-value type xsd:string / xsd:element name conformance-rules type xsd:string / / xsd:sequence / xsd:complexType / xsd:element / xsd:schema / types !-- message elements describe the input and output parameters -- message name GetBookPriceRequest part name isbn type xsd:string / / message message name GetBookPriceResponse part name price type xsd:float / / message message name InvalidArgumentFault part name error_message element mh:InvalidIsbnFaultDetail / / message 声明错误消息错误使用的消息定义只能采用Document/Literal编码样式上面声明了匿名类型InvalidIsbnFaultDetail不需要type类型complexType中也不包括name属性详细见Web Service XML相关文档。4.2 portType元素 PortType元素定义了Web服务的抽象接口它可以由一个或者多个operation元素每个operation元素定义了一个RPC样式或者文档样式的Web服务方法。 4.3 operation元素 Operation元素要用一个或者多个messages消息来定义它的输入、输出以及错误。 message name GetBulkBookPriceRequest part name isbn type xsd:string / part name quantity type xsd:int / / message message name GetBulkBookPriceResponse part name prices type mh:prices / / message message name InvalidArgumentFault part name error_message element mh:InvalidIsbnFaultDetail / / message portType name GetBulkBookPrice operation name getBulkBookPrice parameterOrder isbn quantity input name request message mh:GetBulkBookPriceRequest / output name prices message mh:GetBulkBookPriceResponse / fault name InvalidArgumentFault message mh:InvalidArgumentFault / / operation / portType Input表示传递到Web服务的有效负载output表示返回给客户的有效负载可以不包括也可以包括一个或者多个fault错误消息。parameterOrder定义了input和output消息采用的正确的顺序使用parameterOrder的时候必须包含所有输入参数部分并且只包含不是返回类型的输出部分如果output只有一个part上例会假设返回值所以不包括在parameterOrder中如果parameterOrder列出output中的part部分那么这个将被作为OUT参数如果input元素和output元素使用相同的名称声明了一个部分的时候此部分为INOUT参数4.4 WSDL消息交换模式MEP Messaging Exchange Patterns(MEP) Web服务中使用了四种消息交换模式即请求/响应、单向、通知以及恳求/响应模式。大多数基于WSDL的web服务使用请求/响应和单向两种模式。 WSDL通过operation元素的input/output来定义使用那种模式如果有inputoutput可选的fault参数那就使用请求/响应模式如果只使用input那就使用单向模式。 在通知模式中Web服务将消息发送给客户但不等待回复一般客户通过注册来接收通知在恳求/响应模式中类似通知模式唯一的区别要期待客户对Web服务的响应。 五、WSDL实现binding元素 Binding元素将一个抽象的portType映射到一组具体的协议SOAP或者HTTP、消息传递样式RPC或者document以及编码样式literal或者SOAP encoding。 Binding的类似于将接口或者函数的调用绑定到某种协议上例如CORBA、COM或者RPC的方式这里使用SOAP协议。 5.1 soapbind:binding元素 binding name BookPrice_Binding type mh:BookQuote soapbind:binding style rpc transport http://schemas.xmlsoap.org/soap/http / operation name getBookPrice soapbind:binding元素指定了用于传输SOAP消息的Internet协议以及operation缺省的消息类型RPC还是文档类型http://schemas.xmlsoap.org/soap/http表示采用的是HTTP的传输方式当然也可以用HTTPS,用户具体使用HTTP还是HTTPS取决于Port元素中定义的location属性声明中的模式。上面的rpc表示缺省状态下operation将采用RPC的方式传递消息负载。5.2 soapbind:operation元素 operation name getBookPrice soapbind:operation style rpc soapAction http://www.Monson-Haefel.com/jwsbook/BookQuote/GetBookPrice /POST 1ed/BookQuote HTTP/1.1Host: www.Monson-Haefel.comContent-Type: text/xml; charsetutf-8Content-Length: nnnnSOAPActionhttp://www.Monson-Haefel.com/jwsbook/BookQuote/GetBookPricesoapbind:operation元素指定了消息传递样式RPC或者document并且指定了SOAPAction字段的值。上面的例子显示在HTTP消息中的SOAPAction中对应的值5.3 soapbind:body元素 operation name getBookPrice soapbind:operation style rpc / input soapbind:body use literal namespace http://www.Monson-Haefel.com/jwsbook/BookQuote / / input output soapbind:body use literal namespace http://www.Monson-Haefel.com/jwsbook/BookQuote / / output operation name submit soapbind:operation style document / input soapbind:body use literal / / input output soapbind:body use literal / / output / operation soapbind:body元素有四个属性use、namespace、part和encodingStyle对于WS-I use的属性值必须是literal意味这不是用编码的方式所以永远不会用到encodingStyle属性在RPC样式中必须用一个有效的URI指定的namespace属性。此URI可以于WSDL文档的targetNampspce相同而在document样式中不能使用namespaceXML文档样式的命名空间派生于它的XML文档5.4 soapbind:fault元素 fault name InvalidArgumentFault soapbind:fault name InvalidArgumentFault use literal / / fault portType name BookQuote operation name getBookPrice input name isbn message mh:GetBookPriceRequest / output name price message mh:GetBookPriceResponse / fault name InvalidArgumentFault message mh:InvalidArgumentFault / / operation / portType soapbind:fault元素和fault元素包含一个强制性的name属性表示要引用声明于对应portType中的专有错误消息5.5 soapbind:header元素 types xsd:schema targetNamespace http://www.Monson-Haefel.com/jwsbook/BookQuote xmlns http://www.w3.org/2001/XMLSchema xsd:element name message-id type string / / xsd:schema / types !-- message elements describe the input and output parameters -- message name Headers part name message-id element mh:message-id / / message operation name getBookPrice input soapbind:header message mh:Headers part message-id use literal / soapbind:body use literal namespace http://www.Monson-Haefel.com/jwsbook/BookQuote / / input WSDL在绑定的input元素、output元素中利用soapbind:header元素显式指定了一个SOAP头文件5.6 soapbind:headerfault元素 !-- message elements describe the input and output parameters -- message name HeaderFault part name faultDetail element mh:detailMessage / / message input soapbind:header message mh:Header use literal soapbind:headerfault message mh:Headers use literal / / soapbind:header soapbind:body use literal namespace http://www.Monson-Haefel.com/jwsbook/BookQuote / / input soapbind:headerfault元素表述了Header专用的错误消息如果有一个响应消息必须在消息的Header元素中返回各种header的专用错误。SOAP没有就如何提供Header错误方面给出详细说明只是要求必须在Header元素中包含detail元素。有些SOAP工具箱将SOAP的fault放在header元素中。六、WSDL实现Service和Port元素 service name BookPriceService port name BookPrice_Port binding mh:BookPrice_Binding soapbind:address location http://www.Monson-Haefel.com/jwsbook/BookQuote / / port port name BookPrice_Failover_Port binding mh:BookPrice_Binding soapbind:address location http://www.monson-haefel.org/jwsbook/BookPrice / / port port name SubmitPurchaseOrder_Port binding mh:SubmitPurchaseOrder_Binding soapbind:address location https://www.monson-haefel.org/jwsbook/po / / port / service Service元素包含一个或者多个Port元素每一个Port元素对应一个不同的Web服务port将一个URL赋予一个特定的binding通过location实现可以使两个或者多个port元素将不同的URL赋给相同的binding例如负载平衡和容错的时候使用这种方法。soapbind:address将Internet地址通过location属性赋予一个SOAP绑定。