VC6开发Web Services 客户端

#include <stdio.h>

#import "msxml4.dll"
using namespace MSXML2;

#import "C:/Program Files/Common Files/MSSoap/Binaries/mssoap30.dll" /
            exclude("IStream", "IErrorInfo", "ISequentialStream", "_LARGE_INTEGER", /
                    "_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")
using namespace MSSOAPLib30;  //你机器得安装SOAP Toolkit3.0 ,1.0时,用using namespace时报错


void Add()
{
   ISoapSerializerPtr Serializer;
   ISoapReaderPtr Reader;
   ISoapConnectorPtr Connector;
   // Connect to the service.
   Connector.CreateInstance(__uuidof(HttpConnector30));  //HttpConnector30 失败,无法这样创建Connector,CXX0017 Error :Symbol “HttpConnector30“ not found(摇头、叹气!)
   Connector->Property["EndPointURL"] = "http://MyServer/Soap3DocSamples/DocSample1/Server/DocSample1.wsdl";  //这个当然得改成您自己的拉
   Connector->Connect();

   // Begin the message.
   //Connector->Property["SoapAction"] = "uri:AddNumbers";
   Connector->Property["SoapAction"] = "http://tempuri.org/DocSample1/action/Sample1.AddNumbers";
   Connector->BeginMessage();

   // Create the SoapSerializer object.
   Serializer.CreateInstance(__uuidof(SoapSerializer30));

   // Connect the serializer object to the input stream of the connector object.
   Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));

   // Build the SOAP Message.
   Serializer->StartEnvelope("","","");
   Serializer->StartBody("");
   Serializer->StartElement("AddNumbers","http://tempuri.org/DocSample1/message/","","");  //这是本地的Web Services,实际中要指定命名空间
   Serializer->StartElement("NumberOne","","","");
   Serializer->WriteString("5");
   Serializer->EndElement();
   Serializer->StartElement("NumberTwo","","","");
   Serializer->WriteString("10");
   Serializer->EndElement();
   Serializer->EndElement();
   Serializer->EndBody();
   Serializer->EndEnvelope();
  
   // Send the message to the XML Web service.
   Connector->EndMessage();     

   // Read the response.
   Reader.CreateInstance(__uuidof(SoapReader30));

   // Connect the reader to the output stream of the connector object.
   Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");

   // Display the result.
   printf("Answer: %s/n", (const char*)Reader->RpcResult->text);
   
}

int main()
{
   CoInitialize(NULL);
   Add();
   CoUninitialize();
   return 0;
}

更改 EndPointURL 属性的值. 在URL里指定你的服务器名.

OK

总结一下必要的关键步骤
1.导入类型库

2.需要创建一个SoapConnector

3.下一步创建SoapSerializer

4.下一步把消息附加到SoapConnector的输入流

5.下一步读取结果.要读取服务器的回复,客户端应用需要使用SoapReader,

6.SoapReader被连接到SoapConnector输出流

7.用IXMLDOMElement对象可以从SoapReader里读到服务器的回复

附,SOAP ToolKit 3.0 下载地址:http://download.microsoft.com/download/xml/Install/3.0/W982KMeXP/EN-US/SoapToolkit30.EXE

 

--------------------

简介

  在本篇文章中,我们将讨论如何使用Visual C++开发一个简单的SOAP客户端应用程序,我们还将介绍SOAP API的使用。SOAP是互联网上一种非常流行的交换信息用的协议,由于是为了与HTTP、SMTP和其他的类似协议协同工作的,因此它十分简单。用它描述的信息能够被轻易地通过互联网发送到另外的计算机上,而无需担心遭到防火墙等网络安全技术的拦截。

  在这里,我们假设读者已经对SOAP协议有了一定的理解,而且对C++比较精通。如果读者对SOAP还不熟悉,可以查看相关的资料。我们还假设读者熟悉COM的使用,特别是COM中的智能指针,因为在这篇文章中,我们将使用导入命令将COM接口转换为智能指针。另外,读者还需要安装了微软的SOAP工具包。

  SOAP编程基础

  我们将以介绍一个与基本的SOAP应用程序有关的类开始我们的SOAP编程之旅。然而,我们还必须首先导入必需的类型库,我们的应用程序才能使用SOAP类。

  导入类型库

  SOAP中使用的所有对象和接口都包含在mssoap1.dll中,这个文件包含在Microsoft SOAP Toolkit 2.0中。我们可以在C:/Program Files/Common Files/MSSoap/Binaries/MSSOAP1.dll中发现该文件。使用#import命令就可以将该文件导入到我们的源文件中。类库文件中的内容将被转换为描述了COM接口的COM智能指针。

  SOAP使用XML作为其数据格式,因此我们还需要微软的XML Parser来处理XML内容,它包含在msxml3.dll中。在导入mssoap1.dll文件之前,我们还需要导入该文件,如下所示:

#import "msxml3.dll"

using namespace MSXML2;

#import "C:/Program Files/Common Files/MSSoap/Binaries/MSSOAP1.dll" /
exclude("IStream", "ISequentialStream", "_LARGE_INTEGER", /
"_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")
using namespace MSSOAPLib;

  上面是开发一个SOAP应用程序所必需包含的所有类定义。开发一个SOAP客户端应用程序需要三个步骤:

   ·指定并连接一个互联网服务。

   ·准备并发送消息。

   ·读取来自服务器的响应。

  下面是我们用来开发一个基本的SOAP客户端应用程序所需要用到的类:

    SoapConnector

  在客户机/服务器模式中任何客户端应用程序需要作的第一件事就是与服务器进行连接。SoapConnector就是被用来实现客户机端、服务器端应用程序连接器的协议,它还充当定义实现其他协议接口的抽象类,也就是说,SOAP不仅仅局限于充当一种特定的协议。我们会发现,它的一些实现还支持MSMQ、MQ Series、SMTP和TCP/IPTransports。为了简单起见,我在这里只讨论它作为HTTP Transport的用途,这是由微软SOAP Toolkit 2.0中的HttpConnector类实现的。

  使用SoapConnector类所需要的步骤

  首先,创建SoapConnector类的一个对象:

ISoapConnectorPtr connector; Connector.CreateInstance(__uuidof(HttpConnector));

  然后,指定Web服务的地址。接下来,我们必须详细描述该Web服务。Web服务是由Property(HttpConnector的一个属性)指定的。在处理这一属性时有件事情需要指定:我们引用的哪个属性以及该属性的值。下面,我们使用EndPointURL属性指定Web服务:

Connector->Property ["EndPointURL"] = "some url pointing to web service";

  下面的表格提供了一个属性清单(属性的名字是大小写敏感的)

属性描述
AuthPassword端点认证用的口令。
AuthUser端点认证用的用户名。
EndPointURL端点的URL。
ProxyPassword代理认证的口令。
ProxyPort代理服务器使用的端口。
ProxyServer代理服务器的主机名或IP地址。
ProxyUser代理认证的用户名。
SoapActionHTTP头部中SoapAction中的值。这一属性只能从低级的API中设定,如果使用SoapClient接口中的ConnectorProperty属性(高级API)设置该属性,它就会被忽略。
SSLClientCertificateName 如果存在,则该字符串标明用于SSL协议中的客户端证书。其语法为: SSLClientCertificateName [CURRENT_USER | LOCAL_MACHINE/[store-name/]]证书名,其缺省的名字为 CURRENT_USER/MY。
TimeoutHttpConnector的超时时间,这一时间是以毫秒计算的。
UseProxy 一个类型为布尔型的属性,表明是否使用代理服务器。缺省情况下,这一属性的值被设定为False,表明无需使用代理服务器。如果要使用代服务器,需要将该属性的值设置为True。如果将该属性的值设置为True, 而又没有设置ProxyServer属性,HttpConnector将使用IE中设置的代理服器。HttpConnector会忽略IE中的“不使用代理服务器”设置。
UseSSL 表明是否使用了SSL的布尔型值。如果该属性被设置为True,则无论WSDL中是否指定了HTTP或HTTPS,HttpConnector对象都使用SSL连接。
 如果该属性的值被设置为False,则只有在WSDL中指定了HTTPS的情况下, HttpConnector对象才会使用SSL连接。

  其次,我们需要与Web服务连接。HttpConnector类的Connect方法用来初始化SoapConnector对象和准备与Web服务的连接。

   Connector->Connect();

  在与服务器连接后,我们需要指定Web服务完成的操作。为了指定该操作,我们需要再次使用SoapConnector的Property属性:

Connector->Property ["SoapAction"] = "some uri";

  在完成与Web服务的连接和其他的细节后,我们就可以调用向服务器发送SOAP信息的方法了,必须在调用SoapSerializer的其他方法之前调用该方法:

Connector->BeginMessage();

  在完成与信息相关的操作后,我们必须调用EndMessage()函数,将消息真正地发给Web服务。

.
.
[ 消息准备代码 ]
.
.
Connector->EndMessage();

  上面的步骤就是完成与Web服务的实际连接所必需的操作。在下面的部分,我们将讨论如何创建和准备一个信息。

  使用SoapConnector类所需要的步骤

  首先,创建SoapConnector类的一个对象:

ISoapConnectorPtr connector; Connector.CreateInstance(__uuidof(HttpConnector));

  然后,指定Web服务的地址。接下来,我们必须详细描述该Web服务。Web服务是由Property(HttpConnector的一个属性)指定的。在处理这一属性时有件事情需要指定:我们引用的哪个属性以及该属性的值。下面,我们使用EndPointURL属性指定Web服务:

Connector->Property ["EndPointURL"] = "some url pointing to web service";

  下面的表格提供了一个属性清单(属性的名字是大小写敏感的)

属性描述
AuthPassword端点认证用的口令。
AuthUser端点认证用的用户名。
EndPointURL端点的URL。
ProxyPassword代理认证的口令。
ProxyPort代理服务器使用的端口。
ProxyServer代理服务器的主机名或IP地址。
ProxyUser代理认证的用户名。
SoapActionHTTP头部中SoapAction中的值。这一属性只能从低级的API中设定,如果使用SoapClient接口中的ConnectorProperty属性(高级API)设置该属性,它就会被忽略。
SSLClientCertificateName 如果存在,则该字符串标明用于SSL协议中的客户端证书。其语法为: SSLClientCertificateName [CURRENT_USER | LOCAL_MACHINE/[store-name/]]证书名,其缺省的名字为 CURRENT_USER/MY。
TimeoutHttpConnector的超时时间,这一时间是以毫秒计算的。
UseProxy 一个类型为布尔型的属性,表明是否使用代理服务器。缺省情况下,这一属性的值被设定为False,表明无需使用代理服务器。如果要使用代服务器,需要将该属性的值设置为True。如果将该属性的值设置为True, 而又没有设置ProxyServer属性,HttpConnector将使用IE中设置的代理服器。HttpConnector会忽略IE中的“不使用代理服务器”设置。
UseSSL 表明是否使用了SSL的布尔型值。如果该属性被设置为True,则无论WSDL中是否指定了HTTP或HTTPS,HttpConnector对象都使用SSL连接。
 如果该属性的值被设置为False,则只有在WSDL中指定了HTTPS的情况下, HttpConnector对象才会使用SSL连接。

  其次,我们需要与Web服务连接。HttpConnector类的Connect方法用来初始化SoapConnector对象和准备与Web服务的连接。

   Connector->Connect();

  在与服务器连接后,我们需要指定Web服务完成的操作。为了指定该操作,我们需要再次使用SoapConnector的Property属性:

Connector->Property ["SoapAction"] = "some uri";

  在完成与Web服务的连接和其他的细节后,我们就可以调用向服务器发送SOAP信息的方法了,必须在调用SoapSerializer的其他方法之前调用该方法:

Connector->BeginMessage();

  在完成与信息相关的操作后,我们必须调用EndMessage()函数,将消息真正地发给Web服务。

.
.
[ 消息准备代码 ]
.
.
Connector->EndMessage();

  上面的步骤就是完成与Web服务的实际连接所必需的操作。在下面的部分,我们将讨论如何创建和准备一个信息。

posted on 2004-06-23 20:33 龍龙 阅读(944) 评论(1)   编辑 收藏 网摘 所属分类: C/C++


FeedBack:
为什么我用VC6+SOAP ToolKit30按同样的方式生成的XML是错误的????
我用协议分析器发现它生成的XML这是样的,

<?xml **UnReg**1.0" encoding="UTF-8" standalone="no"?>
<soap:Envelope xmlns:SOAPSDK1=" http://www.w3.org/2001/XMLSchema" xmlns:SOAPSDK2=" http://www.w3.org/2001/XMLSchema-instance""> http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAPSDK3=" http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap=" http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance""> http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=" http://www.w3.org/2001/XMLSchema">
<soap:Body>
<SOAPSDK4:WTAU1 xmlns:SOAPSDK4=" http://www.waytech.com.cn/webservices/WTAU">
<ProdType>003</ProdType>
<ProdSubType>003.0001</ProdSubType>
<vers**UnReg**.0</version>
<TimeStamp>2004 12 31 00:00:00</TimeStamp>
<Name>RV.EXE</Name>
<Name>RV.EXE</Name>
</SOAPSDK4:WTAU1>
</soap:Body>
</soap:Envelope>

xml version不见了,内容也乱了,服务器无法解析。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值