• <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的情況下,一樣不支持對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接口的主要問題除了“附件”還沒有處理外,就都解決了,其他都是業務應用的問題了,處理起來就有底了~

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

            公告

            Using C++

            導航

            統計

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久久久久无码Av成人影院| 伊人久久综合无码成人网 | 久久亚洲精品无码观看不卡| 色综合久久综精品| 午夜视频久久久久一区| 色婷婷久久久SWAG精品| 亚洲AV无码久久精品蜜桃| 99国产欧美精品久久久蜜芽| 精品人妻伦九区久久AAA片69| 久久免费视频1| 国产精品一久久香蕉国产线看| 久久精品国产亚洲麻豆| 久久伊人五月丁香狠狠色| 久久精品国产一区二区三区日韩| 国产成人无码精品久久久免费| 亚洲国产天堂久久综合| 久久精品国内一区二区三区| 亚洲а∨天堂久久精品| 91精品国产91久久久久久| 久久九九兔免费精品6| 久久国产香蕉视频| 97热久久免费频精品99| 思思久久精品在热线热| 久久精品无码一区二区三区日韩 | 成人久久久观看免费毛片| 久久久精品人妻无码专区不卡 | 久久久久久毛片免费看| 国产99久久精品一区二区| 久久久久国产精品嫩草影院| 久久久久人妻一区精品果冻| 国产激情久久久久影院老熟女免费 | 久久99中文字幕久久| 亚洲乱码中文字幕久久孕妇黑人| 久久成人18免费网站| 99久久国产主播综合精品| 97久久久精品综合88久久| 久久久无码一区二区三区| 日本欧美久久久久免费播放网| 2020国产成人久久精品| 久久强奷乱码老熟女网站| 国内精品伊人久久久影院|