分享

delphi2010 调用webservice注意事项

 樱啊小樱啊 2014-08-15
    一.delphi做客户端调用asp.net web service
步骤1. 新建一个vcl工程
步骤2.文件-新建-webservice-WSDLImporter
delphi2010 <wbr>调用webservice注意事项
                                               图1
 

2.
delphi2010 <wbr>调用webservice注意事项
                图2

delphi2010 <wbr>调用webservice注意事项
                                       图3

然后直接next-finish,然后系统会自动生成一个webservice文件,把此文件uses添加到你需要的地方即可,               

3.添加THTTPRIO控件的WSDLLocation属性(设置), 即webservice wsdl 的url ,然后再选择port和service属性,都下拉选择即可
 
4.由于服务端 其中一个函数返回的是json数据,所以要用到TByteArray 数组,接受字符串一定要用AnsiString,否则用utf8转换的时候,会有一部分乱码
 
主要代码如下
uses   WebService2 ;
procedure TForm1.btn1Click(Sender: TObject);
var
tb: ^TByteArray;
tem,tem1:AnsiString;
P:PChar;
i:Integer;
begin
  tb:=@((htpr1 as ICYZGWebQuery).QueryMemberCertificateInfo('朱成辉','431124199109243419',''))[0];//operaterLogin为接口方法。
  // ShowMessage(IntToStr(tb^));
  // ShowMessage(IntToStr(low(tb^)));
  //ShowMessage(IntToStr(High(tb^)));
  SetString(tem, PAnsiChar(@tb^[0]), high(tb^));
  edt1.Text:=UTF8Decode(tem);
  
   
end;

 

 

二.程序深度分析

返回实际json数据:

[{"memberName":"朱成辉","sexName":"男","idCardNo":"431124199109243419","education":"大专","companyName":"aaa","telephone":"","address":"湖南省道县新车乡新车村3组","zoneName":"湖南省长沙市市辖区","driversType":"C1","newLicenseDate":"2013-08-14","licenseStartDate":"2013-08-14","licenseDuring":"6年","certificateID":"4301000100014000101","certificateType":"客运驾驶员","newCertificateDate":"2013-08-14","certificateBeginDate":"2014-02-20","certificateEndDate":"2020-02-23","faceImage":null}]

 

TByteArray(实际上就是c++里的无符号char 数组)数组接受的数据:

(91, 123, 34, 109, 101, 109, 98, 101, 114, 78, 97, 109, 101, 34, 58, 34, 230, 156, 177, 230, 136, 144, 232, 190, 137, 34, 44, 34, 115, 101, 120, 78, 97, 109, 101, 34, 58, 34, 231, 148, 183, 34, 44, 34, 105, 100, 67, 97, 114, 100, 78, 111, 34, 58, 34, 52, 51, 49, 49, 50, 52, 49, 57, 57, 49, 48, 57, 50, 52, 51, 52, 49, 57, 34, 44, 34, 101, 100, 117, 99, 97, 116, 105, 111, 110, 34, 58, 34, 229, 164, 167, 228, 184, 147, 34, 44, 34, 99, 111, 109, 112, 97, 110, 121, 78, 97, 109, 101, 34, 58, 34, 97, 97, 97, 34, 44, 34, 116, 101, 108, 101, 112, 104, 111, 110, 101, 34, 58, 34, 34, 44, 34, 97, 100, 100, 114, 101, 115, 115, 34, 58, 34, 230, 185, 150, 229, 141, 151, 231, 156, 129, 233, 129, 147, 229, 142, 191, 230, 150, 176, 232, 189, 166, 228, 185, 161, 230, 150, 176, 232, 189, 166, 230, 157, 145, 51, 231, 187, 132, 34, 44, 34, 122, 111, 110, 101, 78, 97, 109, 101, 34, 58, 34, 230, 185, 150, 229, 141, 151, 231, 156, 129, 233, 149, 191, 230, 178, 153, 229, 184, 130, 229, 184, 130, 232, 190, 150, 229, 140, 186, 34, 44, 34, 100, 114, 105, 118, 101, 114, 115, 84, 121, 112, 101, 34, 58, 34, 67, 49, 34, 44, 34, 110, 101, 119, 76, 105, 99, 101, 110, 115, 101, 68, 97, 116, 101, 34, 58, 34, 50, 48, 49, 51, 45, 48, 56, 45, 49, 52, 34, 44, 34, 108, 105, 99, 101, 110, 115, 101, 83, 116, 97, 114, 116, 68, 97, 116, 101, 34, 58, 34, 50, 48, 49, 51, 45, 48, 56, 45, 49, 52, 34, 44, 34, 108, 105, 99, 101, 110, 115, 101, 68, 117, 114, 105, 110, 103, 34, 58, 34, 54, 229, 185, 180, 34, 44, 34, 99, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 73, 68, 34, 58, 34, 52, 51, 48, 49, 48, 48, 48, 49, 48, 48, 48, 49, 52, 48, 48, 48, 49, 48, 49, 34, 44, 34, 99, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 84, 121, 112, 101, 34, 58, 34, 229, 174, 162, 232, 191, 144, 233, 169, 190, 233, 169, 182, 229, 145, 152, 34, 44, 34, 110, 101, 119, 67, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 68, 97, 116, 101, 34, 58, 34, 50, 48, 49, 51, 45, 48, 56, 45, 49, 52, 34, 44, 34, 99, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 66, 101, 103, 105, 110, ...)

上面传来是utf8格式数组(通过查询第一个汉字朱的ut8编码可知 230, 156, 177, 十六进制即E69CB1)

那么为什么返回的数据一定要用AnsiString接受呢,无意中看到了一篇文章http://hi.baidu.com/whmtorrent/item/bd7073db261171836cce3f1f

它最后说
"值得注意的是,UTF8编码的字符串一般要将其保存在CHAR(char)型数组里,而不保存在WCHAR(wchar_t)型数组里。为什么呢?因为UTF8编码的字符串每个字符占1-4个字节,有的字符只占1个字节,应该用CHAR型数组来保存。而WCHAR的话,一个WCHAR就占两个字节,对于只需要一个字节的字符,就会出问题。"

我想这也许就是正确答案

 

关于utf8的文章看http://blog.sina.com.cn/s/blog_9e2e84050102uwhv.html


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多