为了说明如何使用本篇文章中讨论的SOAP类,我们使用了http://www.xmethods.net/上列出的一项服务,该服务能够显示用户是否正在使用Yahoo Messenger。它只需要一个参数,即Yahoo用户的登录ID。返回的结果是一个布尔型值,0表示用户不在线,1表示用户在线。 我一直认为,学习某种编程技术的最好的方法就是实地学习源代码,在这里,我们就采取这种方法。下面是使用SOAP调用发现Yahoo用户是否在线的一个控制台应用程序的C++代码:
#include #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; void main()
{
CoInitialize(NULL); ISoapSerializerPtr Serializer;
ISoapReaderPtr Reader;
ISoapConnectorPtr Connector; // 与Web服务连接
Connector.CreateInstance(__uuidof(HttpConnector));
Connector->Property["EndPointURL"] = "http://www.allesta.net:51110/webservices/soapx4/isuseronline.php";
Connector->Connect(); // 开始消息
Connector->Property["SoapAction"] = "uri:allesta-YahooUserPing";
Connector->BeginMessage(); // 创建SoapSerializer对象
Serializer.CreateInstance(__uuidof(SoapSerializer)); // 将serializer连接到connector的输入字符串
Serializer->Init(_variant_t((IUnknown*)Connector->InputStream)); // 创建SOAP消息
Serializer->startEnvelope("","","");
Serializer->startBody("");
Serializer->startElement("isuseronline","uri:allesta-YahooUserPing","","m");
Serializer->startElement("username","","","");
Serializer->writeString("laghari78");
Serializer->endElement();
Serializer->endElement();
Serializer->endBody();
Serializer->endEnvelope(); // 将该消息发送给web服务
Connector->EndMessage(); // 读取响应
Reader.CreateInstance(__uuidof(SoapReader)); // 将reader联接到connector的输出字符串
Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), ""); // 显示结果
printf("Answer: %s\n", (const char *)Reader->RPCResult->text);
CoUninitialize(); }
其中的开始消息
Connector->Property["SoapAction"] = "uri:allesta-YahooUserPing";
Connector->BeginMessage();
中的SoapAction解释为HTTP头部中SoapAction中的值。这一属性只能从低级的API中设定,如果使用SoapClient接口中的ConnectorProperty属性(高级API)设置该属性,它就会被忽略。
不理解,假如要是把uri后面的内容换成别的该如何?
#include #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; void main()
{
CoInitialize(NULL); ISoapSerializerPtr Serializer;
ISoapReaderPtr Reader;
ISoapConnectorPtr Connector; // 与Web服务连接
Connector.CreateInstance(__uuidof(HttpConnector));
Connector->Property["EndPointURL"] = "http://www.allesta.net:51110/webservices/soapx4/isuseronline.php";
Connector->Connect(); // 开始消息
Connector->Property["SoapAction"] = "uri:allesta-YahooUserPing";
Connector->BeginMessage(); // 创建SoapSerializer对象
Serializer.CreateInstance(__uuidof(SoapSerializer)); // 将serializer连接到connector的输入字符串
Serializer->Init(_variant_t((IUnknown*)Connector->InputStream)); // 创建SOAP消息
Serializer->startEnvelope("","","");
Serializer->startBody("");
Serializer->startElement("isuseronline","uri:allesta-YahooUserPing","","m");
Serializer->startElement("username","","","");
Serializer->writeString("laghari78");
Serializer->endElement();
Serializer->endElement();
Serializer->endBody();
Serializer->endEnvelope(); // 将该消息发送给web服务
Connector->EndMessage(); // 读取响应
Reader.CreateInstance(__uuidof(SoapReader)); // 将reader联接到connector的输出字符串
Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), ""); // 显示结果
printf("Answer: %s\n", (const char *)Reader->RPCResult->text);
CoUninitialize(); }
其中的开始消息
Connector->Property["SoapAction"] = "uri:allesta-YahooUserPing";
Connector->BeginMessage();
中的SoapAction解释为HTTP头部中SoapAction中的值。这一属性只能从低级的API中设定,如果使用SoapClient接口中的ConnectorProperty属性(高级API)设置该属性,它就会被忽略。
不理解,假如要是把uri后面的内容换成别的该如何?
解决方案 »
- 纠结,要不要考计算机三级
- vcredist_x64在64位window2003sp2上安装不成功
- mfc dialog 多线程处理键盘消息
- (50)如何获得网络文件的大小或者修改日期
- access violation异常
- 如何使继承于CEditView的视图无法直接输入文字
- 请问CScrollView滚动后刷新怎么做的
- HELP!使用winInet进行HTTP上传下载时如何通过ISA SERVER的代理?(100分)
- 计算机多媒体设备实现信号波形的记录及回放
- 急需解惑...
- 我的单文档多视图。中,视图竟然没有办法获取文档指针 ?
- 急:如何将Rich Edit控件中显示的内容实时保存到文本文件中?
这是soap里面的封装的c++函数