开箱即用,gsoap不提供任何输出验证方法(确保发送到客户端的对象序列化的架构有效性)。我们过去已经遇到过一些验证问题,所以至少我想通过单元测试验证我们的Web服务输出。
这个想法非常简单。使用gsoap映射的C ++类型将任意对象树放在一起,并将其传递给通用函数
template<typename T> validate(const T& xmlObject);
然后validate
调用T::soap_put()
来序列化它,并使用使用T::soap_get()
标志初始化的新生成的soap上下文将结果字符串传递给SOAP_XML_STRICT
再次反序列化。 / p>
但实际上,在反序列化时,gsoap似乎无法识别它在序列化时生成的名称空间前缀,从而导致形式为"Tags '%s' and '%s' match but namespaces differ
的错误消息。我稍微介绍了stdsoap2.cpp中的验证代码,该代码显示失败的方法soap_match_namespace()
与soap上下文属性soap->local_namespaces
匹配,对于我新构建的反序列化soap上下文,该属性为空。
我不知道如何继续这一点。这是预期的行为吗?无论如何都应该使用T::soap_put()
和T::soap_get()
方法?是否有另一种输出验证方法?
答案 0 :(得分:0)
使用传入的soap对象为您的本地soap上下文设置名称空间。
template<typename T> validate(struct soap *soap, const T& xmlObject)
{
struct soap ValidateSoap;
soap_init(&ValidateSoap);
soap_set_omode(&ValidateSoap, SOAP_C_UTFSTRING|SOAP_XML_STRICT);
soap_set_imode(&ValidateSoap, SOAP_C_UTFSTRING|SOAP_XML_STRICT);
soap_set_namespaces(&ValidateSoap, soap->namespaces);
...
}