为了说明如何使用本篇文章中讨论的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后面的内容换成别的该如何?