当前位置: 代码迷 >> Web前端 >> 在C++停使用gSoap 调用Java开发的Web Service
  详细解决方案

在C++停使用gSoap 调用Java开发的Web Service

热度:105   发布时间:2012-07-28 12:25:13.0
在C++下使用gSoap 调用Java开发的Web Service

?

最近有一个需求要在C++ 里面调用Java 的Web Service。具体的环境是 VS2008, XP sp3.

这两个东东一组合就悲催了。 本来基于微软自己的技术有两个可以选。

? ?1 ATL Server, 悲催的微软啊, 从VS 2008 将ATL Server 从Visual Studio 中拿到了去所谓的开源了。从此在VS2008 里面选用 add web reference 也会出错的, sproxy.exe 也被拿掉了。?去下载了个 ATL Server 的源代码 也没有办法成功编译sproxy。 想想反正这个sproxy 生成的代码也会是一坨一坨的 template 代码。 咱不专业啊, 找其它的呗。

? ?2,微软还有个Windows Web Services API?不过这个更搞, 只有在windows 7, window 2008 下用。 ?如果XP 下用还得发email 给微软问它讨, 这个你还得是啥大客户啥的, 一年至少几万美刀级别的。?

幸好有啥, 开源。开源好啊, 找到个gSoap。 这个现在差不多也成了一个在c++下使用Web Service的事实标准了。 鉴于这个gSoap 的使用方法还得整理出来放到项目的wiki。 俺们就干脆用英语整理了,省的来两遍。

1, ?gSoap is an open source Web Service /XML binding for ?C/C++. ?It supports ?Windows and GCC operating system.

? ? go to the official web site?

? ??http://sourceforge.net/projects/gsoap2

? ? or goto?download the?http://sourceforge.net/projects/gsoap2/files/latest/download

? ? ? ? Currently the stable version is 2.8.8

? ? ?

? ? ?Of couse we can build the tools from scratch. There is?VisualStudio2005 folder, under which the Readme is very importance. ?


2, ? We can just use the tools under gSoap to build the stub and proxy source code for us:

? ? ?there are two tools under gSoap, ther are?wsdl2h and soapcpp2.

? ? ? ?1,?wsdl2h -o ?service.h ?-n namespacename ?URL or file name

? ? ? ? ? the generatd service.h file will be used in the next step.?

? ? ? ?2,?soapcpp2 ?service.h -C -i -x -I F:\study_code\mfc\gsoap_2.8.8\gsoap-2.8\gsoap\import

? ? ? ? -I ?sepecify the import folder under gSoap.

? ? ? ? soapcpp2 will generate the proxy, soaph.h, soapc.c files. ?

?

3, ?how to use the generated files.

? ? Normally, we just use the web service client.If we compile the client code, we need files

? ? ? ? ? soaph.h

? ? ? ? ??soapRSOWebserviceServiceSoapBindingProxy.h

? ? ? ? ? soapStub.h

? ? ? ? ? soapc.cpp

? ? ? ? ??soapRSOWebserviceServiceSoapBindingProxy.cpp

? ? ? ?and other two files : ? stdsoap2.h, stdsoap2.cpp ( they are under the gSoap folder)

? ?The example code can be like:

?

#include "RSOWebserviceServiceSoapBinding.nsmap"
#include "soapRSOWebserviceServiceSoapBindingProxy.h"

const char endpoint[] = "http://localhost:8080/rso-ws-1.0.5/service";
int main(int argc, char **argv)
{ 
    RSOWebserviceServiceSoapBindingProxy  proxy(SOAP_XML_INDENT);

	std::string landingPath = "c";	/* optional element of type xsd:string */
	int customerId = 2;	/* optional element of type xsd:int */
	int clientId = 3;	/* optional element of type xsd:int */
	std::string groupExternalId = "groupExternalId";	/* optional element of type xsd:string */
	std::string memberId = "memberId";	/* optional element of type xsd:string */

	wstest1__getRSOToken wstest1__getRSOToken_;
	wstest1__getRSOToken_.clientId = &clientId;
	wstest1__getRSOToken_.customerId = &customerId;
	wstest1__getRSOToken_.groupExternalId = &groupExternalId;
	wstest1__getRSOToken_.landingPath = &landingPath;
	wstest1__getRSOToken_.memberId = &memberId;
    wstest1__getRSOTokenResponse wstest1__getRSOTokenResponse_;
	proxy.getRSOToken(endpoint, NULL, &wstest1__getRSOToken_, &wstest1__getRSOTokenResponse_);

	std::cout << *(wstest1__getRSOTokenResponse_.rsoToken) << std::endl;

	std::cout << "successful" << std::endl;
  
}    
  相关解决方案