powerbuilder6.5: PowerBuilder6.5 调用WebService

      近期和别的公司做接口,对方是 WebService ,这样我们需要在 owerBuilder6.5 中进行调用。在 Google 等上找了找,发觉都是采用 MSSOAP.SoapClient 或者 MSXML.XMLHTTP 进行,在具体测试后发觉不是很理想,于是想是否可以直接使用

PB6 本地的 GetURL 功能进行呢?于是有了下面的方案:

      首先从 internetresult 继承对象 n_ir_wsclient ,并定义实例变量 dataResult 用于保存 GetURL 的返回结果。这样就可以进行 WebService 调用了

Inet                lnv_inet

n_ir_wsclient          lnv_wsclient

Integer               li_return

String               ls_url,ls_data

 

lnv_inet       = Create Inet

lnv_wsclient   =   Create n_ir_wsclient

 

ls_url = “http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode=1380571&userID=”

 

li_return = lnv_inet.GetURL(ls_url, lnv_wsclient)

 

ls_data = String(lnv_wsclient.dataResult)

 

Destroy lnv_wsclient

Destroy lnv_inet

         这个时候返回结果为 :

<?xml version="1.0" encoding="utf-8"?>

<string xmlns="http://WebXml.com.cn/">1380571 锛氭禉姹 ? 窞 娴欐睙绉诲姩閲戝崱绁炲窞琛屽崱 </string>

         麻烦了,返回结果是 UTF-8 格式,可是 PB65 不支持直接转化,怎么办呢?最后想想还是辅助了一个 dll 吧,于是 COnvCode.dll 出炉了。  

Function Integer UTF8ToAnsii(String szUTF8,Ref String szAnsiiRslt) Library "ConvCode.dll" Alias For "_UTF8ToAnsii@8"

Function Integer AnsiiToUTF8(String szAnsii, Ref String szUTF8Rslt) Library "ConvCode.dll" Alias For "_AnsiiToUTF8@8"

   最后完整的调用函数也出来了

Inet                           lnv_inet

n_ir_wsclient   lnv_wsclient

Integer                       li_return

String                          ls_url,ls_data,ls_result

Long                        ll_length

 

 

ls_url = arg_url

// 1.URL UTF-8 格式

SetNull(ls_result)

ll_length = AnsiiToUTF8(ls_url,Ref ls_result)

ls_result = Space(ll_length)

ll_length = AnsiiToUTF8(ls_url,Ref ls_result)

If ll_length < 0 Then

         LastError = -100

         Return ""

End If

ls_url = ls_result

 

// 2 、执行 WebService

lnv_inet     = Create Inet

lnv_wsclient = Create n_ir_wsclient

 

li_return = lnv_inet.GetURL(arg_url, lnv_wsclient)

 

ls_data = String(lnv_wsclient.dataResult)

 

Destroy lnv_wsclient

Destroy lnv_inet

 

If li_return < 0 Then

         LastError  = li_return

         Return ""

End If

 

 

// 3 、处理返回结果, UTF-8 ANSII

SetNull(ls_result)

ll_length = UTF8ToAnsii(ls_data,Ref ls_result)

 

ls_result = Space(ll_length)

ll_length = UTF8ToAnsii(ls_data,Ref ls_result)

If ll_length < 0 Then

         LastError = -100

         ls_result = ""

End If

 

// 4 、返回

Return ls_result

         这样处理后返回的结果就是 PB65 可以认识的字符串了,前面例子的返回结果如下:

<?xml version="1.0" encoding="utf-8"?>

<string xmlns="http://WebXml.com.cn/">1380571 :浙江 杭州 浙江移动金卡神州行卡 </string>

 

附:

ConvCode.dll 的核心源代码如下:

INT WINAPI __declspec( dllexport) UTF8ToAnsii( LPCSTR szUTF8, LPSTR szAnsiRslt)
{
        INT nResult = 0 ;
        // 预转换,得到所需空间的大小
        int wcsLen = MultiByteToWideChar( CP_UTF8, 0 , szUTF8, strlen( szUTF8), NULL, 0 );
        // 分配空间要给 '\0' 留个空间, MultiByteToWideChar 不会给 '\0' 空间
        LPWSTR   wszString = ( LPWSTR)( malloc(( wcsLen + 1 )* sizeof ( WCHAR)));

        // 转换
        MultiByteToWideChar( CP_UTF8, 0 , szUTF8, strlen( szUTF8), wszString, wcsLen);
        // 最后加上 '\0'
        wszString[ wcsLen] = '\0' ;

        // 预转换,得到所需空间的大小,这次用的函数和上面名字相反
        int ansiLen = WideCharToMultiByte( CP_ACP, 0 , wszString, wcslen( wszString), NULL, 0 , NULL, NULL);

        nResult = ansiLen + 1 ;
        if ( szAnsiRslt != NULL)   // NULL ==> 仅仅需要字符空间大小
        {
                // 同上,分配空间要给 '\0' 留个空间
                LPSTR szAnsi = ( LPSTR)( malloc(( ansiLen + 1 )* sizeof ( CHAR)));
                // 转换
                //unicode 版对应的 strlen wcslen
                WideCharToMultiByte( CP_ACP, 0 , wszString, wcslen( wszString), szAnsi, ansiLen, NULL, NULL);
                // 最后加上 '\0'
                szAnsi[ ansiLen] = '\0' ;

                // 判断返回字符串空间
                if ( strlen( szAnsiRslt) > ansiLen)
                        strcpy( szAnsiRslt, szAnsi);
                else
                        nResult = - 1 ;

                free( szAnsi);
                szAnsi = NULL;
        }

        free( wszString);
        wszString = NULL;

        return nResult;

}

INT
WINAPI __declspec( dllexport) AnsiiToUTF8( LPCSTR szAnsi, LPSTR szUTF8Rslt)
{
        INT nResult = 0 ;
        // 预转换,得到所需空间的大小
        int   wcsLen   =   MultiByteToWideChar( CP_ACP, 0 , szAnsi, strlen( szAnsi), NULL,   0 );
        // 分配空间要给 '\0' 留个空间, MultiByteToWideChar 不会给 '\0' 空间
        LPWSTR   wszString = ( LPWSTR)( malloc(( wcsLen + 1 )* sizeof ( WCHAR)));
        // 转换
        MultiByteToWideChar( CP_ACP, 0 , szAnsi, strlen( szAnsi), wszString, wcsLen);
        // 最后加上 '\0'
        wszString[ wcsLen]   =    '\0' ;

        // 预转换,得到所需空间的大小,这次用的函数和上面名字相反
        int utf8Len = WideCharToMultiByte( CP_UTF8, 0 , wszString, wcslen( wszString), NULL, 0 , NULL, NULL);

        nResult = utf8Len + 1 ;
        if ( szUTF8Rslt != NULL)   // NULL ==> 仅仅需要字符空间大小
        {
                // 同上,分配空间要给 '\0' 留个空间
                //UTF8 虽然是 Unicode 的压缩形式,但也是多字节字符串,所以可以以 char 的形式保存
                LPSTR szUTF8 = ( LPSTR)( malloc(( utf8Len + 1 )* sizeof ( CHAR)));
                // 转换
                //unicode 版对应的 strlen wcslen
                WideCharToMultiByte( CP_UTF8, 0 , wszString, wcslen( wszString), szUTF8, utf8Len, NULL, NULL);
                // 最后加上 '\0'
                szUTF8[ utf8Len] = '\0' ;


                // 判断返回字符串空间
                if ( strlen( szUTF8Rslt) > utf8Len)
                        strcpy( szUTF8Rslt, szUTF8);
                else
                        nResult = - 1 ;

                free( szUTF8);
                szUTF8 = NULL;
        }

        free( wszString);
        wszString = NULL;

        return nResult;

}

 

Tags:  powerbuilder powerbuilder servicebuilder powerbuilder6.5

延伸阅读

最新评论

发表评论