delphi的webservice开发。

一、在已有的项目中,调用外部的webservice

1、根据向导建webservice,在项目中引入“WSDL Importer"。假设引入后生成的类的名字为”service"

2、对生成的service类做相应的修改。

2.1、如果webservice方法里的某些参数即是接收传入参数又是接收返回参数,在delphi里要对参数名字重新命名

如在用c#写的webservice的服务端方法是sr.Get_Delivery_Data_Over(sn, sjlx, ref err);
//默认生成的代码为
procedure Get_Delivery_Data(const err: WideString; const data_str: TByteDynArray; const sn: Integer; const sjlx: WideString; out Get_Delivery_DataResult: Boolean; out err: WideString; out data_str: TByteDynArray; out sn: Integer); stdcall;
///要改成如下:
procedure Get_Delivery_Data(const err1: WideString; const data_str1: TByteDynArray; const sn1: Integer; const sjlx: WideString; out Get_Delivery_DataResult: Boolean; out err: WideString; out data_str: TByteDynArray; out sn: Integer); stdcall;

2.2、 如果delphi调用c#写的webservice时,服务器端方法接收到delphi传过来的参数总是为空时,在delphi的service类的initialization下面加这名话

 InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap),ioDocument);   ///必需要加,不然传到c#写的webservice里的方法的参数值是空的

如下是service类的源代码

// ************************************************************************ //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL : http://fti.yndzyf.com/Service.asmx?wsdl
// Encoding : utf-
// Version : 1.0
// (-- :: - 1.33.2.5)
// ************************************************************************ // unit Service; interface uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns; type // ************************************************************************ //
// The following types, referred to in the WSDL document are not being represented
// in this file. They are either aliases[@] of other types represented or were referred
// to but never[!] declared in the document. The types from the latter category
// typically map to predefined/known XML or Borland types; however, they could also
// indicate incorrect WSDL documents that failed to declare or import a schema type.
// ************************************************************************ //
// !:string - "http://www.w3.org//XMLSchema"
// !:base64Binary - "http://www.w3.org//XMLSchema"
// !:int - "http://www.w3.org//XMLSchema"
// !:boolean - "http://www.w3.org//XMLSchema" Websoap = class; { "http://aitf.yndzyf.com/"[H] } // ************************************************************************ //
// Namespace : http://aitf.yndzyf.com/
// ************************************************************************ //
Websoap = class(TSOAPHeader)
private
FUserName: WideString;
FPassWord: WideString;
published
property UserName: WideString read FUserName write FUserName;
property PassWord: WideString read FPassWord write FPassWord;
end; // ************************************************************************ //
// Namespace : http://aitf.yndzyf.com/
// soapAction: http://aitf.yndzyf.com/%operationName%
// transport : http://schemas.xmlsoap.org/soap/http
// binding : ServiceSoap
// service : Service
// port : ServiceSoap
// URL : http://fti.yndzyf.com/Service.asmx
// ************************************************************************ //
ServiceSoap = interface(IInvokable)
['{E00EB65B-7136-E473-42EF-D3135F25019F}']
procedure Get_Delivery_Data(const err1: WideString; const data_str1: TByteDynArray; const sn1: Integer; const sjlx: WideString; out Get_Delivery_DataResult: Boolean; out err: WideString; out data_str: TByteDynArray; out sn: Integer); stdcall;
procedure Get_Delivery_Data_Over(const sn: Integer; const sjlx: WideString; const err1: WideString; out Get_Delivery_Data_OverResult: Boolean; out err: WideString); stdcall;
procedure Receive_data(const error1: WideString; const str: TByteDynArray; const sn: Integer; const sjlx: WideString; out Receive_dataResult: Boolean; out error: WideString); stdcall;
end; function GetServiceSoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil;user:string='';password:string=''): ServiceSoap; implementation function GetServiceSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO;user:string;password:string): ServiceSoap;
const
defWSDL = 'http://fti.yndzyf.com/Service.asmx?wsdl';
defURL = 'http://fti.yndzyf.com/Service.asmx';
defSvc = 'Service';
defPrt = 'ServiceSoap';
var
RIO: THTTPRIO;
begin
Result := nil;
if (Addr = '') then
begin
if UseWSDL then
Addr := defWSDL
else
Addr := defURL;
end;
if HTTPRIO = nil then
RIO := THTTPRIO.Create(nil)
else
RIO := HTTPRIO;
try
Result := (RIO as ServiceSoap);
if UseWSDL then
begin
RIO.WSDLLocation := Addr;
RIO.Service := defSvc;
RIO.Port := defPrt;
end else
RIO.URL := Addr;
finally
if (Result = nil) and (HTTPRIO = nil) then
RIO.Free;
end;
end; initialization
InvRegistry.RegisterInterface(TypeInfo(ServiceSoap), 'http://aitf.yndzyf.com/', 'utf-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(ServiceSoap), 'http://aitf.yndzyf.com/%operationName%');
InvRegistry.RegisterHeaderClass(TypeInfo(ServiceSoap), Websoap, 'Websoap', '');
RemClassRegistry.RegisterXSClass(Websoap, 'http://aitf.yndzyf.com/', 'Websoap');
InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap),ioDocument); ///必要要加,不然传到c#写的webservice里的值是空的
end.

3、调用

procedure Tform_smrk.bgetydClick(Sender: TObject);
var sql:string;
var err_fp,err1_fp,err_yjm,err1_yjm:Widestring;
data_fp,data_fp1,data_yjm,data_yjm1:TByteDynArray;
sn_fp,sn_fp1,sn_yjm,sn_yjm1:Integer;
flag_fp,flag_fp1,flag_yjm,flag_yjm1:boolean;
ws:webSoap;
svc:serviceSoap;
begin
svc := HTTPRIO1 as ServiceSoap;
ws:=websoap.Create;
ws.UserName:=serviceName;///webservice的用户名和密码
ws.PassWord:=servicePassword;
(svc as ISOAPHeaders).Send(ws);
svc.Get_Delivery_Data('',data_fp1,,'运单',flag_fp,err_fp,data_fp,sn_fp);
(svc as ISOAPHeaders).Send(ws);///每次调用时都要重新设置用户和密码
svc.Get_Delivery_Data('',data_yjm1,,'电子监管',flag_yjm,err_yjm,data_yjm,sn_yjm);
if length(data_fp)> then///如果有运单
begin
ADOStoredProc1.ProcedureName:= 'p_insert_data';
ADOStoredProc1.Parameters.Clear;
ADOStoredProc1.Parameters.Refresh;
ADOStoredProc1.Parameters.ParamByName('@data_str').Value:=data_fp;
if length(data_yjm)> then ADOStoredProc1.Parameters.ParamByName('@data_str_yjm').Value:=data_yjm;
ADOStoredProc1.Prepared;
ADOStoredProc1.ExecProc;
end

要注意的是:1、每次调用webservice时要重新写一次(svc as ISOAPHeaders).Send(ws);,将webSoap和serviceSoap关联

2、上面的代码是从webservice取xml的二进制文件,然后将取出的二进制数据传入到存储过程p_insert_data里。用ADOStoreProc可以对存储过程传参数

时可以不考虑参数的类型,直接用ADOStoredProc1.Parameters.ParamByName('@data_str').Value:=data_fp赋值,在赋值前要ADOStoredProc1.Parameters.Refresh;不然不能对参数                          赋值成功。

3、HTTPRIO1 是控件THTTPRIO。控件要设置好URL=http://fti.yndzyf.com/Service.asmx?wsdl

delphi用webservice的更多相关文章

  1. Delphi调用webservice总结

    Delphi调用webservice总结     Delphi调用C#写的webservice 用delphi的THTTPRIO控件调用了c#写的webservice. 下面是我调试时遇到的一些问题: ...

  2. delphi 调用Webservice 引入wsdl 报错 document empty

    delphi 调用Webservice 引入wsdl 报错 document empty 直接引入wsdl 地址报错 document empty 解决办法:在浏览器里保存为xml文件,然后在开发环境 ...

  3. Delphi编写WebService体会

    源:Delphi编写WebService体会 Dispatch: 派遣,分派 Invoke: 调用 Invokable: 可调用接口 TReomtable: WebService中自定义类都是继承自该 ...

  4. DELPHI新版本WEBSERVICE的变化

    DELPHI新版本WEBSERVICE,不仅可以编译成ISAPI DLL,依靠IIS部署, 并且还可以编译成单独的EXE,不再依赖IIS就可以独立运行,这一点未尝不可以说是非常方便的改进.

  5. Delphi调用WebService(通过SoapHeader认证)经验总结

    项目(Delphi开发)需要调用另一个系统的WebService.走了不少弯路,现记录总结一下经验.以下是WebService要求: 1.WebService概述 营销Webservice接口采用Ap ...

  6. 【转】Delphi调用webservice总结

    原文:http://www.cnblogs.com/zhangzhifeng/archive/2013/08/15/3259084.html Delphi调用C#写的webservice 用delph ...

  7. Delphi实现WebService带身份认证的数据传输

    WebService使得不同开发工具开发出来的程序可以在网络连通的环境下相互通信,它最大的特点就是标准化(基于XML的一系列标准)带来的跨平台.跨开发工具的通用性,基于HTTP带来的畅通无阻的能力(跨 ...

  8. Delphi 调试WEBService程序(ISAPI或CGI) 把Web App Debugger executable转换成 ISAPI/NSAPI

      1.新建一个web工程,请选中最下面一项:Web App Debugger executable,Coclass name我们设为demo1: 2.在弹出的WebModule2中右击,在弹出的Ac ...

  9. delphi调用webservice 转

      如今 Web Service 已越来越火了,在DotNet已开发的Web Service中,Delphi 7如何方便的调用DotNet写的Web Service呢?方法有两种,一种是在Delphi ...

随机推荐

  1. 剑指Offer_4_二维数组中的查找

    题目描述       在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.       ...

  2. FFmpeg源码简单分析:libswscale的sws_scale()

    ===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...

  3. 使用Mybatis-Generator自己主动生成Dao、Model、Mapping相关文件

    准备工作: 1.数据库驱动程序 2.generatorConfig驱动,(下载地址:https://github.com/mybatis/generator/releases) 3.generator ...

  4. Cocos2d-x 3.0正式版及android环境搭建

    开发环境是:mac + xcode + eclipse ,在win以下的环境和这个都是一样的,唯一不一样的就是环境变量的配置. 以下主要介绍cocos2d-x环境的设置以及android的环境搭建 1 ...

  5. OSX: Scripts,让BootCamp在不论什么Mac上支持生成Windows7的USB安装盘

    为什么要做这个呢,由于BootCamp仅仅有在默认的Mac上才会有生成USB安装盘的选项.这个脚本就是为了确保用户使用它在不论什么一个Mac机器上都能够生成Windows的USB安装盘.当然了,假设你 ...

  6. 柯塔娜(Cortana):从科幻虚构到真实人生

    依照商业法理.7月29日.随着Win10公布的东风."小娜"与"小冰"两姊妹相会于中国北京. 在"小娜"眼中,"小冰"仅 ...

  7. java多线程编程核心技术——第五章总结

    定时器Timer的使用 1.1方法schedule(TimerTask task, Date time)的测试 1.2方法schedule(TimerTask task, Date firstTime ...

  8. Winform开发框架中工作流模块的表设计分析

    在较早博客随笔里面写过文章<Winform开发框架之简易工作流设计>之后,很久没有对工作流部分进行详细的介绍了,本篇继续这个主题,详细介绍其中的设计.实现及效果给大家,这个工作流在好几年前 ...

  9. mysql+mybatis递归调用

    递归调用的应用场景常常出现在多级嵌套的情况,比如树形的菜单.下面通过一个简单的例子来实现mysql+mybatis的递归. 数据模型 private Integer categoryId; priva ...

  10. Ubuntu 下 libgps 库的使用

    简介 一般 GPS 接收器会遵循美国国家海洋电子协会(National Marine Electronics Association)所指定的标准规格,其中包含传输资料的格式以及传输资料的通讯协议.那 ...