基于gsoap开发WebService服务返回结构体数组

基于gsoap开发WebService服务返回结构体数组


gsoap搭建和快速WebService示例编写,前面文章已经介绍过,此文直接讲关键点。
(1)返回的目标结构,开头以ns__,这与第一行//gsoap ns XXX 相关,例如
struct ns__EmployeeInfo
{
    int userid;
    char* name;
};

(2)gsoap对外提供的方法中,函数返回值并不是用来返回业务数据,函数最后一个参数作为输出参数用来返回业务数据,那么返回单个结构写法:
struct ArrayOfEmp2
{struct ns__EmployeeInfo info;};
接口函数:int ns__getEmp2(void *_,struct ArrayOfEmp2 &ccc);
这个写法你会发现,C#客户端更新wsdl结构后的返回值是ArrayOfEmp2,其内部有一个info属性则为返回的结构体内容。
下面是“处女座”的写法:
struct ns__ArrayOfEmp2
{struct ns__EmployeeInfo info;};

接口函数:int ns__getEmp2(void *_,struct ns__ArrayOfEmp2 &ccc);
好处就是,在客户端返回值直接就是EmployeeInfo结构。

(3)重点来了,返回结构体数组的写法:
struct ArrayOfEmp1  //此为正确写法
{struct ns__EmployeeInfo **__ptr;int __size;};
接口函数:int ns__getAllEmp1(void *_,struct ArrayOfEmp1 &alal);
几个注意点:父级结构名字不要带ns__;返回的目标结构成员的名字必须是__ptr,大小的名字必须是__size。

(4)接口实现代码
int ns__getAllEmp1(struct soap* soap,void *_,struct ArrayOfEmp1 &_return)
{
    _return.__size = 5;
    _return.__ptr = (struct ns__EmployeeInfo**)soap_malloc(soap,5*sizeof(struct ns__EmployeeInfo));
    _return.__ptr[0] = (struct ns__EmployeeInfo*)soap_malloc(soap,sizeof(struct ns__EmployeeInfo));
    _return.__ptr[0]->userid=1000;
    _return.__ptr[0]->name= soap_strdup(soap,"name1");

    _return.__ptr[1] = (struct ns__EmployeeInfo*)soap_malloc(soap,sizeof(struct ns__EmployeeInfo));
    _return.__ptr[1]->userid=1001;
    _return.__ptr[1]->name= soap_strdup(soap,"name2");

    _return.__ptr[2] = (struct ns__EmployeeInfo*)soap_malloc(soap,sizeof(struct ns__EmployeeInfo));
    _return.__ptr[2]->userid=1002;
    //_return.__ptr[2]->name = soap_strdup(soap,"name3");
    _return.__ptr[2]->name = (char*)"name3";//这种形式的复制,也是没关系的

    _return.__ptr[3] = (struct ns__EmployeeInfo*)soap_malloc(soap,sizeof(struct ns__EmployeeInfo));
    _return.__ptr[3]->userid = 1003;
    _return.__ptr[3]->name = (char*)"name4";

    _return.__ptr[4] = (struct ns__EmployeeInfo*)soap_malloc(soap,sizeof(struct ns__EmployeeInfo));
    _return.__ptr[4]->userid = t.id;
    _return.__ptr[4]->name = soap_strdup(soap,t.name.c_str());
    return SOAP_OK;
}

几个作死行为:
1、返回结构数组的父级结构体,写法上带ns__,如:
struct ns__ArrayOfEmp //此写法会导致返回的结构是ArrayOfEmp,且其Item属性为NULL
{struct ns__EmployeeInfo **__ptr;int __size;};

2、实现接口函数中,__size字段赋值与实际数组长度不符,将导致服务器crash。


====以下无内容====




评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值