手把手教你c++发布webService服务

一、 前言

 鄙人是一个javaer,因为需要写一个c++生成webService的服务来提供给java进行调用,参考了网上的一些资料。但是效果都是不尽人意,有的甚至是服务已经生成,但是输入服务调用地址后发现,wsdl提示为HTTP GET method not implemented。其他的语言根本就调用不了,比如网上的一篇写的加减乘除的服务示例,输入wsdl地址java根本不能调用

查阅了各种资料和自己不断试验后终于找到了完善调用的方法,本教程分为c++生成合格的webService服务


二、需要准备的东西

gsoap软件,我下载的是最新gsoap软件

vs2010软件


三、代码示例开发

1.编写c++头文件,gsoap需要根据这个头文件生成相关的数据,注意的坑:所有的返回值为int,这里不要自作聪明写成其他的返回值,函数的返回值是这个res的值,这里我设置的是返回的是字符串

//前面必须要加这个  ns__ 不然生成的服务没有wsdl文件方法
//res为方法的返回值
int ns__testCalled(char* key,char* param,char** res);

2.将这个头文件复制到gsoap的安装包目录win64下面,当然也有一个win32的,看需求。

3.shift+鼠标右键---》打开powershell,也就是在这个目录运行cmd,运行这段指令,这里可能对gsoap的指令不熟悉,但是没关系,照着我的做就行了。

.\soapcpp2.exe -i .\test.h


毫无疑问:肯定是能生成文件的,生成的文件数量如下:

4.开发测试代码,也就是main函数的编写,这里是最重要的,有几个坑要说一下

导入的文件:只要导入这些文件就够了,不要导入多的。

千万注意:这个ns.wsdl文件一定要导入,而且拖到最后面设置wsdl文件的端口!这里我设置为9999

网上面就没有这一点,导致根据发布的路径查看的wsdl文件输出都是HTTP GET method not implemented!这样的wsdl文件别人怎么能够调用呢?

修改ns.wsdl文件的端口信息,这样当运行软件的时候:打开localhost:9999/Service?wsdl路径就能在浏览器看到我们需要展示给外部调用的wsdl文件了。

编写Test.cpp,新建一个才c++类,设置不使用预编译头

#define _CRT_SECURE_NO_WARNINGS   **//一定要添加上**
#include "ns.nsmap" 
#include"soapService.h"
#include "iostream"
 
using namespace std;
 
//很重要
int   http_get(struct   soap   *soap)
{
    FILE*fd = NULL;
    fd = fopen("ns.wsdl", "rb"); //open WSDL file to copy
 
    if (!fd)
    {
        return 404; //return HTTP not found error
    }
    soap->http_content = "text/xml";  //HTTP header with text /xml content
    soap_response(soap, SOAP_FILE);
    for (;;)
    {
        size_t r = fread(soap->tmpbuf, 1, sizeof(soap->tmpbuf), fd);
        if (!r)
        {
            break;
        }
        if (soap_send_raw(soap, soap->tmpbuf, r))
        {
            break; //cannot send, but little we can do about that
        }
    }
    fclose(fd);
    soap_end_send(soap);
    return SOAP_OK;
}
 
 
int main(int argc, char *argv[])
{
    Service call;
    call.fget = http_get;
    while (1)
    {
        //wsdl文件中设置的端口号
        if (call.run(9999))
        {
            call.soap_stream_fault(std::cerr);
        }
    }
    return 0;
}
//自动生成了calcService类,自己重写testCalled函数
/*testCalled的具体实现*/
int Service::testCalled(char* key,char* param,char** res)
{
	wcout<<"key:"<<key<<" + param:"<<param<<endl;
    if (NULL == res)
    {
        printf("Error:The third argument should not be NULL!\n");
        return SOAP_ERR;
    }
    else
    {
		char *b="hello this is cpp called";
		wcout<<"have been called"<<endl;
        *res = b;
        return SOAP_OK;
    }
    return SOAP_OK;
}

5.运行

ctrl+F5,运行成功后,在浏览器输入localhost:9999/Service?wsdl即可得到完整的wsdl文件,这是完整的,目前我使用java调用完全没问题!

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,我可以为您提供一个简单的发布WebService服务的步骤: 1. 编写WebService接口和实现类 首先,您需要编写一个WebService接口和实现类。接口中定义了WebService的方法,而实现类中实现了这些方法的具体逻辑。例如: ```java @WebService public interface HelloWorldService { @WebMethod String sayHello(String name); } @WebService(endpointInterface = "com.example.HelloWorldService") public class HelloWorldServiceImpl implements HelloWorldService { @Override public String sayHello(String name) { return "Hello, " + name + "!"; } } ``` 2. 配置CXF 接下来,您需要配置CXF来发布WebService服务。可以使用Spring配置文件或者Java代码进行配置。以Spring配置文件为例,可以像下面这样配置: ```xml <jaxws:endpoint id="helloWorldService" implementor="com.example.HelloWorldServiceImpl" address="/helloWorld"> </jaxws:endpoint> ``` 这里,`implementor`属性指定了实现类的类名,而`address`属性指定了服务的访问地址。 3. 部署并启动WebService服务 最后,将编写好的接口、实现类和CXF配置文件打包成WAR包并部署到Web容器中。启动Web容器后,WebService服务就会自动发布并可以被访问了。 例如,如果您使用Tomcat作为Web容器,可以将WAR包放置在Tomcat的`webapps`目录下,然后启动Tomcat即可。 至此,您就完成了发布WebService服务的所有步骤。可以使用SOAP UI等工具测试WebService服务的访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值