c++ web service(一)
web service
1.简介
web service 可以为应用程序提供web接口,利用web service ,可以让你的程序通过互联网远程调用和控制,非常有用。不同系统,不同机器之间的程序,无须通过第三方,利用web service 即可进行交换数据。例如,支付宝并没有你银行卡具体的信息,但通过银行提供的接口,支付宝就能获得数据。天气预报,汇率转换等服务都是通过web service 实现不同系统,不同机器上获取。
web service实质就是实现应用程序之间通信,有两种应用程序通信的方法:
1.RPC 远程调用。在客户端,RPC的通常方式是:实例化一个远程对象,并调用其方法和属性。
2.消息传递。
Web service 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web来调用这个应用程序。我们把调用这个Web service 的应用程序叫做客户。
2.构成
web service三大核心技术
2.1 XML
XML和HTML在形式上是一样的,但本质上确实不同的,XML是用来传输数据的,HTML是用来显示数据的。HTML的标签是预定义,而XML标签是自己定义的。
XML主要的构成是根元素和子元素。且必须前后对应,属性值必须用双引号或者单引号括起来。形式如下:
<?xml version="1.0" encoding="UTF-8"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
XML的特性:1.具有自我描述性。2.可以在不中断应用程序的情况下进行扩展。
2.2SOAP
简易对象访问协议。SOAP是一种简单的基于XML的协议,它使应用程序通过HTTP来交换信息。用于应用程序之间的通信,独立于平台。可以绕过防火墙来进行通信。
一条SOAP消息就是一个普通的XML文档。所有构成元素均被声明于针对 SOAP 封装的默认命名空间中:
http://www.w3.org/2001/12/soap-envelope
以及针对 SOAP 编码和数据类型的默认命名空间:
http://www.w3.org/2001/12/soap-encoding
包含下列元素:
2.2.1.Envelope元素,把XML文档标识为一条SOAP消息。
必须要有的元素,是SOAP 消息的根元素。包含两个属性:
2.2.1.1 xlmns:soap。命名空间。这个属性值必须是 "http://www.w3.org/2001/12/soap-envelope"。因为SOAP必须拥有与此命名空间相关联的一个Envelope元素。
2.2.1.2 encodingStyle。用于定义在文档中使用的数据类型。此属性可出现在任何 SOAP 元素中,并会被应用到元素的内容及元素的所有子元素上。SOAP 消息没有默认的编码方式。
2.2.2.Header元素。包含头部信息。
这个元素是可选的,包含一些头部信息。包含有关 SOAP 消息的应用程序专用信息(比如认证、支付等)。如果 Header 元素被提供,则它必须是 Envelope 元素的第一个子元素。
有三个重要的属性:
2.2.2.1: mustUnderstand 。SOAP 的 mustUnderstand 属性可用于标识标题项对于要对其进行处理的接收者来说是强制的还是可选的。假如您向 Header 元素的某个子元素添加了 "mustUnderstand="1",则它可指示处理此头部的接收者必须认可此元素。假如此接收者无法认可此元素,则在处理此头部时必须失效。
2.2.2.2:actor。用于将 Header 元素寻址到一个特定的端点。
2.2.2.3:encodingStyle。
2.2.3.Body元素,包含所有调用和响应信息。
必须要有的元素,包含实际的SOAP消息。
2.2.4.Fault元素,提供有关在处理此消息所发生错误的信息。
可选的元素,用于存留SOAP消息的错误和状态信息。如果已提供了 Fault 元素,则它必须是 Body 元素的子元素。在一条 SOAP 消息中,Fault 元素只能出现一次。
基本结构如下:
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Header> ... </soap:Header> <soap:Body> ... <soap:Fault> ... </soap:Fault> </soap:Body> </soap:Envelope>
SOAP 是一个基于类对象的传输协议。主要包含以下四个部分:
1.封装。它定义了一个框架 , 该框架描述了消息中的内容是什么,谁应当处理它以及它是可选的还是必须的。
2.编码规则。它定义了一种序列化的机制,用于交换应用程序所定义的数据类型的实例。
序列化:序列化是指将数据从有结构清晰的语言定义的数据形式转化为二进制字符串,反序列化则是序列化的逆操作。
3.RPC 表示。它定义了用于表示远程过程调用和应答的协定。
4.绑定。定义了一种使用底层传输协议来完成在节点间交换SOAP封装的约定。
2.3 WSDL
网络服务描述语言,基于XML。用于描述web service以及如何对它们进行访问。
WSDL文档是利用这些主要的元素来描述某个 web service的:
2.3.1 portType 。web service执行的操作。类比c++一个函数库。是WSDL 端口。特定端口类型的具体协议和数据格式规范。有四种操作类型。
One-way | 此操作可接受消息,但不会返回响应。 |
Request-response | 此操作可接受一个请求并会返回一个响应 |
Solicit-response | 此操作可发送一个请求,并会等待一个响应。 |
Notification | 此操作可发送一条消息,但不会等待响应。 |
一个 request-response 操作的例子:
<message name="getTermRequest"> <part name="term" type="xs:string"/> </message> <message name="getTermResponse"> <part name="value" type="xs:string"/> </message> <portType name="glossaryTerms"> <operation name="getTerm"> <input message="getTermRequest"/> <output message="getTermResponse"/> </operation> </portType>
portType中name 属性:定义了一个端口。
operation 元素定义了每个端口提供的操作符。name属性 定义一个操作。具体意义如下:定义了一个名为“getTerm”的操作。"getTerm" 操作会请求一个名为 "getTermRequest" 的输入消息,此消息带有一个名为 "term" 的参数,并将返回一个名为 "getTermResponse" 的输出消息,此消息带有一个名为 "value" 的参数。
2.3.2 message。 web service使用的消息。类比函数调用的参数。它由一个或者多个 part 组成。Part:消息参数
2.3.3 types 。 web service使用的数据类型。 为了实现平台无关性,使用 XML Schema语法来定义数据类型。
2.3.4 binding。 web service 使用的通信协议。一个实例如下:
<message name="getTermRequest"> <part name="term" type="xs:string"/> </message> <message name="getTermResponse"> <part name="value" type="xs:string"/> </message> <portType name="glossaryTerms"> <operation name="getTerm"> <input message="getTermRequest"/> <output message="getTermResponse"/> </operation> </portType> <binding type="glossaryTerms" name="b1"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <operation> <soap:operation soapAction="http://example.com/getTerm"/> <input><soap:body use="literal"/></input> <output><soap:body use="literal"/></output> </operation> </binding>
binding 元素有两个属性 - name 属性和 type 属性。name 属性定义 binding 的名称,而 type 属性指向用于 binding 的端口,在这个例子中是 "glossaryTerms" 端口。
soap:binding 元素有两个属性 - style 属性和 transport 属性。style 属性可取值 "rpc" 或 "document"。在这个例子中我们使用 document。transport 属性定义了要使用的 SOAP 协议。在这个例子中我们使用 HTTP。
2.3.5 WSDL UDDI
UDDI是一种目录服务,企业可以使用它对web service 进行注册和搜索。UDDI,英文为 "Universal Description, Discovery and Integration",可译为"通用描述、发现与集成服务"。
UDDI,英文为 "Universal Description, Discovery and Integration",可译为"通用描述、发现与集成服务"。
UDDI是一种目录,这个目录用于存储有关 web service信息。
例子:假如行业发布了一个用于航班比率检测和预订的 UDDI 标准,航空公司就可以把它们的服务注册到一个 UDDI 目录中。然后旅行社就能够搜索这个 UDDI 目录以找到航空公司预订界面。当此界面被找到后,旅行社就能够立即与此服务进行通信。