【问题标题】:Deserializing serialized objects with gsoap in order to validate web service output使用 gsoap 反序列化序列化对象以验证 Web 服务输出
【发布时间】:2018-02-13 21:20:33
【问题描述】:

开箱即用,gsoap 不提供任何输出验证方式(确保发送到客户端的对象序列化的架构有效性)。我们过去已经遇到过一些验证问题,所以至少我想通过单元测试来验证我们的 Web 服务输出。

这个想法很简单。使用 gsoap 映射的 C++ 类型组合任意对象树并将其传递给通用函数

template<typename T> validate(const T& xmlObject);

然后validate 调用T::soap_put() 对其进行序列化并将生成的字符串传递给T::soap_get() 再次反序列化它,使用新生成的以SOAP_XML_STRICT 标志初始化的soap 上下文。

但实际上,在反序列化时,gsoap 似乎无法识别它在序列化时生成的命名空间前缀,从而导致"Tags '%s' and '%s' match but namespaces differ 形式的错误消息。我逐步浏览了 stdsoap2.cpp 中的验证代码,这表明失败的方法 soap_match_namespace() 与肥皂上下文属性 soap-&gt;local_namespaces 匹配,对于我新构建的反序列化肥皂上下文,该属性为空。

我现在不知道如何继续。这是预期的行为吗?无论如何应该如何使用T::soap_put()T::soap_get() 方法?是否有替代方法来验证输出?

【问题讨论】:

  • 你能提供一个 MCVE 吗?实际的 XML 内容是什么样的?也许您的测试发现序列化输出存在真正的问题?
  • 对我来说,我测试过的示例似乎不太可能存在真正的问题。手头的设置不适合,而且对于 MCVE 来说过于臃肿,我必须补上一个,但这个想法应该很清楚。无论如何,我不想让你调试我的代码,而且我对为什么我的特定设置不起作用比对这些一般性问题不太感兴趣:首选的方法是什么?我的方法有问题吗? gsoaps 验证代码实际上是如何工作的?知道答案将帮助我自己找出具体案例的解决方案。
  • 如果命名空间不匹配,请检查您的 .nsmap 表并确保您为接收方和发送方使用相同的 Namespace[] 表(在 .nsmap 中)(因为您使用的是相同的XML 库)。没有其他方法可以失败,但是当 Namespace[] 绑定以某种方式不同时。既然整个设置都是基于数据绑定的,为什么还要麻烦输出验证呢?唯一需要确定的是长度约束(例如向量),但 wsdl2h 生成的 .h 文件会告诉您这些约束是什么。

标签: c++ gsoap


【解决方案1】:

使用传入的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);

    ...
}

【讨论】:

    猜你喜欢
    • 2011-12-21
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    相关资源
    最近更新 更多