c++實現webservice

1、編寫webservie需要調用的函數,格式如下

(1)對外接口頭文件開頭註釋格式

//gsoap ns service name: scada
//gsoap ns service protocol: SOAP
//gsoap ns service style: rpc
//gsoap ns service location: http://localhost
//gsoap ns service executable: scada.cgi
//gsoap ns service encoding: encoded
//gsoap ns schema namespace: urn:scada
前三行是必須有的,如果沒有,編譯會失敗,後四行如果沒有gsoap會使用默認的配置進行編譯。
//gsoap ns service name: scada,這一行指定了WebService的名字,隨意即可,它只關係到最終生成的文件和類的名字,只要符合其實際的含義,名字隨意
//gsoap ns service protocol: SOAP ,WebService所用協議,默認SOAP即可
//gsoap ns service style: rpcWebService類型,默認rpc即可,表示使用遠程調用
(2)對外接口頭文件內容
        聲明函數的原型,提供外部調用的接口:
int ns__GetTodayData(int equipid, int valuetype, std::string& result);
int ns__GetStations(std::string& result);
int ns__GetEquips(int stationsid, std::string& result);
注意事項:
a.返回值必須是int
b.函數名必須要以基本命名空間(即上面的ns__)開頭,命名空間後面必須要加兩個下劃線,兩個下劃線後面就可以跟隨任意的符合命名規範的函數名了
c.參數必須至少有1個,最後一個參數表示WebService的返回值,它必須是指針或者引用(因爲只有這樣我們才能在函數內部修改這個值)
d. 不支持const引用參數,不支持標準庫中的容器,如果要使用容器,gsoap-2.8\gsoap\import裏面會有對應頭文件,使用格式爲#import XXX.h

2、下載gsoap-2.8包,解壓以後進入gsoap-2.8\gsoap\bin\win32,複製soapcpp2.exe到新建文件夾test

3、cmd命令行切換到test目錄,mkdir gSOAP soapcpp2.exe -i -dgSOAP rxscada.h(如果有import頭文件,使用-ID:\gsoap-2.8\gsoap的方式指定)。

4、建立工程

(1)創建新工程

用vs2012創建一個普通的空項目,需要導入的文件有:soapC.cpp、soaprxscadaService.cpp、stdsoap2.cpp,soapXXXXXService.cpp的名字會根據接口頭文件的註釋內容變化而不同,stdsoap2.cpp 在gsoap-2.8\gsoap目錄下。
需要放置到項目文件夾內的文件有:


其中stdsoap2.h是從gsoap-2.8\gsoap目錄下拷貝的,其他文件都是gsoap2.exe自動生成的

(2)創建接口的實現文件

首先創建一個scadaservice.hpp文件,引入頭文件,編寫實現的函數體, 其中類名scadaService在soapscadaService.h中定義的。

#include "soapscadaService.h"
#include "scada.nsmap"
#include "soapH.h"
int rxscadaService::GetTodayData(int equipid, int valuetype, std::string& result)
{
    if (equipid == 1 && valuetype != 0)
    {
        result = "{id:1,name:2}";
	return SOAP_OK; 
    } else { 
     	return soap_receiverfault("GetTodayData error:", "please input right paramerter");
    }
}

int rxscadaService::GetStations(std::string& result)
{
}

int rxscadaService::GetEquips(int stationsid, std::string& result)
{
}

所有在scada.h裏面定義的函數,都必須實現。函數的返回值,如果正常返回SOAP_OK如果異常,返回soap_receiverfault類型的對象,參數可以根據異常的類型自定義。


(3)創建webservice服務的入口

#include "soapscadaService.h"
#include "scada.h"
#include "scadaservice.hpp"

int main()
{

    rxscadaService serv;
    serv.recv_timeout = 100;
    serv.bind_flags = SO_REUSEADDR;
    int _error = SOAP_OK;
    std::ofstream _log("soap.log", std::ios::app);

    while (true)
    {
        _error = serv.run(8080);
        serv.soap_stream_fault(std::cerr);

        serv.soap_stream_fault(_log);
        _log.flush();
    }	
}

其中,_error = serv.run(8080);指定了程序運行的綁定端口號,std::ofstream _log("soap.log",std::ios::app);指定了程序在執行過程中,異常的自動記錄文件名。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章