win7 gsoap與vs2010 c++建立Web Service

---恢復內容開始---html

以前曾經編寫過簡單的樣例,好久沒有碰過,發現已經所有忘記,現在又須要從新鞏固一下。c++

首先是下載gsoap,沒法訪問官方下載頁面,只能在網上搜索,找到一個2.8版本存入雲盤以防再次找不到。web

下面記錄一下,經過gsoap建立web Service的過程。網絡

1.建立一個項目文件夾calcapp

2.在calc文件夾中,建立一個頭文件calc.cppsocket

// Contents of file "calc.h": 
//gsoap ns service name: calculator
//gsoap ns service style: rpc
//gsoap ns service encoding: encoded
//gsoap ns service port: http://localhost:8080/calc/calculator.cgi
//gsoap ns service namespace: urn:calculator
int ns__add(double a, double b, double &result); 
int ns__sub(double a, double b, double &result); 
int ns__sqrt(double a, double &result); 

須要注意的是註釋部分不可省略,該部分記錄了一些重要的配置信息。函數

3.下載gsoap壓縮包,獲取/gsoap-2.8/gsoap/中的stdsoap.cpp與stdsoap.h文件(注意:本文使用c++所以是stdsoap.cpp文件,若使用c應該選取stdsoap.c文件。該文件提供web service項目中所需函數的聲明與實現)。獲取/gsoap-2.8/gsoap/bin/win32/中的soapcpp2.exe(用來解析建立的頭文件),並將其放入calc.h所在的calc文件夾中(方便執行命令行,固然也可不用放在此路徑下cmd命令複雜些:soapcpp2 (calc.h的路徑)/calc.h -I (指定生成文件目錄))。工具

4.啓動cmd窗體,切換至soapcpp2.exe所在目錄,執行 soapcpp2 calc.h 生成以下文件:學習

其中的calc.cpp是後期本身添加的文件,soappcpp2程序是爲操做方便,以前添加進去的。spa

注:關於soapcpp2的命令的使用能夠經過soapcpp2 -h來查看。

4.開始建立calculator(Win32 控制檯應用程序) 解決方案(當前默認添加的項目爲calculator,本文將其定義爲server端,稍後會再添加項目定義爲Client端)。

爲了簡便,在此建立一個空項目。

5.進行網絡通訊,添加WSock32.lib。

結果以下圖:

點擊應用、肯定即添加完畢。

6.打開此項目目錄,添加文件以下:

其中calc.cpp內容以下(calc.h方法實現):

 

#include "soapH.h"
#include "calculator.nsmap"
#include <math.h> 

int main(int argc, char **argv)
{
    int m, s;
    struct soap add_soap;
    soap_init(&add_soap);
    soap_set_namespaces(&add_soap,namespaces);
    if(argc < 2){
        printf("usage: %s <server_port> \n",argv[0]);
        exit(1);
    }else{
        m = soap_bind(&add_soap,NULL,atoi(argv[1]),100);
        if(m < 0){
            soap_print_fault(&add_soap,stderr);
            exit(-1);
        }
        fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
        for(;;){
            s = soap_accept(&add_soap);
            if(s < 0){
                soap_print_fault(&add_soap,stderr);
                exit(-1);
            }
            fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);  
            soap_serve(&add_soap);  
            soap_end(&add_soap); 
        }
    }
    //soap_serve(soap_new()); 
    return 0;
}

// Implementation of the "add" remote method: 
int ns__add(struct soap *soap, double a, double b, double &result) 
{ 
   result = a + b; 
   return SOAP_OK; 
} 
// Implementation of the "sub" remote method: 
int ns__sub(struct soap *soap, double a, double b, double &result) 
{ 
   result = a - b; 
   return SOAP_OK; 
} 
// Implementation of the "sqrt" remote method: 
int ns__sqrt(struct soap *soap, double a, double &result) 
{ 
   if (a >= 0) 
   { 
      result = sqrt(a); 
      return SOAP_OK; 
   } 
   else
   { 
      return soap_sender_fault(soap, "Square root of negative value", "I can only compute the square root of a non-negative value");
   } 
} 

 

 

7.向項目中添加文件:

其中calc.cpp爲新建項,其他爲現有項,最終結果如圖:

8.生成項目,報錯以下;

搜索解決方法,以下:

9.右鍵項目,從新生成便可。

10.右鍵解決方案,新建calcClient項目,一樣爲空項目,步驟如建立Server端相同,也須要添加WS32.lib,在添加所需文件時不一樣,文件以下:

11.calcClient.cpp以下:

#include "soapStub.h"  
#include "calculator.nsmap"  

int add(const char *server, int num1, int num2, double &sum)
{  
    struct soap add_soap;  
    int result = 0;  
    soap_init(&add_soap);  
    soap_set_namespaces(&add_soap, namespaces);  
    soap_call_ns__add(&add_soap, server, NULL, num1, num2, sum);  
    printf("server is %s, num1 is %d, num2 is %d\n", server, num1, num2);  
  
    if (add_soap.error) {  
        printf("soap error: %d, %s, %s\n", add_soap.error, *soap_faultcode(&add_soap), *soap_faultstring(&add_soap));  
        result = add_soap.error;  
    }
    soap_end(&add_soap);  
    soap_done(&add_soap);  
    return result;  
} 

calcClientTest.cpp以下:

    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>  
      
    int add(const char *server, int num1, int num2, double &sum);
    int main(int argc, char **argv)  
    {  
        int result = -1;  
        char server[128] = {0};  
        int num1;  
        int num2;  
        double sum;  
      
        if (argc < 4) {  
            printf("usage: %s <ip:port> num1 num2 \n", argv[0]);  
            exit(1);  
        }  
      
        strcpy(server,argv[1]);  
        num1 = atoi(argv[2]);  
        num2 = atoi(argv[3]);  
        result = add(server, num1, num2, sum);  
      
        if (result != 0) {  
            printf("soap error, errcode=%d \n", result);  
        } else {  
            printf("%d + %d = %f \n", num1, num2, sum);  
        }  
        return 0;  
    }  

最終項目結構以下:

12.修改清單工具中的輸入輸出,將嵌入清單改成「否」,不然會報如前的連接錯誤。

13.生成Client端。

14.運行Server與Client。

啓動cmd切換至calculator.exe所在目錄,執行:calculator 8080 啓動Server端

啓動cmd切換至calcClient.exe所在目錄,執行:calcClient localhost:8080 7 7請求Server端

小結:

如今仍是soap與c++的初學者,不少還不瞭解,走通這個程序,謹記一下。主要難點以下:

1)建立Server與Client端時,不知該添加哪些文件(應該先查文獻,看看生成的文件都起什麼做用)。

2)添加WSock32.lib時,不知如何添加(查詢如何在vs項目中添加lib)。

3)生成項目時,出現連接錯誤(網上說修改清單工具的方法好像不太好,之後要好好看一下)。

4)對於gsoap的配置信息不瞭解,須要好好補補。

疑點:

1)在calc.h中配置的//gsoap ns service port: http://localhost:8080是否有用,怎麼在啓動Server端時,須要綁定端口號?

2)生成的wsdl文件和ns文件是否有用,在Server與Client項目中並無使用這兩個文件。

參考文章:

1)onvif學習2-soap介紹以及gsoap使用

2)gSOAP Calculator Service and Client

3)The gSOAP Toolkit for SOAP and REST Web Services and XML-Based Applications

相關文章
相關標籤/搜索