gsoap中文文档(8.1.4~8.1.6)

王朝other·作者佚名  2006-04-18
窄屏简体版  字體: |||超大  

8.1.4 如何建立客户端程序代理类

用于C++客户端程序的代理类信息是由gSOAP预编译器自动创建的。为了说明代理类的生成过程,我们在getQuote.h头文件中加入一些信息,以便gSOAP预编译器可以生成代理类。这些信息就类似于WSDL解析器自动生成的头文件中就已经包含的信息。

//"getQuote.h"的内容:

//gsoap ns1 service name: Quote

//gsoap ns1 service location: http://services.xmethods.net/soap

//gsoap ns1 service namespace: urn:xmethods-delayed-quotes

//gsoap ns1 service style: rpc

//gsoap ns1 service encoding: encoded

//gsoap ns1 service method-action: getQuote ""

int ns1__getQuote(char *symbol, float &Result);

前三行指令用于定义代理类的名称,服务地址,命名空间。第四行、第五行指令定义了使用SOAP RPC编码方式。最后一行定义了可选的SOAPAction。当需要SOAPAction时,这行信息将提供给每个远程方法。使用soapcpp2对该头文件进行编译后,将会产生soapQuoteProxy.h文件。它包含下面的内容:

#include "soapH.h"

class Quote

{ public:

struct soap *soap;

const char *endpoint;

Quote() { soap = soap_new(); endpoint = "http://services.xmethods.net/soap"; };

~Quote() { if (soap) { soap_destroy(soap); soap_end(soap); soap_done(soap); free((void*)soap); }};

int getQuote(char *symbol, float &Result) { return soap ? soap_call_ns1__getQuote(soap, endpoint, "", symbol, Result) : SOAP_EOM; };

};

为了能够在运行时刻对gSOAP环境变量及命名空间进行定制,上述两个变量被定义程全局变量。

生成的代理类可以同命名空间表一起包含在客户端程序中,请看下面的例子:

#include "soapQuoteProxy.h" // 获得代理类

#include "Quote.nsmap" // 获得命名空间绑定

int main()

{

Quote q;

float r;

if (q.ns1__getQuote("IBM", r) == SOAP_OK)

std::cout << r << std::endl;

else

soap_print_fault(q.soap, stderr);

return 0;

}

Quote构造函数定义并初始化了一个gSOAP运行环境实例。所有的HTTP及SOAP/XML进程都被隐藏在后台自动执行。

如果你需要多个命名空间表或要联合多个客户端,你可以在执行soapcpp2时添加参数-n及-p来生成命名空间表以防止冲突。详细信息请看9.1及18.33节。同时,你可以使用C++代码命名空间来创建一个命名空间限制的代理类,详细信息请看18.32节。

8.1.5 XSD 类型编码

许多SOAP服务需要在SOAP负载中使用XML编码。在gSOAP预编译器中使用的默认编码为SOAP RPC编码。然而,使用XSD类型编码可以改善互操作性。XSD类型在头文件中用typedef定义。举个例子,下面的定义将C/C++类型转换为XSD类型:

// Contents of header file:

...

typedef char *xsd__string; // encode xsd__string value as the xsd:string schema type

typedef char *xsd__anyURI; // encode xsd__anyURI value as the xsd:anyURI schema type

typedef float xsd__float; // encode xsd__float value as the xsd:float schema type

typedef long xsd__int; // encode xsd__int value as the xsd:int schema type

typedef bool xsd__boolean; // encode xsd__boolean value as the xsd:boolean schema type

typedef unsigned long long xsd__positiveInteger; // encode xsd__positiveInteger value as the xsd:positiveInteger schema type

...

这些简单的声明告诉gSOAP预编译器当远程方法参数中使用上述定义的类型时,就把相关的C++类型转当作内建的XSD类型进行编码、解码。同时,使用typedef不需要使用内建C++类型的客户端或服务端程序更改现有代码(但只是当参数为简单的C++类型时,请参看11.2.2节来使用XSD类型表示组合的数据类型)。

8.1.6 例子

重新考虑一席getQuote的例子。现在用XSD类型来重写代码:

// Contents of file "getQuote.h":

typedef char *xsd__string;

typedef float xsd__float;

int ns1__getQuote(xsd__string symbol, xsd__float &Result);

使用预编译器编译这个头文件,将会生成与原来相同的存根例程代码:

int soap_call_ns1__getQuote(struct soap *soap, char *URL, char *action, char *symbol, float &Result);

客户端程序不需要进行任何改动,即可使用XSD类型类编码、解码数据类型信息了。

举个例子,当客户端程序调用代理时,代理方法用xsd:string类型产生一个SOAP请求:

...

<SOAP-ENV:Body>

<ns1:getQuote><symbol xsi:type="xsd:string">IBM</symbol>

</ns1:getQuote>

</SOAP-ENV:Body>

...

服务端的返回码为:

...

<soap:Body>

<n:getQuoteResponse xmlns:n="urn:xmethods-delayed-quotes">

<Result xsi:type="xsd:float">41.81</Result>

</n:getQuoteResponse>

</soap:Body>

...

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航