当前位置: 首页 > news >正文

基本的网站开发技术路线搜索引擎市场份额2023

基本的网站开发技术路线,搜索引擎市场份额2023,设计个企业网站网页咋弄,淘宝销售书网站建设方案为什么使用WSDL? 像Internet协议之类的标准有没有为权威所利用#xff0c;或者人们这样看待它是因为顺之所获的好处远远超出了代价#xff1f;曾经有许多试图建立的标准都流产了。有时候#xff0c;那些还没有普遍使用的标准甚至由法令或政府规定强行推出#xff1a;Ada语…为什么使用WSDL? 像Internet协议之类的标准有没有为权威所利用或者人们这样看待它是因为顺之所获的好处远远超出了代价曾经有许多试图建立的标准都流产了。有时候那些还没有普遍使用的标准甚至由法令或政府规定强行推出Ada语言就是一例。 我相信正是跟随标准所带来的好处使它广泛接受。例如对于铁路服务来说真正重要的是不同公司所铺设的铁路结合到一起或者是来自好几个公司的产品协调的工作在一起。几家大的企业合力建立了SOAP标准。Web Service描述语言(WSDL)向这种Web Service的提供商和用户推出了方便的协调工作的方法使我们能更容易的获得SOAP的种种好处。几家公司的铁道并在一起不算什么难事他们所需遵循的只是两轨间的标准距离。对Web Service来说这要复杂得多。我们必须先制定出指定接口的标准格式。 曾经有人说SOAP并不真需要什么接口描述语言。如果SOAP是交流纯内容的标准那就需要一种语言来描述内容。SOAP消息确实带有某些类型信息因此SOAP允许动态的决定类型。但不知道一个函数的函数名、参数的个数和各自类型怎么可能去调用这个函数呢没有WSDL我可以从必备文档中确定调用语法或者检查消息。随便何种方法都必须有人参与这个过程可能会有错。而使用了WSDL我就可以通过这种跨平台和跨语言的方法使Web Service代理的产生自动化。就像COM和CORBA的IDL文件WSDL文件由客户和服务器约定。 注意由于WSDL设计成可以绑定除SOAP以外的其他协议这里我们主要关注WSDL在HTTP上和SOAP的关系。同样由于SOAP目前主要用来调用远程的过程和函数WSDL支持SOAP传输的文档规范。WSDL 1.1已经作为记录递交给W3C见http://www.w3.org/TR/wsdl.htmlWSDL文档结构 若要理解XML文档将之看作块状图表非常有用。下图以XML的文档形式说明了WSDL的结构它揭示了WSDL文档五个栏之间的关系。 WSDL文档可以分为两部分。顶部分由抽象定义组成而底部分则由具体描述组成。抽象部分以独立于平台和语言的方式定义SOAP消息它们并不包含任何随机器或语言而变的元素。这就定义了一系列服务截然不同的网站都可以实现。随网站而异的东西如序列化便归入底部分因为它包含具体的定义。l 抽象定义 Types 独立与机器和语言的类型定义 Messages 包括函数参数输入与输出分开或文档描述 PortTypes 引用消息部分中消息定义来描述函数签名操作名、输入参数、输出参数2 具体定义 Bindings PortTypes部分的每一操作在此绑定实现 Services 确定每一绑定的端口地址下面的图中箭头连接符代表文档不同栏之间的关系。点和箭头代表了引用或使用关系。双箭头代表修改关系。3-D的箭头代表了包含关系。这样各Messages栏使用Types栏的定义PortTypes栏使用Messages栏的定义Bindings栏引用了PortTypes栏Services栏引用Bindings栏PortTypes和Bindings栏包含了operation元素而Services栏包含了port元素。PortTypes栏里的operation元素由Bindings栏里的operation元素进一步修改或描述。 在此背景中我将使用标准的XML术语来描述WSDL文档。Element是指XML的元素而attribute指元素的属性。于是 element attributeattribute-valuecontents/element 内容也可能由一个或多个元素以递归的方式组成。根元素是所有元素之中最高级的元素。子元素总是从属于另一个元素父元素。 注意文档之中可能只有一个Types栏或根本没有。所有其他的栏可以只有零元素、单元素或是多元素。WSDL的列表要求所有的栏以固定的顺序出现import, types, message, portType, binding, service。所有的抽象可以是单独存在于别的文件中也可以从主文档中导入。 图一抽象定义和具体定义   WSDL文件示例 让我们来研究一下WSDL文件看看它的结构以及如何工作。请注意这是一个非常简单的WSDL文档实例。我们的意图只是说明它最显著的特征。以下的内容中包括更加详细的讨论。 ?xml version1.0 encodingUTF-8 ? definitions nameFooSample targetNamespacehttp://tempuri.org/wsdl/ xmlns:wsdlnshttp://tempuri.org/wsdl/ xmlns:typenshttp://tempuri.org/xsd xmlns:xsdhttp://www.w3.org/2001/XMLSchema xmlns:soaphttp://schemas.xmlsoap.org/wsdl/soap/ xmlns:stkhttp://schemas.microsoft.com/soap-toolkit/wsdl-extension xmlnshttp://schemas.xmlsoap.org/wsdl/ types schema targetNamespacehttp://tempuri.org/xsd xmlnshttp://www.w3.org/2001/XMLSchema xmlns:SOAP-ENChttp://schemas.xmlsoap.org/soap/encoding/ xmlns:wsdlhttp://schemas.xmlsoap.org/wsdl/ elementFormDefaultqualified /schema /types message nameSimple.foo part namearg typexsd:int/ /message message nameSimple.fooResponse part nameresult typexsd:int/ /message portType nameSimplePortType operation namefoo parameterOrderarg input messagewsdlns:Simple.foo/ output messagewsdlns:Simple.fooResponse/ /operation /portType binding nameSimpleBinding typewsdlns:SimplePortType stk:binding preferredEncodingUTF-8 / soap:binding stylerpc transporthttp://schemas.xmlsoap.org/soap/http/ operation namefoo soap:operation soapActionhttp://tempuri.org/action/Simple.foo/ input soap:body useencoded namespacehttp://tempuri.org/message/ encodingStylehttp://schemas.xmlsoap.org/soap/encoding/ / /input output soap:body useencoded namespacehttp://tempuri.org/message/ encodingStylehttp://schemas.xmlsoap.org/soap/encoding/ / /output /operation /binding service nameFOOSAMPLEService port nameSimplePort bindingwsdlns:SimpleBinding soap:address locationhttp://carlos:8080/FooSample/FooSample.asp/ /port /service /definitions 以下是该实例文档的总述稍后我将详细讨论每一部分的细节。 第一行申明该文档是XML。尽管这并不是必需的但它有助于XML解析器决定是否解析WSDL文件或只是报错。第二行是WSDL文档的根元素definitions。一些属性附属于根元素就像schema子元素对于types元素。 types元素包含了Types栏。如果没有需要声明的数据类型这栏可以缺省。在WSDL范例中没有应用程序特定的types声明但我仍然使用了Types栏只是为了声明schema namespaces。 message元素包含了Messages栏。如果我们把操作看作函数message元素定义了那个函数的参数。message元素中的每个part子元素都和某个参数相符。输入参数在message元素中定义与输出参数相隔离--输出参数有自己的message元素。兼作输入、输出的参数在输入输出的message元素中有它们相应的part元素。输出message元素以Response结尾就像以前所用的fooResponse。每个part元素都有名字和类型属性就像函数的参数有参数名和参数类型。 用于交换文档时WSDL允许使用message元素来描述交换的文档。 part元素的类型可以是XSD基类型也可以是SOAP定义类型(soapenc)、WSDL定义类型(wsdl)或是Types栏定义的类型。 一个PortTypes栏中可以有零个、单个或多个portType元素。由于抽象PortType定义可以放置在分开的文件中在某个WSDL文件中没有portType元素是可能的。上面的例子里只是用了一个portType元素。而一个portType元素可在operation元素中定义一个或是多个操作。示例仅使用了一个名为foo的operation元素。这和某个函数名相同。operation元素可以有一个、两个、三个子元素input, output 和fault元素。每个input和output元素中的消息都引用Message栏中的相关的message元素。这样示例中的整个portType元素就和以下的C函数等效 int foo(int arg); 这个例子足见XML和C相比要冗长的多。包括message元素XML在示例中共使用了12行代码来表达相同的单行函数声明。 Bindings栏可以有零个、一个或者多个binding元素。它的意图是制定每个operation通过网络调用和回应。Services栏同样可以有零个、一个、多个service元素。它还包含了port元素每个port元素引用一个Bindings栏里的binding元素。Bindings和Services栏都包含WSDL文档。 Namespace definitions和子节点schema都是namespace属性 definitions nameFooSample targetNamespacehttp://tempuri.org/wsdl/ xmlns:wsdlnshttp://tempuri.org/wsdl/ xmlns:typenshttp://tempuri.org/xsd xmlns:xsdhttp://www.w3.org/2001/XMLSchema xmlns:soaphttp://schemas.xmlsoap.org/wsdl/soap/ xmlns:stkhttp://schemas.microsoft.com/soap-toolkit/wsdl-extension xmlnshttp://schemas.xmlsoap.org/wsdl/ types schema targetNamespacehttp://tempuri.org/xsd xmlnshttp://www.w3.org/2001/XMLSchema   xmlns:SOAP-ENChttp://schemas.xmlsoap.org/soap/encoding/ xmlns:wsdlhttp://schemas.xmlsoap.org/wsdl/ elementFormDefaultqualified /schema /types 每个namespace属性都声明了一个缩略语用在文档中。例如xmlns:xsd就为 http://www.w3.org/2001/XMLSchema定义了一个缩略语xsd。这就允许对该namespace的引用只需简单的在名字前加上前缀就可以了如xsd:int中的xsd就是合法的类型名。普通范围规则可运用于缩略前缀。也就是说前缀所定义的元素只在元素中有效。 Namespace派什么用namespace的作用是要避免命名冲突。如果我建立一项Web Service其中的WSDL文件包含一个名为foo的元素而你想要使用我的服务与另一项服务连接作为补充这样的话另一项服务的WSDL文件就不能包含名为foo的元素。两个服务器程序只有在它们在两个事例中表示完全相同的东西时才可以取相同的名字。如果有了表示区别的namespace我的网络服务里的foo就可以表示完全不同于另一个网络服务里foo的含义。在你的客户端里你只要加以限制就可以引用我的foo。 见下例http://www.infotects.com/fooService#foo 就是完全限制的名字相当于carlos:foo如果我声明了carlos作为http://www.infotects.com/fooService的快捷方式。请注意namespace中的URL是用来确定它们的唯一性的同时也便于定位。URL所指向的地方不必是实际存在的网络地址也可以使用GUID来代替或补充URL。例如GUID335DB901-D44A-11D4-A96E-0080AD76435D就是一个合法的namespace指派。 targetNamespace属性声明了一个namespace元素中所有的声明的名字都列于其内。在WSDL示例中definitions的targetNamespace 是http://tempuri.org/wsdl。这意味着所有在WSDL文档中声明的名字都属于这个namespace。schema元素有自己的targetNamespace属性其值为 http://tempuri.org/xsd 在schma元素中定义的所有名字都属于这个namespace而不是main的target namespace。 schema元素的以下这行声明了默认的namespace。Schema中所有有效的名字都属于这个namespace。 xmlnshttp://www.w3.org/2001/XMLSchema SOAP消息 对于使用WSDL的客户机和服务机来说研究WSDL文件的一种方法就是决定什么来接受所发送的信息。尽管SOAP使用底层协议如IP和HTTP等但应用程序决定了服务器与客户机之间交互的高级协议。也就是说进行一项操作比如echoint把输入的整数送回参数的数目、每个参数的类型、以及参数如何传送等因素决定了应用程序特定的协议。有很多方法可以确定此类协议但我相信最好的方法就是使用WSDL。如果我们用这种视角来看待它WSDL不只是一种接口协议而且是一种协议特定的语言。它就是我们超越固定协议IP、HTTP等所需要的应用程序特定协议。 WSDL可以确定SOAP消息是否遵从RPC或文档风格。RPC风格的消息就是示例中所用的看起来像是函数调用。而文档风格的消息则更普通嵌套层次更小。下面的XML消息就是示例WSDL文件解析后的发送/接受效果解析使用的是MS SOAP Toolkit 2.0MSTK2中的SoapClient对象。 从客户端调用foo(5131953)函数 ?xml version1.0 encodingUTF-8 standaloneno? SOAP-ENV:Envelope SOAP-ENV:encodingStylehttp://schemas.xmlsoap.org/soap/encoding/ xmlns:SOAP-ENVhttp://schemas.xmlsoap.org/soap/envelope/ SOAP-ENV:Body m:foo xmlns:mhttp://tempuri.org/message/ arg5131953/arg /m:foo /SOAP-ENV:Body /SOAP-ENV:Envelope从服务器接受的信息 ?xml version1.0 encodingUTF-8 standaloneno? SOAP-ENV:Envelope SOAP-ENV:encodingStylehttp://schemas.xmlsoap.org/soap/encoding/ xmlns:SOAP-ENVhttp://schemas.xmlsoap.org/soap/envelope/ SOAP-ENV:Body SOAPSDK1:fooResponse xmlns:SOAPSDK1http://tempuri.org/message/ result5131953/result /SOAPSDK1:fooResponse /SOAP-ENV:Body /SOAP-ENV:Envelope 两函数都调用了消息其回应是有效的XML。SOAP消息由几部分组成首先是Envelop元素包含一个可选的Header元素以及至少一个body元素。Rpc函数所调用的消息体有一个根据操作foo命名的元素而回应信息体有一个fooResponse元素。Foo元素有一个部分arg就和WSDL中描述的一样是单参数的。fooResponse也相应的有一个result的部分。注意encodingStyle、envelope和message的namespace和WSDL Bindings栏中的预定义的一致重复如下 binding nameSimpleBinding typewsdlns:SimplePortType stk:binding preferredEncodingUTF-8 / soap:binding stylerpc transporthttp://schemas.xmlsoap.org/soap/http/ operation namefoo soap:operation soapActionhttp://tempuri.org/action/Simple.foo/ input soap:body useencoded namespacehttp://tempuri.org/message/ encodingStyle http://schemas.xmlsoap.org/soap/encoding/ / /input output soap:body useencoded namespacehttp://tempuri.org/message/ encodingStyle http://schemas.xmlsoap.org/soap/encoding/ / /output /operation /binding WSDL的Types栏和Messages栏中的XML Schema WSDL数据类型是基于XML Schema:Datatypes(XSD)的现在已经被W3C推荐。这一文档共有三个版本19992000/102001因此必须在namespace属性的definitions元素中指明所使用的是哪一个版本。 xmlns:xsdhttp://www.w3.org/2001/XMLSchema 在本文中我将只考虑2001版本。WSDL标准的推荐者强烈建议使用2001版。 在本栏和以后各部分需使用以下简缩或前缀 前缀 代表的Namespace 描述 Soapenc http://schemas.xmlsoap.org/soap/encoding SOAP 1.1 encoding Wsdl http://schemas.xmlsoap.org/wsdl/soap WSDL 1.1 Xsd http://www.w3.org/2001/XMLSchema XML Schema XSD基类型 下表是直接从MSTK2文档中取出的列举了MSTK2所支持的所有XSD基类型。它也告诉在客户端或服务器端的WSDL读取程序如何把XSD类型映射到在VB、C和IDL中相应的类型。 XSD (Soap)类型 变量类型 VB C IDL Comments anyURI VT_BSTR String BSTR BSTR   base64Binary VT_ARRAY | VT_UI1 Byte() SAFEARRAY SAFEARRAY(unsigned char)   Boolean VT_BOOL Boolean VARIANT_BOOL VARIANT_BOOL   Byte VT_I2 Integer short short 转换时验证范围有效性 Date VT_DATE Date DATE DATE 时间设为 oo:oo:oo DateTime VT_DATE Date DATE DATE   Double VT_R8 Double double double   Duration VT_BSTR String BSTR BSTR 不转换和生效 ENTITIES VT_BSTR String BSTR BSTR 不转换和生效 ENTITY VT_BSTR String BSTR BSTR 不转换和生效 Float VT_R4 Single float float   GDay VT_BSTR String BSTR BSTR 不转换和生效 GMonth VT_BSTR String BSTR BSTR 不转换和生效 GMonthDay VT_BSTR String BSTR BSTR 不转换和生效 GYear VT_BSTR String BSTR BSTR 不转换和生效 GYearMonth VT_BSTR String BSTR BSTR 不转换和生效 ID VT_BSTR String BSTR BSTR 不转换和生效 IDREF VT_BSTR String BSTR BSTR 不转换和生效 IDREFS VT_BSTR String BSTR BSTR 不转换和生效 Int VT_I4 Long long long   Integer VT_DECIMAL Variant DECIMAL DECIMAL 转换时范围生效 Language VT_BSTR String BSTR BSTR 不转换和生效 Long VT_DECIMAL Variant DECIMAL DECIMAL 转换时范围生效 Name VT_BSTR String BSTR BSTR 不转换和生效 NCName VT_BSTR String BSTR BSTR 不转换和生效 negativeInteger VT_DECIMAL Variant DECIMAL DECIMAL 转换时范围生效 NMTOKEN VT_BSTR String BSTR BSTR 不转换和生效 NMTOKENS VT_BSTR String BSTR BSTR 不转换和生效 nonNegativeIntege VT_DECIMAL Variant DECIMAL DECIMAL 转换时范围生效 nonPositiveInteger VT_DECIMAL Variant DECIMA DECIMAL 转换时范围生效 normalizedString VT_BSTR String BSTR BSTR   NOTATION VT_BSTR String BSTR BSTR 不转换和生效 Number VT_DECIMAL Variant DECIMAL DECIMAL   positiveInteger VT_DECIMAL Variant DECIMAL DECIMAL 转换时范围生效 Qname VT_BSTR String BSTR BSTR 不转换和生效 Short VT_I2 Integer short short   String VT_BSTR String BSTR BSTR   Time VT_DATE Date DATE DATE 日设为1899年12月30日 Token VT_BSTR String BSTR BSTR 不转换和生效 unsignedByte VT_UI1 Byte unsigned char unsigned char   UnsignedInt VT_DECIMAL Variant DECIMAL DECIMAL 转换时范围生效 unsignedLong VT_DECIMAL Variant DECIMAL DECIMAL 转换时范围生效 unsignedShort VT_UI4 Long Long Long 转换时范围生效 XSD定义了两套内建的数据类型原始的和派生的。在下文中查阅内建数据类型的层次十分有益 http://www.w3.org/TR/2001/PR-xmlschema-2-20010330  complex类型 XML schema允许complex类型的定义就像C里是struct。例如为了定义类似如下的C的struct类型 typedef struct { string firstName; string lastName; long ageInYears; float weightInLbs; float heightInInches; } PERSON; 我们可以写XML schema xsd:complexType namePERSON xsd:sequence xsd:element namefirstName typexsd:string/ xsd:element namelastName typexsd:string/ xsd:element nameageInYears typexsd:int/ xsd:element nameweightInLbs typexsd:float/ xsd:element nameheightInInches typexsd:float/ /xsd:sequence /xsd:complexType 不过complex类型可以表达比struct更多的信息。除了sequence以外它还可以有其他的子元素比如all xsd:complexType namePERSON xsd:all xsd:element namefirstName typexsd:string/ xsd:element namelastName typexsd:string/ xsd:element nameageInYears typexsd:int/ xsd:element nameweightInLbs typexsd:float/ xsd:element nameheightInInches typexsd:float/ /xsd:all /xsd:complexType 这意味着element的成员变量可以以任何顺序排列每一个都是可选的。这和C中的struct类型不太一样。 注意内建数据类型string, int, float。C的string也是XML的stringfloat也类似。但C中的long类型在XML中是int上表中。 在WSDL文件中像上面的complex类型可以在Types栏声明。例如我可以用以下方式声明PERSON类型并用在Messages栏。 ?xml version1.0 encodingUTF-8 ? definitions … types schema targetNamespacesomeNamespace xmlns:typenssomeNamespace xsd:complexType namePERSON xsd:sequence xsd:element namefirstName typexsd:string/ xsd:element namelastName typexsd:string/ xsd:element nameageInYears typexsd:int/ xsd:element nameweightInLbs typexsd:float/ xsd:element nameheightInInches typexsd:float/ /xsd:sequence /xsd:complexType /schema /types message nameaddPerson part nameperson typetypens:PERSON/ /message message nameaddPersonResponse part nameresult typexsd:int/ /message /definitions 上例中第一个消息由adperson并且有一个part其类型为PERSON。PERSON类型是在Types栏声明的。 如果我们使用完整的WSDL文件包含以上的部分并以之初始化MSTK2 SoapClient它将成功的解析该文件。当然它不会去调用addPerson。这是因为SoapClient本身并不知道如何处理complex类型它需要定制类型映射来处理complex类型。MSTK2文档中有包含定制类型映射的示例。 还有另一种方法可以把part元素联系到类型声明。这就是使用元素。下例中我将Types栏中声明两个元素Person和Gendr然后我将在addPersonmessage中使用元素属性来引用它们。 ?xml version1.0 encodingUTF-8 ? definitions … types schema targetNamespacesomeNamespace xmlns:typenssomeNamespace element namePerson xsd:complexType xsd:sequence xsd:element namefirstName typexsd:string/ xsd:element namelastName typexsd:string/ xsd:element nameageInYears typexsd:int/ xsd:element nameweightInLbs typexsd:float/ xsd:element nameheightInInches typexsd:float/ /xsd:sequence /xsd:complexType /element element nameGender xsd:simpleType xsd:restriction basexsd:string xsd:enumeration valueMale / xsd:enumeration valueFemale / /xsd:restriction /xsd:simpleType /element /schema /types message nameaddPerson part namewho elementtypens:Person/ part namesex elementtypens:Gender/ /message message nameaddPersonResponse part nameresult typexsd:int/ /message /definitions Types栏中的Genderelement里嵌入了枚举类型其枚举值为MaleFemale。然后我又在addPersonmessage中通过元素属性而不是类型属性来引用它。 元素属性和类型属性在把某特定类型关联到part时有什么不同呢使用元素属性我们可以描述一个部分它可以假定几个类型就像变量一样而是用类型属性我们就无法这样做。下例说明了这一点。 ?xml version1.0 encodingUTF-8 ? definitions … types schema targetNamespacesomeNamespace xmlns:typenssomeNamespace xsd:complexType namePERSON xsd:sequence xsd:element namefirstName typexsd:string/ xsd:element namelastName typexsd:string/ xsd:element nameageInYears typexsd:int/ xsd:element nameweightInLbs typexsd:float/ xsd:element nameheightInInches typexsd:float/ /xsd:sequence /xsd:complexType xsd:complexType namefemalePerson xsd:complexContent xsd:extension basetypens:PERSON xsd:element namefavoriteLipstick typexsd:string / /xsd:extension /xsd:complexContent /xsd:complexType xsd:complexType namemalePerson xsd:complexContent xsd:extension basetypens:PERSON xsd:element namefavoriteShavingLotion typexsd:string / /xsd:extension /xsd:complexContent /xsd:complexType xsd:complexType namemaleOrFemalePerson xsd:choice xsd:element namefArg typetypens:femalePerson xsd:element namemArg typetypens:malePerson / /xsd:choice /xsd:complexType /schema /types message nameaddPerson part nameperson typetypens:maleOrFemalePerson/ /message message nameaddPersonResponse part nameresult typexsd:int/ /message /definitions 上例也告诉我们extension的派生。femailPerson和malePerson都是从PERSON派生出来的。它们各有一些额外的元素femalePerson有favoriteLipstick元素malePerson有favoriteShavingLotion元素。两派生类型都归入一个complex类型maleOrFemalePerson使用的是choice构造。最后在adpersonmessage中新类型有personpart引用。这样参数或part就可以是femalePerson或malePerson了。 数组 XSD提供list结构来声明一个数组元素之间有空格界定。不过SOAP不是使用XSD来编码数组的它定义了自己的数组类型--SOAP-ENC: Array。下列的例子揭示了从这一类型派生出一位整数数组的方法 xsd:complexType nameArrayOfInt xsd:complexContent xsd:restriction basesoapenc:Array attribute refsoapenc:arrayType wsdl:arrayTypexsd:int[]/ /xsd:restriction /xsd:complexContent /xsd:complexType 新的complex类型从soapenc:array限制派生。然后又声明了complex类型的一个属性。引用soapenc:arrayType实际上是这样完成的 xsd:attribute namearrayType typexsd:string/ wsdl:arrayType属性值决定了数组每个成员的类型。数组的成员也可以是Complex类型。 xsd:complexType nameArrayOfPERSON xsd:complexContent xsd:restriction basesoapenc:Array attribute refsoapenc:arrayType wsdl:arrayTypetypens:PERSON[]/ /xsd:restriction /xsd:complexContent /xsd:complexType WSDL要求数组的类型由ArrayOf和每个数组元素的类型串联而成。很显然顾名思义ArrayOfPERSON是PERSON结构的数组。下面我将使用ArrayOfPERSON来声明一个message并加入不止一个PERSON ?xml version1.0 encodingUTF-8 ? definitions … types schema targetNamespacesomeNamespace xmlns:typenssomeNamespace xsd:complexType namePERSON xsd:sequence xsd:element namefirstName typexsd:string/ xsd:element namelastName typexsd:string/ xsd:element nameageInYears typexsd:int/ xsd:element nameweightInLbs typexsd:float/ xsd:element nameheightInInches typexsd:float/ /xsd:sequence /xsd:complexType xsd:complexType nameArrayOfPERSON xsd:complexContent xsd:restriction basesoapenc:Array attribute refsoapenc:arrayType wsdl:arrayTypetypens:PERSON[]/ /xsd:restriction /xsd:complexContent /xsd:complexType /schema /types message nameaddPersons part nameperson typetypens:ArrayOfPERSON/ /message message nameaddPersonResponse part nameresult typexsd:int/ /message /definitions portType和operation元素 PortType定义了一些抽象的操作。PortType中的operation元素定义了调用PortType中所有方法的语法每一个operation元素声明了方法的名称、参数使用message元素和各自的类型part元素要在所有message中声明。 在一篇WSDL文档中可以有几个PortType元素每一个都和一些相关操作放在一起就和COM和一组操作的接口相似。 在operation元素中可能会有至多一个input元素一个output元素以及一个fault元素。三个元素各有一个名字和一个消息属性。 input, output, fault元素属性的名字有何含义呢它们可以用来区别两个同名操作重载。例如看下面两个C函数 void foo(int arg); void foo(string arg); 这种重载在WSDL中可以这样表示 ?xml version1.0 encodingUTF-8 ? definitions namefooDescription targetNamespacehttp://tempuri.org/wsdl/ xmlns:wsdlnshttp://tempuri.org/wsdl/ xmlns:typenshttp://tempuri.org/xsd xmlns:xsdhttp://www.w3.org/2001/XMLSchema xmlns:soaphttp://schemas.xmlsoap.org/wsdl/soap/ xmlns:stkhttp://schemas.microsoft.com/soap-toolkit/wsdl- extension xmlnshttp://schemas.xmlsoap.org/wsdl/ types schema targetNamespacehttp://tempuri.org/xsd xmlnshttp://www.w3.org/2001/XMLSchema xmlns:SOAP-ENChttp://schemas.xmlsoap.org/soap/encoding/ xmlns:wsdlhttp://schemas.xmlsoap.org/wsdl/ elementFormDefaultqualified /schema /types message namefoo1 part namearg typexsd:int/ /message message namefoo2 part namearg typexsd:string/ /message portType namefooSamplePortType operation namefoo parameterOrderarg input namefoo1 messagewsdlns:foo1/ /operation operation namefoo parameterOrderarg input namefoo2 messagewsdlns:foo2/ /operation /portType binding namefooSampleBinding typewsdlns:fooSamplePortType stk:binding preferredEncodingUTF-8 / soap:binding stylerpc transporthttp://schemas.xmlsoap.org/soap/http/ operation namefoo soap:operation soapActionhttp://tempuri.org/action/foo1/ input namefoo1 soap:body useencoded namespacehttp://tempuri.org/message/ encodingStylehttp://schemas.xmlsoap.org/soap/encoding/ / /input /operation operation namefoo soap:operation soapActionhttp://tempuri.org/action/foo2/ input namefoo2 soap:body useencoded namespacehttp://tempuri.org/message/ encodingStylehttp://schemas.xmlsoap.org/soap/encoding/ / /input /operation /binding service nameFOOService port namefooSamplePort bindingfooSampleBinding soap:address locationhttp://carlos:8080/fooService/foo.asp/ /port /service /definitions 到目前为止还没有一种SOAP的实现支持重载。这对基于JAVA的客户端十分重要因为JAVA服务器使用的接口用到JAVA的重载特性。而对基于COM的客户端就不那么重要因为COM是不支持重载的。 binding和operation元素 Binding栏是完整描述协议、序列化和编码的地方Types, Messages和PortType栏处理抽象的数据内容而Binding栏是处理数据传输的物理实现。Binding栏把前三部分的抽象定义具体化。 把相关的数据制定和消息声明分开这意味着同一类型服务的提供者可以把一系列的操作标准化。每个提供者可以提供定制的binding来互相区分。WSDL也有一个重要的结构使抽象定义可以放在分离的文件中而不是和Bindings和Services在一起这样可在不同的服务提供者之间提供标准化的抽象定义这很有帮助。例如银行可以用WSDL文档来标准化一些银行的操作。每个银行仍然可以自由的订制下层的协议、串行优化及编码。 下面是重载的WSDL示例 的Binding栏重复在此以便讨论 binding namefooSampleBinding typewsdlns:fooSamplePortType stk:binding preferredEncodingUTF-8 / soap:binding stylerpc transporthttp://schemas.xmlsoap.org/soap/http/ operation namefoo soap:operation soapActionhttp://tempuri.org/action/foo1/ input namefoo1 soap:body useencoded namespacehttp://tempuri.org/message/ encodingStyle http://schemas.xmlsoap.org/soap/encoding/ / /input /operation operation namefoo soap:operation soapActionhttp://tempuri.org/action/foo2/ input namefoo2 soap:body useencoded namespacehttp://tempuri.org/message/ encodingStyle http://schemas.xmlsoap.org/soap/encoding/ / /input /operation /binding binding元素已经取了一个名字本例中fooSampleBinding这样就可以被Services栏的port元素引用了。它有一个type的属性引用portType本例中就是wsdlns:fooSamplePortType。第二行是MSTK2的扩展元素stk:binding它指定了preferredEncoding属性为UTF-8。 soap:binding元素指定了所使用的风格rpc和传输方式。Transport属性应用了一个namespace正是这个namespace指明使用HTTP SOAP协议。 有两个同以foo命名的operation元素。唯一不同的是它们各自的input名字分别为foo1和foo2。两个operation元素中的soap:operation元素有同样的soapAction属性是URI。soapAction属性是SOAP特定的URI它只是简单的使用于SOAP消息。所产生的SOAP消息有一个SOAPAction头而URI也仅在soap:operation元素里才起作用。soapAction属性在HTTP的binding中是必需的但在其他非HTTP binding中却不要提供。目前它的使用并不清楚但它似乎有助于本例中的两个foo操作。SOAP 1.1指明soapAction用来确定消息的意图。似乎服务器可以在不解析整个消息的情况下就能使用这一属性来发送消息。实际上它的使用多种多样。soap:operation元素也可以包含另一属性即style属性在有必要冲突soap:binding元素指定的风格时可以使用。 operation属性可以包含input, output 和fault的元素它们都对应于PortType栏中的相同元素。只有input元素在上例中提供。这三个元素中的每一个可有一个可选的name属性在本例中我们用这种方法来区分同名操作。在本例的input元素中有一个soap:body元素它指定了哪些信息被写进SOAP消息的信息体中。该元素有以下属性Use 用于制定数据是encoded还是literal。Literal指结果SOAP消息包含以抽象定义Types, Messages, 和PortTypes指定格式存在的数据。Encoded指encodingStyle属性决定了编码方式。Namespace 每个SOAP消息体可以有其自己的namespace来防止命名冲突。这一属性制定的URI在结果SOAP消息中逐字使用。EncodingStyle 对SOAP编码它应该有以下URI值 http://schemas.xmlsoap.org/soap/encoding 文档风格实现 在前几栏中soap:binding元素有一个类型属性设为rpc。此属性设为document时会改变传输时消息的串行化。不同于函数签名现在的消息是文档传输的。在这类binding中message元素定义文档格式而不是函数签名。作为例子考虑以下WSDL片段 definitions xmlns:stns(SchemaTNS) xmlns:wtns(WsdlTNS) targetNamespace(WsdlTNS) schema targetNamespace(SchemaTNS) elementFormDefaultqualified element nameSimpleElement typexsd:int/ element nameCompositElement typestns:CompositeType/ complexType nameCompositeType all element namea typexsd:int/ element nameb typexsd:string/ /all /complexType /schema message... part namep1 typestns:CompositeType/ part namep2 typexsd:int/ part namep3 elementstns:SimpleElement/ part namep4 elementstns:CompositeElement/ /message … /definitions schema有两个元素SimpleElement和CompositeElement还有一个类型声明CompositeType。唯一声明的message元素有四个部分p1Composite型p2int型p3SimpleElement型p4CompositeElement型。以下有一个表对四种类型的use/type决定的binding作一比较rpc/literal, document/literal, rpc/encoded, 以及document/encoded。表指明了每种binding的表现。service和port元素 service是一套port元素。在一一对应形式下每个port元素都和一个location关联。如果同一个binding有多个port元素与之关联可以使用额外的URL地址作为替换。 一个WSDL文档中可以有多个service元素而且多个service元素十分有用其中之一就是可以根据目标URL来组织端口。这样我就可以方便的使用另一个service来重定向我的股市查询申请。我的客户端程序仍然工作因为这种根据协议归类的服务不随服务而变化。多个service元素的另一个作用是根据特定的协议划分端口。例如我可以把所有的HTTP端口放在同一个service中所有的SMTP端口放在另一个service里。我的客户可以搜索与它可以处理的协议相匹配的service。 service nameFOOService port namefooSamplePort bindingfooSampleBinding soap:address locationhttp://carlos:8080/fooService/foo.asp/ /port /service 在一个WSDL文档中service的name属性用来区分不同的service。因为同一个service中可以有多个端口它们也有name属性。总结 本文中我描述了WSDL文档关于SOAP方面的最显著的特点。不过应该说明的是WSDL并不仅限于HTTP上的SOAP。WSDL用来描述HTTP-POST、HTTP-GET、SMTP及其他协议时非常清晰。使用了WSDLSOAP更加容易处理了无论是开发者还是使用者。我相信WSDL和SOAP一起将会开创网络应用程序世界的新时代。 WSDL的namespace里有一系列的XML元素。下表概述了那些元素、它们的属性和内容。 元素 属性 内容子元素 definitions name targetNamespace xmlns (other namespaces) types message portType binding service types (none) xsd:schema message Name part portType Name operation binding name type operation service name port part name type (empty) operation name parameterOrder input output fault input name message (empty) output name message (empty) fault name message (empty) port name binding soap:address 资源 1. WSDL 1.1 2. SOAP 1.1 3. XML Schema Primer 4. MS SOAP Toolkit Download Site 5. A tool for translating IDL to WSDL 6. Free Web Servicesresources including a WSDL to VB proxy generator 7. PocketSOAP: SOAPrelated components, tools source code
http://wiki.neutronadmin.com/news/206115/

相关文章:

  • 响应式手机网站建设简单制作网站的过程
  • 查网站怎么做的广州建网站哪儿济南兴田德润简介
  • wordpress 开启评论苏州网站排名优化
  • 建商城网站公司免费行情软件app网站不下载
  • 网站发展清流县建设局网站
  • 南京 网站建设免费做自己的网站
  • 网站文字列表页模板昆明公司网站制作
  • 行业 专业 网站建设宜宾做网站的公司
  • 深圳百度网站排名优化重庆中信建投期货有限公司
  • 专门做市场调查的网站合肥做兼职网站
  • 国通快速建站wordpress添加百度自动推送
  • 浅谈旅游网站的规划与建设建设银行网站转账必须u盾吗
  • 网站制作技术长沙百度租车有限公司
  • 广告手机网站制作织梦cms做电影网站
  • 网站开发一个页面多少钱寻模板网站源码
  • 阿里云上做网站有哪些可以做策划方案的网站
  • wordpress foote在哪里短视频seo推广隐迅推专业
  • iis网站怎么做域名绑定房地产基础知识
  • 网络规划设计师大纲网站建设好怎么优化
  • 北京seo网站优化公司2万一3万电动汽车
  • 优秀专题网站wordpress 福利
  • 卖东西的网站怎么建设做商务网站
  • 素材下载平台网站源码网站开发外包公司坑
  • 宁波高端网站设计公司微信公众平台可以导入wordpress
  • 怎么查看网站的ftp免费汽车租赁网站模板
  • 网站公司设计公司黑色wordpress主题
  • 做国外网站收款怎么收搭建网站的平台有哪些
  • 百度右侧相关网站北京seo实战培训班
  • php做数据网站建立企业网站的好处
  • 网站关键词怎么做效果好阜阳商城网站建设