• <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>

            The power of C, the power of MD

            A problem is a chance to do your best
            posts - 11, comments - 22, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
            電信provisioning系統(tǒng)中,常常需要與遠程服務(wù)器實時交換一些數(shù)據(jù),以完成用戶的請求。由于簡單對象訪問協(xié)議(Simple Object Access Protocol, SOAP)的流行,許多涉及到第三方的應(yīng)用,我們一般都比較樂意使用SOAP來開發(fā)。不過,由于可能涉及到公司的機密,本系列教程的開發(fā)實例盡量采用在網(wǎng)上已經(jīng)公開的Web Service資源。
             
            上一節(jié),講解了用iconv解決gSOAP輸出的中文文本亂碼的問題。在本節(jié)中,我們用一個天氣預(yù)報客戶端的例子,簡述一下gSOAP輸入的中文文本亂碼的問題。
             
            Webxml.com.cn提供的天氣預(yù)報web服務(wù),endpoint地址是:http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx,大家可以點擊進去,查看一下該服務(wù)的所有對外提供的接口。其中,利用getWeatherbyCityName接口,可以按給定的城市名字查詢該城市的天氣預(yù)報,如果輸入的城市名字不能識別,將統(tǒng)一返回北京的天氣預(yù)報。
             
            根據(jù)前三節(jié)的內(nèi)容,我們可以很快地準備好其客戶端存根程序:
            1.     mkdir –p weather
            2.     cd weather
            3.     ../wsdl2h -c -o weather.h
            http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
            4.     ../../bin/linux386/soapcpp2 –C –L –x weather.h
             
            由于程序并不復(fù)雜,直接給出其源代碼:
            #include <iconv.h>

            #include 
            "soapH.h"
            #include 
            "WeatherWebServiceSoap12.nsmap"

            #define OUTPUT_LEN 2048

            int conv_charset(const char *dest, const char *src, char *input, size_t ilen, char *output, size_t olen) {
                iconv_t conv 
            = iconv_open(dest, src);
                
            if ( conv == (iconv_t) -1 )
                    
            return -1;
                memset(output, 
            0, olen);
                
            if ( iconv(conv, &input, &ilen, &output, &olen) )
                    
            return -1;
                iconv_close(conv);
                
            return 0;
            }

            int main(int argc, char **argv) {
                
            if ( argc != 2 && argc != 3 ) {
                    printf(
            "Usage: %s city_name [end_point]\n", argv[0]);
                    exit(
            -1);
                }

                
            struct soap soap;
                soap_init(
            &soap);
                soap_set_mode(
            &soap, SOAP_C_UTFSTRING);

                
            struct _ns1__getWeatherbyCityName request;
                
            struct _ns1__getWeatherbyCityNameResponse response;

                size_t ilen 
            = strlen(argv[1]);
                
            char output[OUTPUT_LEN];
                
            if ( conv_charset("UTF-8""GBK", argv[1], ilen, output, OUTPUT_LEN) )
                    request.theCityName 
            = argv[1];
                
            else
                    request.theCityName 
            = output;

                
            char *endpoint = NULL;
                
            if ( argc == 3 )
                    endpoint 
            = argv[2];
                    
            if ( soap_call___ns3__getWeatherbyCityName(&soap, endpoint, NULL, &request, &response) == SOAP_OK ) {
                    
            int element_counter = response.getWeatherbyCityNameResult->__sizestring;
                    
            int i = 0;
                    
            for ( i = 0; i < element_counter; i++ ) {
                        
            switch ( i ) {
                            
            case 0  : printf("Province          : "); break;
                            
            case 1  : printf("City              : "); break;
                            
            case 2  : printf("City code         : "); break;
                            
            case 3  : printf("City pic. name    : "); break;
                            
            case 4  : printf("Timestamp         : "); break;
                            
            case 5  : printf("Temp. of today    : "); break;
                            
            case 6  : printf("Summary           : "); break;
                            
            case 7  : printf("Wind              : "); break;
                            
            case 8  : printf("Icon 1            : "); break;
                            
            case 9  : printf("Icon 2            : "); break;
                            
            case 10 : printf("Description       : "); break;
                            
            case 11 : printf("Reserved          : "); break;
                            
            case 12 : printf("Temp. of tomorrow : "); break;
                            
            case 13 : printf("Summary           : "); break;
                            
            case 14 : printf("Wind              : "); break;
                            
            case 15 : printf("Icon 1            : "); break;
                            
            case 16 : printf("Icon 2            : "); break;
                            
            case 17 : printf("Temp. of af. tmr. : "); break;
                            
            case 18 : printf("Summary           : "); break;
                            
            case 19 : printf("Wind              : "); break;
                            
            case 20 : printf("Icon 1            : "); break;
                            
            case 21 : printf("Icon 2            : "); break;
                            
            case 22 : printf("Introduction      : "); break;
                            
            default : break;
                        }
                        ilen 
            = strlen(response.getWeatherbyCityNameResult->string[i]);
                        
            if ( conv_charset("GBK""UTF-8", response.getWeatherbyCityNameResult->string[i], ilen, output, OUTPUT_LEN) )
                            printf(
            "%s\n", response.getWeatherbyCityNameResult->string[i]);
                        
            else
                            printf(
            "%s\n", output);
                    }
                }
                
            else {
                    soap_print_fault(
            &soap, stderr);
                }

                soap_destroy(
            &soap);
                soap_end(
            &soap);
                soap_done(
            &soap);
                
            return 0;
            }


            編譯命令是:gcc -O2 -o weather weather.c soapC.c soapClient.c ../../stdsoap2.c -I../.. -L../.. –lgsoap

             

            基本上與上一節(jié)的股票信息客戶端差不多,唯一不同的是,作為輸入?yún)?shù)的城市名字,首先需要iconv轉(zhuǎn)換編碼,從GBK轉(zhuǎn)到UTF-8,才可以提交給服務(wù)端。各位可以試一下,不作轉(zhuǎn)換的話,無論輸入什么,服務(wù)端只會返回北京的天氣預(yù)報,因為傳入的參數(shù)在服務(wù)端產(chǎn)生了亂碼。

             

            以下為正常的執(zhí)行結(jié)果,輸入廣州,可以得到廣州的天氣預(yù)報:


            如上圖,最后一段的介紹也出現(xiàn)了亂碼,不過我認為這是putty的問題,行末的最后一個全角字符,如果只能顯示一半的話,下一行開始將產(chǎn)生亂碼,如果再遇到一個半角字符,又能顯示正常了。

            http://blog.csdn.net/yui/archive/2010/07/23/5758906.aspx
            内射无码专区久久亚洲| 久久99国产一区二区三区| 久久狠狠爱亚洲综合影院| 亚洲精品白浆高清久久久久久 | 色欲综合久久中文字幕网| 久久精品国产亚洲av麻豆色欲| 国产精品久久久久久久久免费| 久久精品免费网站网| 久久久久亚洲AV无码永不| 国产女人aaa级久久久级| 国产成人精品综合久久久| 情人伊人久久综合亚洲| 久久人人爽人人爽人人av东京热| 国内精品久久久久影院免费| 一本一道久久a久久精品综合 | 久久人人添人人爽添人人片牛牛| 国产精品一区二区久久国产| 四虎国产精品成人免费久久| 国产精品对白刺激久久久| 婷婷久久综合九色综合绿巨人| 精品久久香蕉国产线看观看亚洲 | 91久久国产视频| 久久国产精品一国产精品金尊| 久久这里只有精品视频99| 99久久精品无码一区二区毛片 | 久久午夜福利无码1000合集| 国产国产成人久久精品| 久久久久亚洲AV片无码下载蜜桃| 色天使久久综合网天天| 久久不见久久见免费影院www日本| 亚洲AV成人无码久久精品老人| 中文国产成人精品久久亚洲精品AⅤ无码精品| 97久久综合精品久久久综合| 久久久久亚洲av无码专区喷水| 久久婷婷五月综合97色直播| 久久久久久久久66精品片| 手机看片久久高清国产日韩| 亚洲а∨天堂久久精品9966| 久久伊人精品青青草原日本| 久久久91人妻无码精品蜜桃HD| 日本欧美国产精品第一页久久|