【原創(chuàng)】用Visual C++客戶端調(diào)用Weblogic的Webservice
提交時間: Nov 10, 2006 1:31:44 PM 加3分
引用回復(fù) 發(fā)消息 用Visual C調(diào)用weblogic webservice.pdf (75.6 K)
前段時間研究了以下用Visual C++調(diào)用weblogic的webservice,發(fā)現(xiàn)與調(diào)用微軟的webservice還是不同的,用其自帶的例子無法實現(xiàn)與weblogic的webservice的通訊,下面和大家分享一下實現(xiàn)的方法。
1.首先,需要安裝微軟的mssoap tookit 3.0工具包,可以從微軟的官方網(wǎng)站上下載;
2.使用weblogic的workshop建立一個web服務(wù) 。
代碼如下所示:
public class add implements com.bea.jws.WebService
{
static final long serialVersionUID = 1L;
/**
* @common:operation
*/
public int AddNumbers(int NumberOne,int NumberTwo)
{
return NumberOne+NumberTwo;
}
}
僅僅完成一個加法運算即可。
3.查看wsdl文件,內(nèi)容如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- @editor-info:link autogen="true" source="add.jws" -->
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:conv="http://www.openuri.org/2002/04/soap/conversation/" xmlns:cw="http://www.openuri.org/2002/04/wsdl/conversation/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:jms="http://www.openuri.org/2002/04/wsdl/jms/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="http://www.openuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" targetNamespace="http://www.openuri.org/">
<types>
<s:schema elementFormDefault="qualified" targetNamespace="http://www.openuri.org/" xmlns:s="http://www.w3.org/2001/XMLSchema">
<s:element name="AddNumbers">
<s:complexType>
<s:sequence>
<s:element name="NumberOne" type="s:int"/>
<s:element name="NumberTwo" type="s:int"/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="AddNumbersResponse">
<s:complexType>
<s:sequence>
<s:element name="AddNumbersResult" type="s:int"/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="int" type="s:int"/>
</s:schema>
</types>
<message name="AddNumbersSoapIn">
<part name="parameters" element="s0:AddNumbers"/>
</message>
<message name="AddNumbersSoapOut">
<part name="parameters" element="s0:AddNumbersResponse"/>
</message>
<message name="AddNumbersHttpGetIn">
<part name="NumberOne" type="s:string"/>
<part name="NumberTwo" type="s:string"/>
</message>
<message name="AddNumbersHttpGetOut">
<part name="Body" element="s0:int"/>
</message>
<message name="AddNumbersHttpPostIn">
<part name="NumberOne" type="s:string"/>
<part name="NumberTwo" type="s:string"/>
</message>
<message name="AddNumbersHttpPostOut">
<part name="Body" element="s0:int"/>
</message>
<portType name="addSoap">
<operation name="AddNumbers">
<input message="s0:AddNumbersSoapIn"/>
<output message="s0:AddNumbersSoapOut"/>
</operation>
</portType>
<portType name="addHttpGet">
<operation name="AddNumbers">
<input message="s0:AddNumbersHttpGetIn"/>
<output message="s0:AddNumbersHttpGetOut"/>
</operation>
</portType>
<portType name="addHttpPost">
<operation name="AddNumbers">
<input message="s0:AddNumbersHttpPostIn"/>
<output message="s0:AddNumbersHttpPostOut"/>
</operation>
</portType>
<binding name="addSoap" type="s0:addSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="AddNumbers">
<soap:operation soapAction="http://www.openuri.org/AddNumbers" style="document"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<binding name="addHttpGet" type="s0:addHttpGet">
<http:binding verb="GET"/>
<operation name="AddNumbers">
<http:operation location="/AddNumbers"/>
<input>
<http:urlEncoded/>
</input>
<output>
<mime:mimeXml part="Body"/>
</output>
</operation>
</binding>
<binding name="addHttpPost" type="s0:addHttpPost">
<http:binding verb="POST"/>
<operation name="AddNumbers">
<http:operation location="/AddNumbers"/>
<input>
<mime:content type="application/x-www-form-urlencoded"/>
</input>
<output>
<mime:mimeXml part="Body"/>
</output>
</operation>
</binding>
<service name="add">
<port name="addSoap" binding="s0:addSoap">
<soap:address location="http://localhost:7001/add/add.jws"/>
</port>
<port name="addHttpGet" binding="s0:addHttpGet">
<http:address location="http://localhost:7001/add/add.jws"/>
</port>
<port name="addHttpPost" binding="s0:addHttpPost">
<http:address location="http://localhost:7001/add/add.jws"/>
</port>
</service>
</definitions>
查看的目的是得到:targetNamespace=http://www.openuri.org/
可以填寫在客戶端的代碼中。
4.運行weblogic workshop的webservice測試工具,通過查看源代碼,得到其webservice的地址。注意,這一步和微軟的例子是不同的。
得到按鈕提交的地址是:http://localhost:7001/add/add.jws/AddNumbers
5.用vc建立一個console的程序,其全部代碼如下:
#include <stdio.h>
#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;
void Add()
{
ISoapSerializerPtr Serializer;
ISoapReaderPtr Reader;
ISoapConnectorPtr Connector;
// Connect to the service.
Connector.CreateInstance(__uuidof(HttpConnector30));
Connector->Property["EndPointURL"] = "http://localhost:7001/add/add.jws/AddNumbers";
Connector->Connect();
// Begin the message.
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("","STANDARD","");
Serializer->StartBody("");
Serializer->StartElement("AddNumbers","http://www.openuri.org/","","");
//Serializer->StartElement("AddNumbers xmlns=\"http://www.openuri.org/\" ","","","");
//Serializer->StartElement("AddNumbers","","STANDARD","");
Serializer->StartElement("NumberOne","http://www.openuri.org/","","");
Serializer->WriteString("5");
Serializer->EndElement();
Serializer->StartElement("NumberTwo","http://www.openuri.org/","","");
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);
return;
}
int main()
{
CoInitialize(NULL);
Add();
CoUninitialize();
return 0;
}
6.運行結(jié)果,如下: