当前位置:网站首页>Delphi SOAP WebService 服务器端多个 SoapDataModule 实现相同的接口方法,接口继承
Delphi SOAP WebService 服务器端多个 SoapDataModule 实现相同的接口方法,接口继承
2022-07-04 20:34:00 【pcplayer】
场景
WebService 服务器端,为了方便代码管理,将不同的业务逻辑,分到不同的 TSoapDataModule 里面去。这样好对代码做模块化管理。
多个 TSoapDataModule 可能需要实现相同的接口方法,每个 TSoapDataModule 模块对该方法的实现代码可能不同(因为业务不同);最简单可能性是每个模块要检查的客户端访问权限不同。
那么,在客户端,因为是调用服务器端的不同接口的相同方法,如果给每个接口写一次方法调用,代码冗余。
解决办法
服务器端:服务器端的接口,默认(IDE 自动生成的代码)从 IAppServerSOAP 继承。
如果我要多个接口里面都有一个相同的方法(或函数),可以自己定义一个接口,从 IAppServerSOAP 继承。
务器端的所有接口,从一个父类接口继承。上述相同的接口方法,声明到这个父类接口里面。
如此一来,客户端只需要一个调用父类接口的方法,根据子类接口不同,实际调用到的服务器端的实现模块就不同。搞定!
以下代码测试通过。
代码 - 服务器端接口声明
IParientIntf = interface(IAppServerSOAP)
['{04E35D2B-4A63-45DE-98C0-AED830BB06B7}']
function Hello(const S: string): string; stdcall;
end;
//ISoapDM_A = interface(IAppServerSOAP)
ISoapDM_A = interface(IParientIntf)
['{4499D900-1856-4178-8D6E-617856DBE2BD}']
end;
//ISoapDM_B = interface(IAppServerSOAP)
ISoapDM_B = interface(IParientIntf)
['{9618B6D7-0826-47D7-AAF6-F7BB3D6F1CDE}']
end;
服务器端,模块一的代码:
TSoapDM_A = class(TSoapDataModule, ISoapDM_A, IAppServerSOAP, IAppServer)
FDConnection1: TFDConnection;
FDQuery1: TFDQuery;
DataSetProvider1: TDataSetProvider;
DataSetProvider11111: TDataSetProvider;
private
public
function Hello(const S: string): string; stdcall;
end;
function TSoapDM_A.Hello(const S: string): string;
begin
Result := 'Hello, ' + S + '; This is SoapDM_AAAAA';
end;
务器端,模块二的代码:
TSoapDM_B = class(TSoapDataModule, ISoapDM_B, IAppServerSOAP, IAppServer)
FDConnection1: TFDConnection;
FDQuery1: TFDQuery;
DataSetProvider1: TDataSetProvider;
DataSetProvider222222: TDataSetProvider;
private
public
function Hello(const S: string): string; stdcall;
end;
function TSoapDM_B.Hello(const S: string): string;
begin
Result := 'Hello, ' + S + '; This is SoapDM_B';
end;
客户端代码:
procedure TForm3.DoHello(Intf: IParientIntf; const S: string);
var
S2: string;
begin
S2 := Intf.Hello(S);
ShowMessage(S2);
end;
客户端调用服务器端模块一:
procedure TForm3.Button3Click(Sender: TObject);
begin
Self.DoHello(HttpRIO1 as ISoapDM_A, '你好');
end;
客户端调用务器端模块二:
procedure TForm3.Button2Click(Sender: TObject);
begin
Self.DoHello(HttpRIO2 as ISoapDM_B, '深圳');
end;
上述调用,在客户端需要注意的问题:
同一个 HTTPRIO1 调用了接口一,再去调用接口二,会出现 interface not support 的异常;反之亦然。采用同一个 HTTPRIO1 先后调用2个不同的接口该如何处理?暂时没看到有什么方法。
解决办法:多个 HttpRIO 实例,每个实例对应一个接口。
因此,上述代码里面,一个是 HttpRIO1 ; 另一个是 HttpRIO2;
总结
Delphi 的 WebService 框架中,服务器端由 IDE 自动创建的 TSoapDataModule 的子类模块,有它自己的接口声明。这个接口,继承自 IAppServerSOAP;
我们可以声明一个自己定义的接口,比如 IParientIntf = interface(IAppServerSOAP)
然后手动修改 IDE 创建的代码,把模块的接口的继承父类,改为 IParientIntf;
通过这样的方式,可以简化客户端的代码,无需对应每个模块,都实现一段相同的调用代码。
边栏推荐
- 杰理之增加进关机前把触摸模块关闭流程【篇】
- Word文档中标题前面的黑点如何去掉
- [Shenbo introduction] VI How to contact your favorite doctoral tutor
- Golang中UTF编码和字符集
- 2021 CCPC Harbin I. power and zero (binary + thinking)
- redis RDB AOF
- 学习突围3 - 关于精力
- 杰理之AD 系列 MIDI 功能说明【篇】
- y56.第三章 Kubernetes从入门到精通 -- 业务镜像版本升级及回滚(二九)
- A quick start to fastdfs takes you three minutes to upload and download files to the ECS
猜你喜欢
colResizable.js自动调整表格宽度插件
Configuration of DNS server of Huawei ENSP simulator
Routing configuration and connectivity test of Huawei simulator ENSP
Gobang go to work fishing tools can be LAN / man-machine
Stealing others' vulnerability reports and selling them into sidelines, and the vulnerability reward platform gives rise to "insiders"
多模輸入事件分發機制詳解
Huawei ENSP simulator configures DHCP for router
[1200. Différence absolue minimale]
Daily question-leetcode556-next larger element iii-string-double pointer-next_ permutation
杰理之增加进关机前把触摸模块关闭流程【篇】
随机推荐
Foxit pdf editor v10.1.8 green version
冰河的海报封面
杰理之AD 系列 MIDI 功能说明【篇】
迈动互联中标北京人寿保险
redis03——Redis的网络配置与心跳机制
Redis bloom filter
Huawei ENSP simulator configures ACL access control list
插入排序,选择排序,冒泡排序
Routing configuration and connectivity test of Huawei simulator ENSP
【C语言】符号的深度理解
Minidom module writes and parses XML
Day24: file system
杰理之AD 系列 MIDI 功能说明【篇】
LambdaQueryWrapper用法
minidom 模塊寫入和解析 XML
y56.第三章 Kubernetes从入门到精通 -- 业务镜像版本升级及回滚(二九)
Numpy vstack and column_ stack
宝塔 7.9.2 宝塔控制面板绕过 手机绑定认证 绕过官方认证
刘锦程荣获2022年度中国电商行业创新人物奖
数十亿公民信息遭泄漏!公有云上的数据安全还有“救”吗?