Qt+gsoap调用WebService
版权声明本文为原创作品,请尊重作者的劳动成果。转载必须保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。 Qt+gsoap调用WebService 1.???????前言 Qt本身给我们提供了调用WebService的解决方案qsoap,看了一下他的介绍,感觉实在是太弱了,而且又是个新出的东西,所以还是决定不用他。既然使用Qt,那当然是跨平台的解决方案才合适,显示MS的SoapToolKit也不在选择的范围。于是改用老牌的gsoap。 2.???????环境 Qt版本: Qt4.6(其他版本也适合) GSOAP版本: gsoap2.7.12(其他版本也适用) 服务端开发环境: VS2008、C#、.net2.0以上 3.???????准备 到http://www.voidcn.com/tag/http://sourceforge.net/projects/gsoap2下载gsoap,然后解压,并把 gsoap-2.7/gsoap/bin/win32设置到系统的Path中去。 4.???????服务端 打开VS2008,建立WebService工程。全部采用默认设置就可以了。 最后修改一下代码,加上点中文。如下: namespace?WebService1 { ????///?<summary> ????///?Service1?的摘要说明 ????///?</summary> ????[WebService(Namespace?=?"http://tempuri.org/")] ????[WebServiceBinding(ConformsTo?=?WsiProfiles.BasicProfile1_1)] ????[ToolboxItem(false)] ????//?若要允许使用?ASP.NET AJAX?从脚本中调用此?Web?服务,请取消对下行的注释。 ????// [System.Web.Script.Services.ScriptService] ????public?class?Service1?:?System.Web.Services.WebService ????{ ? ????????[WebMethod] ????????public?string?HelloWorld() ????????{ ????????????return?"Hello World你好"; ????????} ????} } 5.???????客户端 l?????????建立文件夹client/gsoap。并把gsoap-2.7/gsoap/下的stdsoap2.cpp和stdsoap2.h拷贝至刚刚建立的gsoap文件夹下。 l?????????打开命令行,cd C:/WSTest/client/gsoap,然后执行: wsdl2h -I"E:/gsoap/source/gsoap-2.7/gsoap/WS" -o test.h?http://localhost:5925/Service1.asmx?WSDL 该操作将生成C:/WSTest/client/gsoap/test.h l?????????执行soapcpp2 -I"E:/gsoap/source/gsoap-2.7/gsoap/import" test.h l?????????然后我们编写test.cpp #include?<QApplication> #include?<QPushButton> #include?<QLineEdit> #include?<QHBoxLayout> #include?<QDialog> #include?"gsoap/Service1Soap.nsmap" #include?"gsoap/soapService1SoapProxy.h" class?MyDialog:public?QDialog ?????Q_OBJECT public:? ?????MyDialog(QWidget?*parent=0):QDialog(parent) ?????{ ?????????btn?=new?QPushButton("invoke"); ?????????line?=?new?QLineEdit; ?????????connect(btn,SIGNAL(clicked()),this,SLOT(OnClicked())); ?????????QHBoxLayout?*layout?=?new?QHBoxLayout; ?????????layout->addWidget(line); ?????????layout->addWidget(btn); ?????????setLayout(layout); ?????} private: ?????QPushButton?*btn; ?????QLineEdit?*line; ?????public?slots: ?????????void?OnClicked() ?????????{ ??????????????Service1Soap?soap; ??????????????soap_set_mode(soap.soap,?SOAP_C_UTFSTRING); ??????????????_ns1__HelloWorld?req; ??????????????_ns1__HelloWorldResponse?res; ??????????????soap.__ns2__HelloWorld(&req,&res); ??????????????QString?str?=?QString::fromUtf8(res.HelloWorldResult->c_str()); ??????????????line->setText(str); ?????????} }; #include?"test.moc" ? int?main(int?argc,char*?argv[]) ?????QApplication?app(argc,argv); ?????MyDialog?md; ?????md.show(); ?????return?app.exec(); l?????????然后就是编写pro文件。 ???????SOURCES += test.cpp / ????????????????????????????????????gsoap/soapC.cpp / ????????????????????????????????????gsoap/soapClient.cpp / ????????????????????????????????????gsoap/stdsoap2.cpp l?????????最后就是qmake、nmake 注意: soap_set_mode(soap.soap,SOAP_C_UTFSTRING);这句是为了显示中文的,让字符串采用utf8编码。当我们在使用命令行程序的时候,即使使用了该选项也显示不出中文,因为命令行显示的字符串必须经过decode成GBK才可以显示。 代码下载: Qt使用gsoap来访问webservice,绝对可用例子 http://download.csdn.net/download/luchenlin4/6852861
|