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

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都没能帮我,stackoverflow有人提出一样的问题,但是没人回答。自己尝试了各种办法,一直没解决,最后解决办法听起来高大上:修改Gsoap生成的源码;方法暴力而简单:全局替换,把Gsoap生成的所有文件,以及stdsoap2.cpp和stdsoap2.h在内的所有文件里包含的的SOAP-ENV全部替换为soap;至此,问题圆满解决。

猜你喜欢

转载自blog.csdn.net/taozhiweigis/article/details/81668476