GSOAP:添加FAULT的处理

179 篇文章 2 订阅
120 篇文章 0 订阅
GSOAP:添加FAULT的处理
2009-09-30 16:30

不知道是WSDL描述还是GSOAP自身的问题,有其生成的代码中在不支持Header的情况下,一样不支持对FAULT处理,于是,照着处理Header的过程,添加了对FAULT的处理。
     为处理FAULT,需要事先知道SOAP报文中将FAULT信息放在哪里,当然了,一般自定义扩充都放在DETAIL里面。只是开始不太确定,于是还特意发了个错误报文给对端,收到如下回复,从而确认猜测是对的,这样就可以修改了。

<? xml version='1.0' encoding='utf-8' ?> < soapenv:Envelope xmlns:soapenv ="http://schemas.xmlsoap.org/soap/envelope/" >< soapenv:Header />< soapenv:Body >< soapenv:Fault >< faultcode > soapenv:Client </ faultcode >< faultstring > Authentication Failed AccessCfgHelper.getProductInfor(productId) is empty or is null.. </ faultstring >< detail >< ns2:ServiceException xmlns:ns2 ="http://www.chinatelecom.com.cn/schema/ctcc/common/v2_1" >< messageId > SVC0901 </ messageId >< text > CP/SP authenticate access failed:Authentication Failed AccessCfgHelper.getProductInfor(productId) is empty or is null.. </ text ></ ns2:ServiceException ></ detail ></ soapenv:Fault ></ soapenv:Body ></ soapenv:Envelope >



    首先在Detail结构里面添加所需要的Fault类型:

#ifndef SOAP_TYPE_SOAP_ENV__Detail
#define SOAP_TYPE_SOAP_ENV__Detail (90)

/* SOAP-ENV:Detail */
struct SOAP_ENV__Detail
{
public
:
    
//
int __type;     /* any type of element <fault> (defined below) */
    
//
void *fault;     /* transient */
    
// char *__any;


     sms2__ServiceException
* serviceException;
     sms2__PolicyException
*
policyException;
};
#endif


    然后就是一样修改Detail的in和out函数了:

SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Detail( struct soap * soap, const char * tag, int id, const struct SOAP_ENV__Detail * a, const char * type)
{
    
if
(soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, a, SOAP_TYPE_SOAP_ENV__Detail), type))
        
return soap ->
error;
    
//
if (soap_putelement(soap, a->fault, "fault", -1, a->__type))
    
//
     return soap->error;
    
// soap_outliteral(soap, "-any", &a->__any, NULL);


    
if (a != NULL)
     {
        
if (a -> serviceException !=
NULL)
             a
-> serviceException -> soap_out(soap, " sms2:ServiceException " , - 1 , ""
);
        
else if (a -> policyException !=
NULL)
             a
-> policyException -> soap_out(soap, " sms2:PolicyException " , - 1 , ""
);
     }

    
return
soap_element_end_out(soap, tag);
}

 

SOAP_FMAC3 struct SOAP_ENV__Detail * SOAP_FMAC4 soap_in_SOAP_ENV__Detail( struct soap * soap, const char * tag, struct SOAP_ENV__Detail * a, const char * type)
{
    
//
size_t soap_flag_fault = 1;
    
// size_t soap_flag___any = 1;

     if (soap_element_begin_in(soap, tag, 0 , type))
        
return
NULL;
     a
= ( struct SOAP_ENV__Detail * )soap_id_enter(soap, soap -> id, a, SOAP_TYPE_SOAP_ENV__Detail, sizeof ( struct SOAP_ENV__Detail), 0
, NULL, NULL, NULL);
    
if ( !
a)
        
return
NULL;
     soap_default_SOAP_ENV__Detail(soap, a);

    
int service = 1
;
    
int policy = 1
;

    
if (soap -> body && !* soap ->
href)
     {
        
for
(;;)
         {     soap
-> error =
SOAP_TAG_MISMATCH;
            
//
if (soap_flag_fault && soap->error == SOAP_TAG_MISMATCH)
            
//
     if ((a->fault = soap_getelement(soap, &a->__type)))
            
//
     {     soap_flag_fault = 0;
            
//
         continue;
            
//
     }
            
//
if (soap_flag___any && (soap->error == SOAP_TAG_MISMATCH || soap->error == SOAP_NO_TAG))
            
//
     if (soap_inliteral(soap, "-any", &a->__any))
            
//
     {     soap_flag___any--;
            
//
         continue;
            
//      }

            
            
if (soap -> error ==
SOAP_TAG_MISMATCH)
             {
                
if (service == 1
)
                 {
                     a
-> serviceException = soap_in_sms2__ServiceException(soap, " sms2:ServiceException " , a -> serviceException, ""
);
                    
if (a ->
serviceException)
                     {
                         service
= 0
;
                        
continue
;
                     }
                 }
                
else if (policy == 1
)
                 {
                     a
-> policyException = soap_in_sms2__PolicyException(soap, " sms2:PolicyException " , a -> policyException, ""
);
                    
if (a ->
policyException)
                     {
                         policy
= 0
;
                        
continue
;
                     }
                 }
                 soap
-> error =
soap_ignore_element(soap);
             }
            
if (soap -> error ==
SOAP_NO_TAG)
                
break
;
            
if (soap ->
error)
                
return
NULL;
         }
        
if
(soap_element_end_in(soap, tag))
            
return
NULL;
     }
    
else

     {     a
= ( struct SOAP_ENV__Detail * )soap_id_forward(soap, soap -> href, ( void * )a, 0 , SOAP_TYPE_SOAP_ENV__Detail, 0 , sizeof ( struct SOAP_ENV__Detail), 0 , NULL);
        
if (soap -> body &&
soap_element_end_in(soap, tag))
            
return
NULL;
     }
    
return
a;
}


    由此,SOAP接口的主要问题除了“附件”还没有处理外,就都解决了,其他都是业务应用的问题了,处理起来就有底了~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值