如何在C 中使用WebService

2021-06-26 07:24:40 字數 2662 閱讀 6806

將他解壓後,進入到資料夾:gsoap_2.8.18\gsoap-2.8\gsoap\bin\win32

裡面有2個我們要用到的exe,wsdl2h.exe和soapcpp2.exe,如果缺少乙個typemap.dat,則從gsoap_2.8.18\gsoap-2.8\gsoap下拷貝進來,最後就可以啟用cmd,開始生成webservice了

我的做法是拷貝乙個cmd的快捷方式進來,然後右鍵屬性,把它的「起始位置」設定為f:\website\gsoap_2.8.18\gsoap-2.8\gsoap\bin\win32,應用後啟動此快捷方式,那麼操作目錄就為當前目錄了。利用wsdl2h.exe,使用cmd生成webservice的標頭檔案如下:

wsdl2h -o 頭檔名 wsdl檔名或url

說明:(注意大小寫)

-o 檔名,指定輸出頭檔名

-n 命名空間字首 代替預設的ns

-c 產生純c**,否則是c++**

-s 不要使用stl**

-t 檔名,指定type map檔案,預設為typemap.dat

-e 禁止為enum成員加上命名空間字首

這裡我生成乙個.h標頭檔案,不使用stl,結果如下:

生成的.h就包含了所有預先寫好的webservice函式介面。從cmd中可以看到該命令需要用到typemap.dat檔案,所以如果沒有該檔案,會提示找不到檔案,需要從別處拷貝過來。接下來,我們按照cmd最後的提示,進行下一步,用soapcpp2.exe來生成可用的.h和.cpp檔案:

soapcpp2常用選項:(注意大小寫)

-c 僅生成客戶端**

-s 僅生成伺服器端**

-l 不要產生soapclientlib.c和soapserverlib.c檔案

-c 產生純c**,否則是c++**(與標頭檔案有關)

-i 指定import路徑(見上文)

-x 不要產生xml示例檔案

-i 生成c++包裝,客戶端為***xproxy.h(.cpp),伺服器端為***xservice.h(.cpp)

如果報錯:critical error: #import: cannot open file "stlvector.h"for reading.

hint: use option -i(you candefine multiple paths separated with ';')

則要使用-i選項指定gsoap的 import檔案路徑

我使用的命令列是:

soapcpp2 -c -x ***.h -if:\website\gsoap_2.8.18\gsoap-2.8\gsoap\import

意為根據***.h只生成客戶端**,不生成無用的xml檔案,另外要引用乙個import資料夾,結果如下:

最後的compilation successful說明了一切,結果就是生成了乙個nsmap命名空間檔案,二個.h檔案,三個.cpp檔案

最後,我們新建乙個c++的控制台工程來使用它們

注意:1.      第一步生成的.h不用加進來,直接使用由它生成的後續.h和.cpp即可

2.      stdsoap2.h和stdsoap2.cpp來自於路徑:f:\website\gsoap_2.8.18\gsoap-2.8\gsoap

3.      除nsmap檔案外,其他6個都要新增到工程裡面編譯,然後新增測試**

工程截圖:

執行結果截圖:

可以看到返回的userloginresult為,這是我這個專案約定的通訊格式,msg_code為1代表成功,意為這裡的登陸測試**執行結果為登陸成功,同理,修改**將使用者名稱密碼設為空再登陸,則執行結果為:

這樣則為登陸失敗

1.       使用webservice所呼叫的函式到一開始生成的.h中查詢,再在函式名前加上soap_call_即可。如在.h中找到了登陸函式__tempuri__userlogin

,再加上字首後變成了soap_call___tempuri__userlogin_(好像後面還多了乙個下劃線),發現這個函式是在soapclient.cpp中實現的,所以也驗證了之前說的,不需要在工程中新增.h

2.      如果在vc中開發的話,引入的3個cpp檔案要進行設定不使用預編譯標頭檔案,方法:工程 -》設定 -》選擇cpp檔案 -》預編譯頭 -》選擇不使用。另一方面,soap也是使用socket通訊的所以鏈結的時候還要加上wsock32.lib,方法:工程-》設定-》鏈結在後面加上wsock32.lib即可

3.      nsmap命名空間檔案最好是用#include寫在stdafx.h檔案中

如何在 C 中使用 RabbitMQ

rabbitmq 是乙個非常流行的,開源的,使用erlang語言編寫的框架,通常在電信級平台中作為訊息中介軟體使用,rabbitmq實現了高階的amqp協議用於實現程序間,應用程式間,伺服器之間的訊息互動,而且它還有乙個非常?的特性,你可以使用自定義外掛程式來擴充套件rabbitmq的功能,而且它還...

如何在 C 中使用 Attribute

attribute 在 c 中是乙個非常強大的特性,它能夠給你的程式集新增元資料資訊。attribute 實際上是乙個物件,它可以與以下元素中的任何乙個相關聯 程式集 類 方法 委託 列舉 事件 字段 介面 屬性和結構,它會在這些物件上做資訊宣告,當程式執行之後,你可以通過反射來獲取關聯到這些物件上...

如何在 C 中使用 反射

c 中的反射常用於在程式的執行時獲取型別的元資料,可獲取的資訊包括已載入到程序中的程式集和型別資訊,它和 c 中的rtti runtime type information 的作用是差不多的。為了能夠使用反射,需要在專案中引用system.reflection命名空間,在使用反射的開始,你會獲取乙個...