gSoap下Server端接口函數的數據傳出[轉]

一、引言

  • gSOAP是一個OpenSource的web服務開發工具,包括server/client通信和wsdl 自動生成功能,能依據wsdl文件生成server和client代碼,產生的代碼小巧簡潔不依賴其他xml解析庫,很容易移植,大大減輕 webservice程序員的工作量。它提供一種獨特的SOAP/XML到C/C++ 語言綁定,以簡化C或C++中SOAP/XML Web服務和客戶機的開發。gSOAP工具包括一個WSDL生成器,用於爲您的 Web 服務生成 Web 服務描述。WSDL importer 工具使SOAP客戶機應用程序開發完全自動化。

  • gSoap大大簡化了使用C/C++開發WEB Service流程,是C/C++開發人員開發WEB服務一種較佳選擇。gSoap的安裝以及開發文檔請參見參考文獻[1]、[2]和[3],下面我們主要關注gSoap下Server端接口函數的數據傳出。

二、單個傳出參數

  • gSoap接口函數的返回值只能是int,是soap調用的結果,一般通過soap.error來判斷soap的連接情況。接口函數的最後一個參數爲傳出參數,必須爲引用或指針類型(注:傳入參數爲能爲引用類型)。如下所示:

  • int ns__add(struct soap *add_soap, int num1, int num2, int *sum);

三、多個傳出參數

  • 如果需要傳出多個參數,需要自己定義一個結構將返回項封裝,然後以此結構體作爲單個參數傳出即可。如下所示:

  • struct type_return{
    • int id;
      char *name;
      int age;
    }

    int ns__getInfo(struct soap *soap, int id, struct type_result *ret);

四、二進制數據傳出

  • 無 論是axis c++還是gsoap,對複雜數據類型的支持都不是太好,再加上gsoap的.h文件中不能包含(#include)別的.h文件,可能不能生效,所以需 要使用void數據類型,不指明數據類型,返回後再作處理。然而,gsoap不能對void數據類型進行串化(serialize)操作,除非使用 union或struct分配實時類型信息。因此,當傳出二進行數據時,需要使用xsd__base64Binary結構類型來操作。如下所示:

  • struct xsd__base64Binary{
    • unsigned char *__ptr;
      int __size;
    };

    在使用上述結構時,可能需要使用soap_malloc()來進行內存分配,並分配__size值。

    int ns__demoFunction(struct soap *soap,..., struct xsd__base64Binary *ret)
    {
    • ...
      ret->__ptr = (unsigned char *)soap(soap, size); /*size爲內存大小*/
      ret->__size = size;
      memset(ret->__ptr, 0, size);
      memcpy(ret->__ptr, src_ptr, size); /*src_ptr爲源數據塊指針*/
      ...
      return SOAP_OK;
    }

五、文件數據傳出

  • Soap 協議支持附件(Attachment),gSoap支持MIME/DIME附件,我們可以使用這個特性來進行整個文件或大量的數據傳出。gSoap附件操 作與(四)中的二進制數據傳出非常相近,同樣使用struct xsd__base64Binary類型。這時不再重複,詳細可參考文獻[2]中的#13 MIME Attachments。

六、參考文獻

1.官方網站
2.gSoap User Guide
3.構建WEB服務C/C++客戶機
4.用C實現WebService

轉於
http://hi.baidu.com/songfeng163/blog/item/89ac27f7a3578f20720eecf3.html
發佈了31 篇原創文章 · 獲贊 5 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章