欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Gsoap:解决soap标准不一致问题(soap:Envelope和SOAP-ENV:Envelope)

程序员文章站 2022-03-08 10:19:32
...

Gsoap本来很好使用,项目组是和甲方合作,甲方定义的Soap通信格式不能更改,但是和Gsoap生成的格式无法兼容,那么问题来了,如何解决?且看下文填坑之路。

下面2份很简洁的Soap通信格式,上面是甲方的,下面是Gsoap生成的;

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soap:Body>
        <ns1:facecheck xmlns:ns1="http://webservice.serv.nciic.com">
            <ns1:in0>
            </ns1:in0>
        </ns1:facecheck> 
    </soap:Body>
</soap:Envelope>
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
  xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:ns1="http://webservice.serv.nciic.com">
 <SOAP-ENV:Body>
  <ns1:facecheck>
   <in0>
   </in0>
  </ns1:facecheck>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

 第一个坑:甲方的参数前面带命名空间“ns1”;而Gsoap生成的不带,Google了很久没找到解决办法,最后Baidu给出了正确方法,而且博主不是针对这个问题写的,只是在阐述Gsoap的使用,博主刚好给出了我想要的协议格式,我刚好看到了;只要在定义“.h”文件时多加2行“//gsoap ns1 schema elementForm: qualified;//gsoap ns1 schema attributeForm:qualified”;再用soapcpp2生成时就可以在参数上也加上命名空间“ns1”;示例如下:

//gsoap ns1 service name: facecheck
//gsoap ns1 service namespace: http://webservice.serv.nciic.com
//gsoap ns1 service location: http://127.0.0.1:18082/facecheck
//gsoap ns1 service protocol: SOAP
//gsoap ns1 service encoding: encoded
//gsoap ns1 schema elementForm: qualified
//gsoap ns1 schema attributeForm:qualified
#include<string>
int ns1__facecheck(std::string in0, std::string& out);

 

第二个坑:甲方用的微软标准是soap:Envelope和soap:Body;而Gsoap生成的是IBM的标准,用的是SOAP-ENV:Envelope和SOAP-ENV:Body;这次Google和Baidu都没能帮我,*有人提出一样的问题,但是没人回答。自己尝试了各种办法,一直没解决,最后解决办法听起来高大上:修改Gsoap生成的源码;方法暴力而简单:全局替换,把Gsoap生成的所有文件,以及stdsoap2.cpp和stdsoap2.h在内的所有文件里包含的的SOAP-ENV全部替换为soap;至此,问题圆满解决。

相关标签: gsoap