【原创】用Visual C++客户端调用Weblogic的Webservice |
提交时间: Nov 10, 2006 1:31:44 PM |
|
|
前段时间研究了以下用Visual C++调用weblogic的webservice,发现与调用微软的webservice还是不同的,用其自带的例子无法实现与weblogic的webservice的通讯,下面和大家分享一下实现的方法。 1.首先,需要安装微软的mssoap tookit 3.0工具包,可以从微软的官方网站上下载; 2.使用weblogic的workshop建立一个web服务 。
代码如下所示: 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文件,内容如下: <?xml version="1.0" encoding="utf-8"?> <!-- @editor-info:link autogen="true" source="add.jws" --> <definitions xmlns="http://schemas./wsdl/" xmlns:conv="http://www./2002/04/soap/conversation/" xmlns:cw="http://www./2002/04/wsdl/conversation/" xmlns:http="http://schemas./wsdl/http/" xmlns:jms="http://www./2002/04/wsdl/jms/" xmlns:mime="http://schemas./wsdl/mime/" xmlns:s="http://www./2001/XMLSchema" xmlns:s0="http://www./" xmlns:soap="http://schemas./wsdl/soap/" xmlns:soapenc="http://schemas./soap/encoding/" targetNamespace="http://www./"> <types> <s:schema elementFormDefault="qualified" targetNamespace="http://www./" xmlns:s="http://www./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./soap/http" style="document"/> <operation name="AddNumbers"> <soap:operation soapAction="http://www./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./ 可以填写在客户端的代码中。
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./","",""); //Serializer->StartElement("AddNumbers xmlns=\"http://www./\" ","","",""); //Serializer->StartElement("AddNumbers","","STANDARD",""); Serializer->StartElement("NumberOne","http://www./","",""); Serializer->WriteString("5"); Serializer->EndElement(); Serializer->StartElement("NumberTwo","http://www./","",""); 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.运行结果,如下:
|
|
|