1. 程式人生 > >Linux 下使用gsoap開發C web service

Linux 下使用gsoap開發C web service

由於工作需要,最近研究了一下使用 gsoap 開發 web service.  以下為個人理解,想和大家一起分享分享,大牛勿噴。

首先來看看什麼是web service , 從名字表面意思上理解即為一種 web 的服務, 服務就是給別人幹活的,具體乾的什麼活,那就是你來負責寫咯。 也可以理解成是RPC(遠端過程呼叫)。web service 各種平臺各種語言只要遵守它的規定 都可以呼叫使用,增強通用性。好吧廢話不多說了,下面我們先看如果在Linux上安裝 gsoap.

-------------------------

我使用的是VM 9.0 上安裝的 Ubuntu 3.2.0  gsoap為 gsoap_2.8.17 http://jaist.dl.sourceforge.net/project/gsoap2/gSOAP/gsoap_2.8.17.zip 為下載地址。

安裝方法:

用unzip gsoap-2.8.1.zip命令解壓縮,會解壓生成gsoap-2.8資料夾。

cd gsoap-2.8

在安裝之前需要先安裝一些編譯工具。

安裝編譯工具:

  $sudo apt-get install build-essential

  為了成功編譯gSOAP,您需要安裝GTK+的開發檔案和GLib庫(libraries)。

  $sudo apt-get install libgtk2.0-dev libglib2.0-dev

  安裝Checkinstall以便管理您系統中直接由原始碼編譯安裝的軟體。

  $sudo apt-get install checkinstall

       安裝YACC,YACC是Unix/Linux上一個用來生成編譯器的編譯器(編譯器程式碼生成器)。

       $sudo apt-get install flex bison

       安裝OpenSSL

       $sudo apt-get install openssl
       安裝OpenSSL通常的庫檔案,首先使用以下命令來確定在Ubuntu系統中可獲得的庫檔案的應用版本:
       $sudo apt-cache search libssl | grep SSL 
       $sudo apt-get install libssl-dev

簡單安裝:(安裝到/usr/local/gSOAP目錄下)

        configure --prefix=/usr/local/gSOAP

        make

        make install

安裝完成。

為了後面的C和C++版本的服務和客戶端的開發能夠脫離原始碼目錄,最好還要如下處理:

(1)將原始碼目錄下gsoap子目錄中的import目錄拷貝到gSOAP目錄下來;

(2)gSOAP目錄下建一個env目錄,將gsoap/samples/link下的所有檔案拷貝過來,並且生成envC.o(C版本要用到),方法是:

/usr/local/gSOAP/bin/soapcpp2 -penv -c env.h

g++ -c -I /usr/local/gSOAP/include envC.c

(3)gSOAP目錄下建一個src目錄,將將原始碼目錄下gsoap子目錄中的stdsoap*.*拷貝過來。

安裝完成

檢視原文地址:http://blog.csdn.net/bingqingsuimeng/article/details/10065401 

已經上面的步驟基本已經安裝好了如果還有問題請多baidu。

輸入命令 soapcpp2 測試是否安裝正確, 如果安裝正確下面就進入web service 的開發了,我實現了一個簡單的web service 只有一個add的功能。

首先實現server端:

1.先寫標頭檔案

//gsoap ns service name: SmsWBS
//gsoap ns service style: rpc
//gsoap ns service namespace: http://192.168.2.161:8000/SmsWBS.wsdl
//gsoap ns service location: http://192.168.2.161:8000
//gsoap ns service encoding: encoded
//gsoap ns schema namespace: urn:SmsWBS

int ns__add(int num1, int num2, int *sum);

注意了不要註釋的程式碼是有用的不要刪除, IP地址改成你自己機器上的IP地址

2.服務端程式SmsWBSserver.c:

#include "soapH.h"
#include "SmsWBS.nsmap"

int main(int argc, char **argv)
{
        int m, s;               /* master and slave sockets */
        struct soap SmsWBS_soap;

        soap_init(&SmsWBS_soap);

        soap_set_namespaces(&SmsWBS_soap, namespaces);

        if (argc < 2)
        {
                printf("usage: %s <server_port> \n", argv[0]);
                exit(1);
        }
        else
        {
                m = soap_bind(&SmsWBS_soap, NULL, atoi(argv[1]), 100);
                if (m < 0)
                {
                        soap_print_fault(&SmsWBS_soap, stderr);
                        exit(-1);
                }

                fprintf(stderr, "Socket connection successful: master socket = %d\n", m);

                for (;;)
                {
                        s = soap_accept(&SmsWBS_soap);

                        if (s < 0)
                        {
                                soap_print_fault(&SmsWBS_soap, stderr);
                                exit(-1);
                        }

                        fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);
                        soap_serve(&SmsWBS_soap);
                        soap_end(&SmsWBS_soap);
                }

       }

        return 0;
}

int ns__add(struct soap *add_soap, int num1, int num2, int *sum)
{
        *sum = num1 + num2;
        return 0;
}

3.客戶端程式SmsWBStest.c:

#include <stdio.h>
#include <stdlib.h>
#include "soapStub.h"
#include "SmsWBS.nsmap"

int add(const char *server, int num1, int num2, int *sum);

int add(const char *server, int num1, int num2, int *sum)
{
        struct soap SmsWBS_soap;
        int result = 0;

        soap_init(&SmsWBS_soap);
        soap_set_namespaces(&SmsWBS_soap, namespaces);

        soap_call_ns__add(&SmsWBS_soap, server, "", num1, num2, sum);

        if(SmsWBS_soap.error)
        {
                printf("soap error:%d, %s, %s ", SmsWBS_soap.error, *soap_faultcode(&SmsWBS_soap), *soap_faultstring(&SmsWBS_soap));
                result = SmsWBS_soap.error;
         }

        soap_end(&SmsWBS_soap);
        soap_done(&SmsWBS_soap);

        return result;
}

int main(int argc, char **argv)
{
        int result = -1;
        char* server="http://localhost:8000";

        int num1 = 0;
        int num2 = 0;
        int sum = 0;

        if( argc < 3 )
        {
                printf("usage: %s num1 num2 \n", argv[0]);
                exit(0);

        }

        num1 = atoi(argv[1]);
        num2 = atoi(argv[2]);

        result = add(server, num1, num2, &sum);
        if (result != 0)
        {
                printf("soap err, errcode = %d \n", result);
        }
        else
        {
                printf("%d + %d = %d \n", num1, num2, sum);
        }

        return 0;
}

4.Makefile檔案:

比較關鍵,如果標頭檔案中的 // 部分有修改,要檢查是否要修改Makefile檔案

GSOAP_ROOT=/usr/local/gSOAP
WSNAME0=soap
WSNAME=SmsWBS
CC=g++ -g -DWITH_NONAMESPACES
INCLUDE=-I $(GSOAP_ROOT)/include
SERVER_OBJS=$(WSNAME0)C.o $(WSNAME0)Server.o stdsoap2.o
CLIENT_OBJS=$(GSOAP_ROOT)/env/envC.o $(WSNAME0)ClientLib.o stdsoap2.o
ALL_OBJS=${WSNAME}server.o $(WSNAME0)C.o $(WSNAME0)Server.o ${WSNAME}test.o $(WSNAME0)ClientLib.o
#GSOAP_SRC=/usr/local/gsoap-2.7/gsoap

all:server

${WSNAME}.wsdl:${WSNAME}.h
        $(GSOAP_ROOT)/bin/soapcpp2 -c $(GSOAP_ROOT)/import ${WSNAME}.h

stdsoap2.o:$(GSOAP_ROOT)/src/stdsoap2.c
        $(CC) -c $? $(INCLUDE)

$(ALL_OBJS):%.o:%.c
        $(CC) -c $? $(INCLUDE)

server:Makefile ${WSNAME}.wsdl ${WSNAME}server.o $(SERVER_OBJS)
        $(CC) ${WSNAME}server.o $(SERVER_OBJS) -o ${WSNAME}server

client:Makefile ${WSNAME}.wsdl ${WSNAME}test.c $(ALL_OBJS) stdsoap2.o
        $(CC) ${WSNAME}test.o $(CLIENT_OBJS) -o ${WSNAME}test

clean:
        rm -f *.o *.xml *.a *.wsdl *.nsmap $(WSNAME0)H.h $(WSNAME0)C.c $(WSNAME0)Server.c $(WSNAME0)Client.c $(WSNAME0)Stub.* $(WSNAME)$(WSNAME)Proxy.* $(WSNAME)$(WSNAME)Object.* $(WSNAME0)ServerLib.c $(WSNAME0)ClientLib.c $(WSNAME)server ns.xsd $(WSNAME)test

5.編譯和執行:

前面都已經準備好了,現在只需要:

make                                     ---得到服務端程式SmsWBSserver

make client                            ---得到客戶端程式SmsWBStest

SmsWBSserver 8000      ----執行服務端程式

出來類似下面的顯示就表示執行正常

Socket connection successful: master socket = 3

再執行客戶端程式:

SmsWBStest 67 78

顯示:

67 + 78 = 145

呼叫Web Service成功