win7 gsoap与vs2010 c++创建Web Service

---恢复内容开始---

之前曾经编写过简单的样例,很久没有碰过,发现已经全部忘记,如今又需要重新巩固一下。

首先是下载gsoap,无法访问官方下载页面,只能在网上搜索,找到一个2.8版本存入云盘以防再次找不到。

下面记录一下,通过gsoap创建web Service的过程。

1.创建一个项目文件夹calc

2.在calc文件夹中,创建一个头文件calc.cpp

// 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程序是为操作方便,之前添加进去的。

注:关于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

时间: 2024-08-09 02:21:14

win7 gsoap与vs2010 c++创建Web Service的相关文章

IDEA创建Web Service服务端和客户端

1.  创建服务端 第一步:File–>New–>Project:我这里使用原生JDK来开发Web Service Server服务,所以不勾选Generate Sample Server Code,意思是不使用Apache Axis,也不生成Apache Axis代码.选中Set up library later表示暂时不设置依赖包. 第二步:输入项目名称 项目结构如下: PublishWebService.java 1 package com.suns.webservice.server;

gsoap 实现 C/C++ 调用web service

gSOAP 是什么? gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多.绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户必须改变程序结构来适应相关的类库.与之相反,gSOAP利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来. 简单来说,  gSOAP 功能之一就是可以帮助我们使用C/C++调用web

利用IDEA创建Web Service服务端和客户端的详细过程

创建服务端 一.file–>new–>project 二.点击next后输入服务端名,点击finish,生成目录如下 三.在 HelloWorld.Java 文件中右击,选 WebServices ,再选 Generate Wsdl From Java Code ,确定 点击ok会自动给我们生成HelloWorld.wsdl,画红线处注意 四.配置tomcat,此处不多说,主要是配置好tomcat后还需要加入 Axis 的库 点击右下角fix即可,重新启动 tomcat ,在浏览器中输入:ht

使用Axis2创建Web Service

参考地址:http://jingyan.baidu.com/article/ce09321b5546662bff858f21.html 1 下载axis2插件 从官网中下载插件axis2-eclipse-codegen-plugin-1.6.2.zip和axis2-eclipse-service-plugin-1.6.2.zip,解压缩,得到org.apache.axis2.eclipse.codegen.plugin_1.6.2.jar和org.apache.axis2.eclipse.ser

VS2010 C# 调用Web Service .

转自:http://blog.csdn.net/fenglailea/article/details/7262566 打开VS2010,打开"文件-新建-网站",选择"ASP.NET网站". 选好存储位置,进入默认页面.然后先添加Web引用,把WebService引到当前的工程里面. 方法是:在资源管理器中点击右键,选择[添加服务引用],点击 [高级],[添加WEB引用],调出对话框: > [WEB引用名] 根据需要可以自己改,最后点击 [添加引用] 下面我们

使用jdk 创建web service

1)服务器端开发        说明:jdk为1.7版本            i.创建项目                项目名称:webs1            ii.创建SEI(终端)                a.包名:cn.jbit.webs1.sei                b.接口设计                    接口名:HelloSEI.java                    接口内容:                    @WebService 

在 Visual Studio 2010 中创建 ASP.Net Web Service

第一步:创建一个“ASP.Net Empty Web Application”项目 第二步:在项目中添加“Web Service”新项目 第一步之后,Visual Studio 2010会创建一个仅含一个站点配制文件(Web.config)的空站点,其余的什么也没有. 我们在Visual Studio 2010的Solution Explorer中,选中当前的这个project,添加新项目(右键菜单:Add --> New Item),选择“Web Service”这种类型: 看到这里读者应该就

转载——Step by Step 创建一个 Web Service

原创地址:http://www.cnblogs.com/jfzhu/p/4022139.html 转载请注明出处 (一)创建Web Service 创建第一个项目,类型选择ASP.NET Empty Web Application 添加一个新项目 Web Service 然后再创建一个类Contact 代码分别如下. Contact.cs: [Serializable] public class Contact { private string name; public string Name

怎样创建.NET Web Service http://blog.csdn.net/xiaoxiaohai123/article/details/1546941

为什么需要Web Service 在通过internet网购买商品后,你可能对配送方式感到迷惑不解.经常的情况是因配送问题找配送公司而消耗你的大量时间,对于配送公司而言这也不是一项增值服务. 为了解决这种问题,配送公司需要在不降低安全级别的情况下了解更多的递送信息,然而安全公司设计的安全系统却非常复杂.那么我们能不能只使用80端口(web服务器端口)并且只通过web服务器提供信息呢?所以,我们建立了一个全新的web应用程序以便从核心商业应用程序中获得数据.配送公司将为些东西付money,所有的公