在C語言中,發(fā)送WebService請求通常使用SOAP協(xié)議,其返回結(jié)果是XML格式的。如果我們要將XML格式的數(shù)據(jù)轉(zhuǎn)換為JSON格式,需要額外的工作。但是,如果使用WSDL來聲明WebService然后生成代碼,則可以讓工作更加簡單和高效。
我們可以使用開源的gSOAP工具來生成C語言的WebService代碼。gSOAP不僅可以生成客戶端代碼,還可以生成服務(wù)器代碼。當(dāng)我們使用在WSDL中使用“rpc / encoded”示例時,gSOAP自動將XML轉(zhuǎn)換為JSON格式。為了生成客戶端代碼,我們可以使用以下命令:
soapcpp2.exe -j -x -c -SI example.wsdl
此命令將生成一個C源文件和頭文件,以及用于訪問WebService的輔助功能代碼。接下來,我們可以使用以下代碼發(fā)送(HTTP GET)請求并解析響應(yīng):
#include "soapH.h" #include "Example.nsmap" #include "struct_Example.h" // 應(yīng)包含我們的自定義結(jié)構(gòu)的頭文件 int main() { struct soap soap; //創(chuàng)建一個SOAP對象 soap_init(&soap); //初始化SOAP對象 //構(gòu)建請求消息 struct _ns1__GetUserInput in; struct _ns1__GetUserOutput out; memset(&in, 0, sizeof(in)); memset(&out, 0, sizeof(out)); in.userinfo = "abc123"; //發(fā)送請求并解析響應(yīng) if (soap_call___ns1__GetUser(&soap, "http://example.com/example/wsdl", "", &in, &out) == SOAP_OK) { //輸出JSON printf("User Information:\n"); printf("- Name: %s\n", out.name); printf("- Age: %d\n", out.age); } else { //出錯處理 soap_print_fault(&soap, stderr); } //清理SOAP對象 soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return 0; }
在這個例子中,我們請求了一個名為“GetUser”的WebService,并將“abc123”作為參數(shù)傳遞給它。響應(yīng)被解析為一個自定義結(jié)構(gòu),包含“名稱”和“年齡”字段。最后,我們將結(jié)果輸出為JSON格式。
總體來說,使用WSDL生成C代碼可以讓我們更加簡便和高效地與WebService交互,并且可以避免手動轉(zhuǎn)換XML到JSON。另外需要注意的是,我們也可以在WSDL中指定其他示例(例如“document / literal”或“rpc / literal”),并相應(yīng)地修改gSOAP的命令行選項和代碼。