• <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| 亚洲va国产va天堂va久久| 久久久无码精品亚洲日韩按摩 | 亚洲精品国产自在久久| 亚洲午夜无码久久久久| 久久久久亚洲av成人无码电影| 国产精品久久影院| 久久精品免费观看| 欧美牲交A欧牲交aⅴ久久 | 久久久无码精品亚洲日韩按摩| 久久国产精品一区| 久久av免费天堂小草播放| 久久噜噜电影你懂的| 国内精品免费久久影院| 欧美亚洲另类久久综合| 国产精品青草久久久久婷婷| 久久亚洲精品成人AV| 精品久久一区二区三区| 久久精品aⅴ无码中文字字幕重口| 亚洲精品午夜国产VA久久成人| 久久夜色精品国产亚洲| 亚洲∧v久久久无码精品| 亚洲国产天堂久久综合网站 | 无码人妻久久久一区二区三区 | 久久精品人成免费| 7国产欧美日韩综合天堂中文久久久久 | 2020久久精品亚洲热综合一本 | 久久人人爽人人精品视频| 国内精品久久国产| 国产午夜精品久久久久九九电影| 久久夜色撩人精品国产小说| 久久精品国产2020| 午夜视频久久久久一区| 久久久久99精品成人片| 久久91精品国产91久久小草| 久久综合偷偷噜噜噜色| 久久精品三级视频| 欧美成a人片免费看久久| 国产精品欧美亚洲韩国日本久久| 国产精品久久久久久影院|