使用gsoap反序列化序列化对象以验证Web服务输出

时间:2018-02-13 21:20:34

标签: c++ gsoap

开箱即用,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()方法?是否有另一种输出验证方法?

1 个答案:

答案 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);

    ...
}