不理会IE的"Bypass Proxy"(绕道)设置。
UseSSL:定义是否使用SSL(True 或 False)。此值设置为真时,HttpConnector对象不管WSDL设置是HTTP或HTTPS都用SSL连接方式。若此值设置为非真,HttpConnector对象只在WSDL设置为HTTPS时才用SSL方式连接。
c) 与Web服务器连接:
Connector->Connect();
d) 指定动作:
Connector->Property ["SoapAction"] = "some uri";
e) 启动消息句柄:
必需在SoapSerializer(消息准备函数)之前先启动消息处理机制
Connector->BeginMessage();
在消息处理完毕之后,用EndMessage()函数将消息送往服务器。
.
.
[ 消息准备代码 ]
.
.
Connector->EndMessage();
以上就是与服务器连接的过程。下面介绍如何创建和准备消息。
SoapSerializer:
用于建立送往服务器的SOAP消息。在与服务器通讯之前,SoapSerializer对象必需先与SoapConnector对象连接。SoapSerializer的初始化函数将建立这个内部连接。初始化代入的参数是InputStream (数据流):
// 创建SoapSerializer对象,并用InputSTream进行初始化。
ISoapSerializerPtr Serializer;
Serializer.CreateInstance(_uuidof(SoapSerializer));
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消息。第一个参数是命名空间,缺省为SOAP-ENV。
// 第二个参数定义URI。第三个参数定义Serialzier->startBody("")函数的编码方式。
// 开始处理<Body>元素,第一个参数是URI的编码类型,缺省为NONE。
Serializer->startElement("someMethodName","","","m");
// 开始处理Body里的子元素。
// 第一个参数是元素名。第二个参数是URI。
// 第三个参数编码类型。第四个参数是元素的命名空间。
Serializer->WriteString("someParameterValue")
// 写入元素值
在上面的每个startXXX函数后都要又相应的endXXX函数来结尾。消息做完之后,连接器就调用endMessage()方法将消息发送到服务器。
至此,我们已经连接了服务器,制作了相应的消息。最后一个步骤就是接收服务器回应。
SoapReader:
读取服务器返回的信息,将信息解析之后装入DOM,为进一步处理所用。下面是服务器返回的SOAP回应信息:
<SOAP: Envelope xmlns:SOAP="soap namespace">
<SOAP:Body>
<m:someMethodNameResponse xmlns:m="some namespace">
<return> someResult </return>
<m:someMethodNameResponse>
</SOAP:Body>
</SOAP: Envelope>
使用OutputStream来读取SoapReader对象中的信息。(OutputStream接收服务器返回的信息)。
// 创建SOAPReader对象,并连接到outputstream
ISoapReaderPtr Reader;
Reader.CreateInstance(_uuidof(SoapReader));
Reader->Load(_variant_t((IUnknown*)Connector->OutputStream));
// load方法还可以用