gSoap 创建Web Service
2014-03-02 19:32
302 查看
1.新建控制台程序CalculatorService,并新建头文件Calculator.h
typedef double xsd__double;
int ns__add(xsd__double a, xsd__double b, xsd__double &result);
int ns__sub(xsd__double a, xsd__double b, xsd__double &result);
int ns__sqrt(xsd__double a, xsd__double &result);
2.运行soapcpp2.exe生成相关文件
3.配置CalculatorService工程:加入wsock32.lib库
4. CalculatorService主程序代码
int main()
{
structsoap soap;
int m, s;
soap_init(&soap);
m = soap_bind(&soap, NULL, 18888,100);
if (m< 0)
soap_print_fault(&soap,stderr);
else
{
fprintf(stderr, "Socket connection successful: master socket =%d\n", m);
for(int i = 1; ; i++)
{
s = soap_accept(&soap);
if(s < 0)
{
soap_print_fault(&soap,stderr);
break;
}
fprintf(stderr,
"%d: accepted connection from IP=%d.%d.%d.%dsocket=%d", i,
(soap.ip >>24)&0xFF, (soap.ip >> 16)&0xFF, (soap.ip >> 8)&0xFF,soap.ip&0xFF, s);
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);
return 0;
}
//实现相应的函数声明
int ns__add(struct soap *soap,
doublea, double b,
double&result)
{
result = a + b;
returnSOAP_OK;
}
int ns__sub(struct soap *soap,
doublea, double b,
double&result)
{
result = a - b;
returnSOAP_OK;
}
int ns__sqrt(struct soap *soap,
doublea, double &result)
{
if (a>= 0)
{
result = sqrt(a);
returnSOAP_OK;
}
else
returnsoap_receiver_fault(soap,
"Square root ofnegative number",
"I can only takethe square root of a non-negative number");
}
5.启动Service
在浏览器地址栏输入
http://localhost:18888/
显示的XML为
需要设置soap.fget:
soap_init(&soap);
soap.fget = http_get;
m = soap_bind(&soap, NULL, 18888,100);
int http_get(struct soap *soap)
{
FILE*fd = NULL;
fd = fopen("ns.wsdl","rb");
if (!fd)
{
return404;
}
soap->http_content = "text/xml";
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;
}
}
fclose(fd);
soap_end_send(soap);
returnSOAP_OK;
}
,这时再刷新http://localhost:18888/,正确获得XML
6.创建客户端:CalculatorClient并吧soapcpp2.exe生成的文件拷到目录下。
客户端主程序代码
int add(
const char* server,
double num1, doublenum2,
double &sum )
{
structsoap add_soap;
intresult = 0;
soap_init(&add_soap);
soap_call_ns__add( &add_soap, server,"", num1, num2, sum );
if(add_soap.error)
{
printf("soaperror:%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);
returnresult;
}
int sub(const
char* server, double num1,
doublenum2, double &sum)
{
structsoap add_soap;
intresult = 0;
soap_init(&add_soap);
soap_call_ns__sub( &add_soap, server,"", num1, num2, sum );
if(add_soap.error)
{
printf("soaperror:%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);
returnresult;
}
int Sqrt(const
char* server, double num1,
double&sum)
{
structsoap add_soap;
intresult = 0;
soap_init(&add_soap);
soap_call_ns__sqrt( &add_soap,server,
"", num1,sum );
if(add_soap.error)
{
printf("soaperror:%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);
returnresult;
}
int main()
{
intresult = -1;
char*server="http://localhost:18888";
doublenum1 = 5;
doublenum2 = 6;
doublesum = 0;
result = add(server, num1, num2,sum);
if(result != 0)
{
printf("soaperr,errcode = %d/n", result);
}
else
{
printf("%.2f+ %.2f =%.2f \n", num1, num2, sum );
}
result = sub(server, num1, num2,sum);
if(result != 0)
{
printf("soaperr,errcode = %d/n", result);
}
else
{
printf("%.2f -%.2f =%.2f \n", num1, num2, sum);
}
result = Sqrt(server, num1, sum);
if(result != 0)
{
printf("soaperr,errcode = %d/n", result);
}
else
{
printf("sqrt(%.2f) =%.2f \n", num1, sum );
}
system("pause");
return 0;
}
typedef double xsd__double;
int ns__add(xsd__double a, xsd__double b, xsd__double &result);
int ns__sub(xsd__double a, xsd__double b, xsd__double &result);
int ns__sqrt(xsd__double a, xsd__double &result);
2.运行soapcpp2.exe生成相关文件
3.配置CalculatorService工程:加入wsock32.lib库
4. CalculatorService主程序代码
int main()
{
structsoap soap;
int m, s;
soap_init(&soap);
m = soap_bind(&soap, NULL, 18888,100);
if (m< 0)
soap_print_fault(&soap,stderr);
else
{
fprintf(stderr, "Socket connection successful: master socket =%d\n", m);
for(int i = 1; ; i++)
{
s = soap_accept(&soap);
if(s < 0)
{
soap_print_fault(&soap,stderr);
break;
}
fprintf(stderr,
"%d: accepted connection from IP=%d.%d.%d.%dsocket=%d", i,
(soap.ip >>24)&0xFF, (soap.ip >> 16)&0xFF, (soap.ip >> 8)&0xFF,soap.ip&0xFF, s);
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);
return 0;
}
//实现相应的函数声明
int ns__add(struct soap *soap,
doublea, double b,
double&result)
{
result = a + b;
returnSOAP_OK;
}
int ns__sub(struct soap *soap,
doublea, double b,
double&result)
{
result = a - b;
returnSOAP_OK;
}
int ns__sqrt(struct soap *soap,
doublea, double &result)
{
if (a>= 0)
{
result = sqrt(a);
returnSOAP_OK;
}
else
returnsoap_receiver_fault(soap,
"Square root ofnegative number",
"I can only takethe square root of a non-negative number");
}
5.启动Service
在浏览器地址栏输入
http://localhost:18888/
显示的XML为
需要设置soap.fget:
soap_init(&soap);
soap.fget = http_get;
m = soap_bind(&soap, NULL, 18888,100);
int http_get(struct soap *soap)
{
FILE*fd = NULL;
fd = fopen("ns.wsdl","rb");
if (!fd)
{
return404;
}
soap->http_content = "text/xml";
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;
}
}
fclose(fd);
soap_end_send(soap);
returnSOAP_OK;
}
,这时再刷新http://localhost:18888/,正确获得XML
6.创建客户端:CalculatorClient并吧soapcpp2.exe生成的文件拷到目录下。
客户端主程序代码
int add(
const char* server,
double num1, doublenum2,
double &sum )
{
structsoap add_soap;
intresult = 0;
soap_init(&add_soap);
soap_call_ns__add( &add_soap, server,"", num1, num2, sum );
if(add_soap.error)
{
printf("soaperror:%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);
returnresult;
}
int sub(const
char* server, double num1,
doublenum2, double &sum)
{
structsoap add_soap;
intresult = 0;
soap_init(&add_soap);
soap_call_ns__sub( &add_soap, server,"", num1, num2, sum );
if(add_soap.error)
{
printf("soaperror:%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);
returnresult;
}
int Sqrt(const
char* server, double num1,
double&sum)
{
structsoap add_soap;
intresult = 0;
soap_init(&add_soap);
soap_call_ns__sqrt( &add_soap,server,
"", num1,sum );
if(add_soap.error)
{
printf("soaperror:%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);
returnresult;
}
int main()
{
intresult = -1;
char*server="http://localhost:18888";
doublenum1 = 5;
doublenum2 = 6;
doublesum = 0;
result = add(server, num1, num2,sum);
if(result != 0)
{
printf("soaperr,errcode = %d/n", result);
}
else
{
printf("%.2f+ %.2f =%.2f \n", num1, num2, sum );
}
result = sub(server, num1, num2,sum);
if(result != 0)
{
printf("soaperr,errcode = %d/n", result);
}
else
{
printf("%.2f -%.2f =%.2f \n", num1, num2, sum);
}
result = Sqrt(server, num1, sum);
if(result != 0)
{
printf("soaperr,errcode = %d/n", result);
}
else
{
printf("sqrt(%.2f) =%.2f \n", num1, sum );
}
system("pause");
return 0;
}
相关文章推荐
- 用GDB调试程序 - Ubuntu中文
- 01字串
- OpenCV学习笔记(五) 文件存取
- C#如何运行外部程序(打开可执行程序):ShellExcute和Process
- LESS
- hadoop环境搭建遇到问题集锦
- linux下使用split 来分割大文件
- 每一位Android开发者应该知道的Android体系架构和开发库
- 详谈Javascript中的String对象
- @NotEmpty、@NotBlank、@NotNull
- Socket的重要性
- 客户端程序设计
- 微信模版设计说明书(Written By GuWen)
- CareerCup Find the usernames existing in both documents
- Android AIDL 必看内容
- Dijkstra算法
- Android开发实践:用脚本编译Android工程
- Android开发实践:用脚本编译Android工程
- hdu2874
- 嵌入式学习笔记——字符设备驱动编写