一、 前言
鄙人是一个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调用完全没问题!