• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Codejie's C++ Space

            Using C++

            GSOAP:添加FAULT的處理

            不知道是WSDL描述還是GSOAP自身的問題,有其生成的代碼中在不支持Header的情況下,一樣不支持對(duì)FAULT處理,于是,照著處理Header的過程,添加了對(duì)FAULT的處理。
            ???? 為處理FAULT,需要事先知道SOAP報(bào)文中將FAULT信息放在哪里,當(dāng)然了,一般自定義擴(kuò)充都放在DETAIL里面。只是開始不太確定,于是還特意發(fā)了個(gè)錯(cuò)誤報(bào)文給對(duì)端,收到如下回復(fù),從而確認(rèn)猜測(cè)是對(duì)的,這樣就可以修改了。

            <?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結(jié)構(gòu)里面添加所需要的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函數(shù)了:
            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接口的主要問題除了“附件”還沒有處理外,就都解決了,其他都是業(yè)務(wù)應(yīng)用的問題了,處理起來就有底了~

            posted on 2009-07-27 18:34 codejie 閱讀(1823) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++

            公告

            Using C++

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            亚洲综合伊人久久综合| 久久久久久亚洲精品不卡 | 久久青青草原精品影院| 国产精品久久久久9999高清| 久久精品中文字幕久久| 精品久久久久中文字| 国产精品美女久久福利网站| 久久婷婷五月综合97色一本一本| 四虎国产精品免费久久久| 亚洲伊人久久综合影院| 精品一区二区久久久久久久网站| 亚洲伊人久久综合影院| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 国产精品久久久久久吹潮| 亚洲а∨天堂久久精品| 一本一道久久精品综合| 久久99久国产麻精品66| 99久久精品免费| 99国产欧美久久久精品蜜芽| yy6080久久| 香蕉99久久国产综合精品宅男自 | 囯产精品久久久久久久久蜜桃| 国产成人久久AV免费| 久久亚洲国产精品成人AV秋霞| 热久久国产精品| 97久久久精品综合88久久| 2021国内久久精品| 欧美日韩中文字幕久久久不卡| 久久99精品国产麻豆宅宅| 少妇高潮惨叫久久久久久| 久久妇女高潮几次MBA| 欧美激情一区二区久久久| 欧美久久久久久精选9999| 久久99精品国产麻豆不卡| 亚洲天堂久久精品| 亚洲国产成人久久综合碰碰动漫3d| 国产精品久久久久久吹潮| 91精品国产91久久久久福利| 97久久精品国产精品青草| 青青青青久久精品国产| 久久精品国产精品国产精品污|