我们有一个cgi,我必须从较旧的gsoap版本迁移到gsoap 2.8.14。
不幸的是,答案是不同的。
我加了
// gsoap ns模式格式:不合格
到标头,但这还不足以摆脱所有ns前缀。
其次,可能的主要问题是响应命名。现在,另一个LoginResult在loginResponse中称为结果和数据包。
旧cgi的回应:
<LoginResult>
<successful>true</successful>
<token>example</token>
</LoginResult>
新cgi的回应
<ns:loginResponse>
<result>
<successful>true</successful>
<token>example</token>
</result>
</ns:loginResponse>
我用soapcpp2 -e -S auth.h构建存根
auth.h看起来像这样:
//gsoap ns service name: auth
//gsoap ns service style: rpc
//gsoap ns service encoding: encoded
//gsoap ns service port: http://domain.xy/cgi-bin/auth.cgi
//gsoap ns service namespace: urn:auth
//gsoap ns schema form: unqualified
typedef std::string xsd__string;
// array of strings containing all tags allowed for a specific user
class TagsArray
{
public:
xsd__string *__ptr;
int __size;
TagsArray();
};
// getTags.... result struct
class TagsResult
{
public:
bool successful;
xsd__string errorMessage;
TagsArray tags;
TagsResult();
};
// login result struct
class LoginResult
{
public:
bool successful;
xsd__string token; // also used as error message if successful == false
LoginResult();
};
// verify result struct
class VerifyResult
{
public:
bool successful;
xsd__string newToken; // also used as error message if successful == false
VerifyResult();
};
// contains a valid auth method for a specific realm
class ns__AuthMethod
{
public:
int id;
xsd__string description;
};
// array of all allowed authmethods for a specific realm
class AuthMethodArray
{
public:
ns__AuthMethod *__ptr;
int __size;
};
// a login parameter, usually username, pin, token
class ns__LoginParameter
{
xsd__string param;
xsd__string value;
};
// array of all submitted login parameters, depending on the authmethod that is used
class LoginParameterArray
{
public:
ns__LoginParameter *__ptr;
int __size;
};
// retrieve all possible authmethods for a specific realm
int ns__getAuthMethods(xsd__string realm, xsd__string user, AuthMethodArray &result);
// login and retrieve a valid token if succeeded
int ns__login(xsd__string realm, int authmethod, LoginParameterArray params, LoginResult &result);
// verify a existing token
int ns__verifyToken(xsd__string realm, xsd__string token, VerifyResult &result);
任何的想法?谢谢。
----------------- 2013年4月5日---------------
谢谢戴夫!
所做的更改:
ns__前缀,由Dave建议
删除了构造函数
将布尔默认值设置为false
//登录结果结构
ns_LoginResult类
{
上市:
布尔成功=假;
xsd_string令牌; //如果成功== false,也用作错误消息
};
结果现在看起来像这样:
<ns:LoginResult>
<successful>true</successful>
<token>example</token>
</ns:LoginResult>
int ns__login(xsd__string realm, int authmethod, LoginParameterArray params, ns__LoginResult &result);
ns:前缀已由所有客户端(php,.net,c ++(qt))正确处理。
最佳答案
您需要按如下所示更改auth.h中的LoginResult:
// login result struct
class ns__LoginResult
{
public:
bool successful;
xsd__string token; // also used as error message if successful == false
LoginResult();
};
还要更改ns_login()方法,如下所示:
int ns__login(xsd__string realm, int authmethod, LoginParameterArray params, ns__LoginResult &result);
产生的响应将如下所示:
<ns:LoginResult>
<successful>false</successful>
<token></token>
</ns:LoginResult>
希望LoginResult进入“ ns”名称空间不会对您造成太大的问题。