在企業級集成、嵌入式系統、高性能服務等場景下,C語言憑藉其極致的執行效率、底層控制能力和跨平台特性,成為實現Web Service的有力選擇。本文基於gSOAP 2.6工具包,在Linux kernel 2.4.2環境下,通過一個「加法運算」的完整案例,手把手演示從接口定義到客戶端/服務端雙向通信的全流程開發。
/usr/local/gsoapg++(支持C++兼容編譯C代碼)add.h)使用gSOAP專用註釋指令聲明接口函數 ns__add:
//gsoap ns service name: add
//gsoap ns service namespace: https://mail.263.net/add.wsdl
//gsoap ns service location: https://mail.263.net
//gsoap ns service executable: add.cgi
//gsoap ns service encoding: encoded
//gsoap ns schema namespace: urn:add
int ns__add(int num1, int num2, int* sum);
關鍵點:註釋行不可刪除,供 soapcpp2 識別;返回值固定為 int(表示SOAP調用狀態);最後一個參數為輸出參數(指針);多返回值需自定義結構體封裝。
Makefile)利用 soapcpp2 從 add.h 生成存根代碼(.c/.h/.xml/.wsdl 等),並編譯鏈接客戶端/服務端可執行文件。Makefile 核心變量與規則:
GSOAP_ROOT=/usr/local/gsoap
WSNAME=add
CC=g++ -g -DWITH_NONAMESPACES
INCLUDE=-I $(GSOAP_ROOT)
# 目標文件分組...
all: server
${WSNAME}.wsdl: ${WSNAME}.h
$(GSOAP_ROOT)/soapcpp2 -p$(WSNAME) -i -n -c ${WSNAME}.h
# 編譯規則、server/client鏈接規則...
addserver.c)struct soap 上下文soap_bind)soap_accept)add_serve 處理請求ns__add(多一個 struct soap* 參數)int ns__add(struct soap *add_soap, int num1, int num2, int *sum) {
*sum = num1 + num2;
return 0; // SOAP_OK
}
shell> make
shell> ./addserver 8888
# 輸出 "Socket connection successful: master socket = 3" 表示就緒
瀏覽器訪問 https://localhost:8888 可見 WSDL 定義。
addclient.c)封裝 soap_call_ns__add,統一錯誤處理與資源清理:
int add(const char* server, int num1, int num2, int *sum) {
struct soap add_soap;
soap_init(&add_soap);
soap_set_namespaces(&add_soap, add_namespaces);
soap_call_ns__add(&add_soap, server, "", num1, num2, sum);
// 錯誤檢查、soap_end、soap_done...
}
addtest.c)並驗證shell> make client
shell> ./addtest 7 8
# 輸出: 7+8=15
//gsoap ... 為 soapcpp2 識別標記。int 返回值供SOAP框架判斷調用成敗。struct。.h 文件禁用 #include 其他頭文件:可能不生效,所需結構體直接在文件中聲明。void* 佔位)。本文演示了gSOAP「契約優先」開發模式的標準流程。實際項目中可進一步探索:異步處理、SSL/TLS加密、WS-Security認證、大數據傳輸優化(MTOM)、與C++類封裝結合等。gSOAP文檔豐富,官網提供大量進階範例,值得深入研習。