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

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

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


    
        
            
            
         
    


 
  
   
   
  
 

 第一个坑:甲方的参数前面带命名空间“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
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;至此,问题圆满解决。

你可能感兴趣的:(运维)