gsoap入门--用goap写一个加法的WebService

    毕业设计要用到WebService,但是本人不会java,就想着用c/c++来写WebService。网上查找了相关资料,就知道了gsoap。

    从gsoap的官方网站http://www.cs.fsu.edu/~engelen/soap.html中下载了最新版本,里面会有相关技术文档。

    本人觉得学习一个新的东西最快捷的方式就是马上动手实践了,这样可以大大的加深的理解原理和使用方法。而如果只是停留在文档的学习上,那学习的进度会很慢,因为知识点的不断增加,仅仅靠记忆很难理清楚各个点的作用和相互关系。所以一般就可以通过动手实验,把知识点深化到经验层面,一点点地深入就会变得简单许多。(写些这些仅作为个人学习方法的总结。)

   转入正题,先简单介绍下。

   在bin文件下有两个已经编译好的程序:soapcpp2, wsdl2h。

   官方文档中有两句:   

  • The wsdl2h WSDL/schema importer and data binding mapper tool.
  • The soapcpp2 stub/skeleton compiler and code generator.

   wsdl2h是一个服务导入和数据绑定、转换的工具,soapcpp2则是寸根/框架的编译器和代码生成器。至于什么是寸根,我的理解就是相当于一种上下文运行环境。

   注意这两个程序是可以再进行定制编译的,因为需要一些特殊的服务或功能,可以在开发时自行进行重新配置和编译。

   现在转入例子说明。

   这个例子我写了一个加法的webService。服务器属于单线程程序,直接贴出服务端的代码,文件名为:StandaloneAdd.c:

  #include "soapH.h"
#include "add.nsmap"

int main()
{
    struct soap soap;
    int master, slave;
    soap_init(&soap);
    master = soap_bind(&soap, "127.0.0.1", 18888, 100);
    if(master < 0)
        soap_print_fault(&soap, stderr);
    else
    {
        sprintf(stderr, "Socket connection successful:master socket = %d\n", master);
    
    while(1)
    {
        slave = soap_accept(&soap);
        if(slave < 0)
        {
            soap_print_fault(&soap, stderr);
            break;
        }
        sprintf(stderr, "accepted connection from IP=%d.%d.%d.%d socket=%d",(soap.ip >> 24)&0xFF, (soap.ip >> 16)&0xFF, (soap.ip >> 8)&0xFF, soap.ip&0xFF, slave);
        if(soap_serve(&soap) != SOAP_OK)
            soap_print_fault(&soap, stderr);
        fprintf(stderr, "request served\n");
        soap_destroy(&soap);
        soap_end(&soap);
    }
    }
    soap_done(&soap);
}

int ns__add(struct soap *soap, double a, double b, double *result)
{
    *result = a + b;
    return SOAP_OK;
}

  

接着写StandaloneAdd.h文件:

//gsoap ns service name:    add Simple StandaloneAdd service
//gsoap ns service style:    rpc
//gsoap ns service enconding:    encoded
//gsoap ns service namespace:    http://localhost/StandaloneAdd.wsdl
//gsoap ns service location:    http://localhost:18888

//gsoap ns schema namesapce:    urn:add

int ns__add(double a, double b, double *result);

需要特别注意的是,这里的注释内容是有作用的,soapcpp2需要根据这些注释内容生成相关文件。location指的是服务的地址,我这里是把服务绑定在本机的端口号为18888的端口上。

现在就可以使用本人开始时候介绍的那两个程序中的一个程序了:soapcpp2。

进入到以上两个文件所在的目录下,将soapcpp2、stdsoap2.c和stdsoap2.h文件复制到此目录下,然后运行一下命令行:

1、$./soapcpp2 -c StandaloneAdd.h

-c参数指明这里生成的文件是纯C的格式的文件。

2、$cc -o StandaloneAdd StandaloneAdd.c stdsoap2.c soapC.c soapServer.c

查看当前目录,会发现新生成了很多文件,其中有个可执行文件StandaloneAdd和wsdl服务文件。

到目前为止,服务端的程序就已经完成了,可以运行StandaloneAdd程序来提供服务。还有就是通过wsdl文件来发布服务,不过这种方式为还没有试过。


接下来通过编写服务端程序来测试一下。

客户端测试文件ClientTest.c代码如下:

#include "soapH.h"
#include "add.nsmap"

const char server[] = "http://localhost:18888";

int main(int argc, char **argv)
{
    struct soap soap;
    double a, b, result;
    soap_init1(&soap, SOAP_XML_INDENT);
    a = strtod(argv[2], NULL);
    b = strtod(argv[3], NULL);
    
    soap_call_ns__add(&soap, server, "", a, b, &result);
    if(soap.error)
    {
        soap_print_fault(&soap, stderr);
        exit(1);
    }
    else
        printf("result = %g\n", result);
    soap_destroy(&soap);
    soap_end(&soap);
    soap_done(&soap);
    return 0;
    
}

编辑完后,运行以下命令行:

$cc -o ClientTest ClientTest.c stdsoap2.c soapC.c soapClient.c

这时会在当前目录下生成目标文件ClientTest。这就是可执行文件。

现在一个终端下运行服务器端程序,开启服务:./StandaloneAdd

然后在另一个终端运行客户端测试程序:./ClientTest add 32 23

然后终端会打印出:result = 55

OK, That is over!

此文仅仅作为学习记录笔记,完全按照实验过错和结果撰写,如果大的出入,望多多指出,感谢额。。。

你可能感兴趣的:(gsoap入门--用goap写一个加法的WebService)