Showing Posts From

Onvif

WSDL基础学习笔记

WSDL:Web Services Description Language。由微软和IBM共同开发。 与SOAP一样,WSDL也是基于XML的规范。只不过WSDL是用于服务器端对Web Service进行描述,定义了这些Web Service应该如何被客户端远程调用和访问。 因此,本质上WSDL就是一种使用XML所编写的文档。在这个文档中描述了某个 Web service所在的的位置,以及这个服务所提供的操作或方法。 Web Service比较典型的使用流程就是:客户端应用程序与服务器端建立连接,读取服务器上的WSDL信息,解析后就可以得知这个服务器上提供的功能接口以及如何调用的详细信息;然后就可以通过SOAP Message的形式来调用在WSDL中所描述的那些功能接口。 WSDL的文档结构 WSDL本身就是一个XML文档,它的文档结构如下所示: 在参考资料2中提供了一个真实的WSDL文档的例子: WSDL的元素类型 definitions definitions元素必须是WSDL文档的根元素,它定义了这个Web Service的名称。 WSDL文档中使用definitions根元素来包含其他的各种类型子元素。 以下例子使用definitions元素定义了一个名称为HelloService的Web Service。 Types 用于对文档中使用的数据类型进行定义。为了尽可能保证对运行平台和编程语言的中立性,WSDL 使用 XML Schema 语法来定义数据类型。 这里定义的数据类型可能会在Message或者PortType等元素中被使用。 在实践中,Types主要用来定义Client和Server之间的需要交互的复杂类型的数据结构,如不同简单数据类型的组合。如果Client和Server之间的交互消息参数只用到一些简单的数据类型,如整型和字符串等,那就没有必要使用Types元素了。 以下WSDL文件片段中在Types元素中定义了两个数据结构:TradePriceRequest和TradePrice。这两个数据结构均只是对简单数据类型字符串和浮点型数据的简单封装。后续在Message和PortType元素中就可以直接引用这两个数据类型作为输入和输出消息的参数。 Message 用于对文档中使用的消息进行定义。这里定义的消息会在PortType中的operation元素中引用,作为operation调用的输入或者输入参数。 例如上面的wsdl文档片段中,定义了一个名词为getTerm的operation,在这个operation中有一个输入消息参数和一个输出消息参数。这两个消息参数都是使用message元素定义的,实际上都是字符串类型。 PortType portType是WSDL中最重要的元素。它用于描述一个web service中所包含的可执行操作,每个操作的输入参数和返回消息。 简单的说,可以把portType看作是传统编程语言中的一个函数库,其中包含有多个operation,每个operation就对应于函数库中的一个函数。 根据这个Operation中所包含的请求(输入)参数和响应(输出)参数的具体情况,Operation可以分为以下四种情况: One-Way:这种类型的Operation中只有一个请求消息,没有响应消息 !Untitled.png Request-response:这是最常见的web service模式。包含一个请求参数,处理后给Client返回一个响应参数。 !Untitled.png Solicit-response:刚好与Request-response相反,是由Web Service的提供端发起,向Client端发出一个请求消息,然后从Client读回一个响应消息。 !Untitled.png Notification:这种类型的Web Service只是由Server端向Client端发出一个通知消息。 !Untitled.png Binding Binding元素用于指定PortType里面定义的那些operation,在具体的网络请求和访问中应该使用什么通信协议来进行传输。例如可以使用HTTP GET,HTTP PUT,SOAP等。 - 如果使用SOAP进行传输的话,应该设置binding属性为,这个时候就应使用在HTTP协议基础上进行封装的SOAP消息来进行Web Service的访问。 在这个元素中还定义了operation所在的位置位置。 binding元素主要有两个属性:type用于指定这个binding元素要给哪个porttype绑定传输协议,name则是这个binding元素的名称。 下面的例子中定义了一个glossaryTerms的porttype,其中包含有一个名为getTerm的operation。然后使用binding元素指定glossaryTerms中的所有operation均采用SOAP协议进行传输,在soapAction属性中指定访问这个operation的字符串。 参考资料 1. WSDL 教程 | 菜鸟教程 (runoob.com) 2. WSDL Tutorial (tutorialspoint.com) 3. Web 服务定义语言 (WSDL) (w3.org) 4. Message Patterns in WSDL (perforce.com)

SOAP基础学习笔记

本文主要是对参考文档1的学习笔记整理。 什么是SOAP? SOAP:Simple Object Access Protocol,简单对象访问协议。 SOAP定义了一种在两个WEB设备之间交换数据的标准协议规范,是一种基于XML的轻量级通信协议(不是网络通信协议,而是设备间通信对数据进行封装和解析的协议)。简单地说,就是在XML文档格式的基础上,再定义了一个更详细的约束条件,方便web设备在通信的时候更容易的组织和解析交互的数据信息。 在实践中,SOAP往往所作为Web Service的三要素(SOAP,WSDL,UDDI)之一应用在技术领域的,SOAP在其中规定了Web Service的客户端和服务器之间交换信息的具体格式。 - Web Service的服务器端使用SOAP协议来定义和描述自己提供的Service是什么,在哪儿,以及应该如何调用;而客户端则在收到SOAP消息后按照SOAP协议的标准规范进行解析,就能够得到以上信息。 那么SOAP与XML之间的关系是什么呢?XML的使用也已经很广泛了,为什么不直接使用XML而要使用SOAP呢? - XML实际上只是一种文档的基本格式,如果直接使用XML在Web设备之间传输信息的话,需要设备双方提前明确的定义好XML文档中所包含的信息结构应该如何组织和解析,这样接收端收到以后才能正确的理解XML文档中所包含的信息是什么意思; - SOAP实际上就是在XML的基础上做了一层封装,使用SOAP定义的XML需要有预先定义好的文档结构和数据结构,这样SOAP信息的接收端收到以后,就能够使用标准定义的形式去对SOAP信息进行解析。 SOAP只是基于XML定义了在设备之间进行数据传递的格式,它的本质就是一个XML文件。因此SOAP并没有限定只能在HTTP协议的基础上进行传输。实际上它可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)等。 只不过在WEB系统上HTTP协议的使用最为广泛,因此在HTTP协议上进程SOAP数据的传输就成为了一个事实上的标准。以下就是一个用HTTP协议传输SOAP数据的例子: - 在上面的HTTP报文中,使用application/soap+xml这样的Content-Type,来表述这个报文的数据部分包含的是一个SOAP Message。这样接收到收到以后就可以按照SOAP定义的规范对其数据进行解析了。 最新版本的SOAP协议1.2版本在2003年6月24日成为了W3C的推荐版本,目前由万维网联盟的XML工作组负责进行维护。 SOAP的语法结构 在Web Service的架构下,Web设备客户端与服务器之间交互的信息以SOAP Message为单位,放在HTTP协议的数据负荷中进行传输。一个SOAP message实际上就是一个XML文档。 一条标准的SOAP Message由以下元素组成: - 开头必须的Envelope元素,使用这个元素标记这个XML文档是一个SOAP message; - 可选的Header元素; - 必须的Body元素,在其中包含有Web Service的调用和响应的信息内容; - 可选的Fault元素,包含在Body元素之中。在发生错误的时候在其中提供错误信息。 以下就是典型的SOAP消息的基本结构: SOAP Envelope元素 该元素是必须的。 在SOAP消息结构中,使用soap:Envelope来标记这个xml文档是一个SOAP Message,同时这个Envelope元素也是整个消息的根元素。 SOAP Header元素 该元素是可选的。 SOAP Message的Header元素中,通常可以包含Web Service执行的专用信息(例如认证信息等)。 如果在SOAP Message中包含有Header元素的话,它必须要是其中的第一个子元素。 以上SOAP Header中定义了一个名为Trans的子元素,这个子元素的value是234。 SOAP Body元素 该元素是必须的。 以下面通过HTTP传输的SOAP请求和响应的报文内容来说明SOAP Body元素的组织 客户端发出的SOAP请求: - 以上SOAP请求报文中,在Body元素中,客户端向服务器端发出一个web service的调用请求,请求访问m:GetStockPrice方法,给这个方法的参数m:StockName传递了一个IBM的值。即请求IBM的当前股价。 Web Service服务提供端发回的SOAP响应消息: - 在以上SOAP消息的响应报文的Body元素中,服务器端把调用m:GetStockPrice方法返回的结果,包含在m:Price子元素中,value是34.5。 需要注意,Body元素只是提供了一个web service调用和响应信息的框架。其中的m:GetStockPrice、m:StockName、m:GetStockPriceResponse和m:Price等都是应用程序本身定义的元素,非SOAP标准定义的内容,所以需要客户端和服务器端分别进行解析。 SOAP Fault元素 该元素是可选的。用于描述Web Service在调用过程中可能出现的出错信息。 一个SOAP Message中只能包含有一个Fault元素。 如果SOAP Message中包含Fault元素的话,这个元素应该包含在Body元素中。 以下是一个包含有Fault元素的SOAP Message: - 其中包含的fault元素,使用faultcode子元素返回SOAP-ENV:Client表示这是一条客户端的错误,使用faultstring子元素详细描述了错误的原因。服务器端不支持客户端请求的ValidateCreditCard方法。 参考资料 1. SOAP 教程 | 菜鸟教程 (runoob.com) 2. SOAP Web Services Tutorial: What is SOAP Protocol? EXAMPLE (guru99.com)