VC++ 调用java 编写的webService

[color=indigo][size=large]VC++ 调用java 编写的webService[/size][/color]

[size=medium]Java 端编写的WebService 程序略。[/size]
java 端WebService 路径 :
http://localhost:8080/Axis2WSTest/services/Converte

java 端 SoapAction 
urn:sayHello



public void sayHello(String userName, String message)
{
System.err.println("Hello!" + userName + " and he said: " + message);
}


[size=small]C++ 端如果要调用webService 需要安装工具包soapsdk.exe
下载地址为[/size][url]http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=13456[/url]

在此之前,必需先导入所需的类型库,然后程序才能够使用SOAP的类。


#import "msxml4.dll"

#import "C:\Program Files\Common Files\MSSoap\Binaries\mssoap30.dll" \
exclude("IStream", "IErrorInfo", "ISequentialStream", "_LARGE_INTEGER", \
"_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")
using namespace MSSOAPLib30;


说明:
mssoap30.dll :SOAP中使用的对象和接口都在mssoap30.dll文件中
msxml4.dll:因为SOAP完全依赖于XML,因此必需用Microsoft XML Parser来处理XML

[size=large][color=orange]建立SOAP客户端应用有以下三步骤:
  1- 指定和连接Web服务器。
  2- 准备和发送消息。
  3- 读取服务端返回的信息。[/color][/size]


[color=blue][size=medium]1- SoapConnector:
  在客户/服务模式下,首先要做的事就是连接服务器。SoapConnector类执行客户端与服务端之间的消息传送协议。 SoapConnector是一个抽象类,定义了协议执行的接口。事实上, SoapConnector类不定义执行某种特定的传送协议,例如:MSMQ, MQ Series, SMTP 和 TCP/IP等。 为简便起见,本文只说明使用HTTP传送协议,
SoapConnector类使用步骤如下:[/size][/[/color]
[color=red][size=medium]a) 创建SoapConnector类对象:[/size][/color]
 
 ISoapConnectorPtr connector; 
  Connector.CreateInstance(__uuidof(HttpConnector30));
  
[size=medium][color=red]
b) 指定Web服务器地址:
  指定服务器,要做二件事:选择HttpConnector的属性和相应的属性值。本文示例选用EndPointURL属性:[/color][/size]

Connector->Property ["EndPointURL"] = "http://localhost:8080/Axis2WSTest/services/Converte";

以下是属性选项说明(属性名是大小写敏感的):
  AuthPassword:客户口令
  AuthUser:客户名
  EndPointURL :客户URL
  ProxyPassword: 代理(proxy)口令
  ProxyPort :代理断口
  ProxyServer :代理服务器的IP地址或主机名
  ProxyUser :代理用户名
  SoapAction:HTTP的抬头值。这个属性只使用于低级API。它将忽略SoapClient接口(高级API)中的ConnectorProperty属性 。
  SSLClientCertificateName:指定使用Secure Sockets Layer (SSL)加密协议。语法如下:
  [CURRENT_USER | LOCAL_MACHINE\[store-name\]]cert-name with the defaults being CURRENT_USER\MY (与Microsoft Internet Explorer用法相同)。
  Timeout:HttpConnector的超时限制,以毫秒为单位。
  UseProxy:定义是否使用代理(proxy)。缺省值为False。如果将这个属性为真(True),又没有设置上面的ProxyServer值,代理服务器将使用IE里的代理服务器。此时HttpConnector将不理会IE的"Bypass Proxy"(绕道)设置。
  UseSSL:定义是否使用SSL(True 或 False)。此值设置为真时,HttpConnector对象不管WSDL设置是HTTP或HTTPS都用SSL连接方式。若此值设置为非真,HttpConnector对象只在WSDL设置为HTTPS时才用SSL方式连接。

[size=medium]
[color=red]
c) 与Web服务器连接:[/color][/size]
 
 Connector->Connect();


[size=medium][color=red]d) 指定动作:[/color][/size]
  

Connector->Property ["SoapAction"] = "urn:sayHello";



[size=medium][color=red]e) 启动消息句柄:[/color][/size]
  
必需在SoapSerializer(消息准备函数)之前先启动消息处理机制 
  Connector->BeginMessage();
  在消息处理完毕之后,用EndMessage()函数将消息送往服务器。
  .
  .
  [ 消息准备代码 ]
  .
  .
  Connector->EndMessage();


[size=large][color=blue]SoapSerializer:
  用于建立送往服务器的SOAP消息。在与服务器通讯之前,SoapSerializer对象必需先与SoapConnector对象连接。SoapSerializer的初始化函数将建立这个内部连接。初始化代入的参数是InputStream (数据流): [/color][/size]


// 创建SoapSerializer对象,并用InputSTream进行初始化。
  ISoapSerializerPtr Serializer;
  Serializer.CreateInstance(_uuidof(SoapSerializer30));
  Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));


下面是SOAP请求代码:
  <SOAP: Envelope xmlns:SOAP="soap namespace">
  <SOAP:Body>
  <m:someMethodName xmlns:m="some namespace">
  <someParameter> someParameterValue </someParameter>
  <m:someMethodName>
  </SOAP:Body>
  </SOAP: Envelope>



SOAP请求被安放在标记之中。<Envelope>是SOAP文件的主标记。SOAP信息通常都安放在”信封“(Envelope)里。信封里的<Body>标记中安放信息体,其中包含具体请求。在C++里,用相应的方法来解释这些标记并定义有关的值。
  下面的代码说明如何使用这些方法:



Serializer->startEnvelope("","","");
  // 开始处理SOAP消息。第一个参数是命名空间,缺省为SOAP-ENV。
  // 第二个参数定义URI。第三个参数定义Serialzier->startBody("")函数的编码方式。
  // 开始处理<Body>元素,第一个参数是URI的编码类型,缺省为NONE。
   Serializer->StartBody("");
Serializer->StartElement("sayHello","http://wtp","","m");
// 开始处理Body里的子元素。
  // 第一个参数是元素名。第二个参数是URI。
  // 第三个参数编码类型。第四个参数是元素的命名空间。
Serializer->StartElement("userName","","","");
Serializer->WriteString("laghari78");
// 写入元素值
Serializer->EndElement();
Serializer->StartElement("message","","","");
Serializer->WriteString("i say something");
// 写入元素值
Serializer->EndElement();
Serializer->EndElement();
Serializer->EndBody();
Serializer->EndEnvelope();  

    在上面的每个startXXX函数后都要又相应的endXXX函数来结尾。消息做完之后,连接器就调用endMessage()方法将消息发送到服务器。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值