我正在使用Delphi XE2与一个相当大的SOAP服务通信。我已经成功导入了wsdl,一切正常。然而,我发现自己在写很多类似的代码。我想要一个通用的方法来调用我的web服务。由于我必须为每种类型的调用编写很多代码,所以我也发现很难将我的代码多线程化。
作为一个周末程序员,我离精通Delphi还有很远的路要走,但我认为我至少对RTTI有一个公平的理解,我相信必须使用它来实现我的目标。
这个Web服务有大约700个不同的方法,这就是问题所在。从wsdl生成的代码具有以下方法:
function addPhone(const Params: addPhone): addPhoneResponse; stdcall;
function updatePhone(const Params: updatePhone): updatePhoneResponse; stdcall;
function getPhone(const Params: getPhone): getPhoneResponse; stdcall;
function removePhone(const Params: removePhone): removePhoneResponse; stdcall;
function listPhone(const Params: listPhone): listPhoneResponse; stdcall;
function addStuff(const Params: addStuff): addStuffResponse; stdcall;
function updateStuff(const Params: updateStuff): updateStuffResponse; stdcall;
...
... about 700 more of the above
基本上,有大约700种不同类型的事物可以处理,并且有添加、更新、获取、删除和列出它们所有方法。每次调用时,都会使用相应的类作为SOAP请求的参数。正如您在上面所看到的那样,还有一个对应的响应类。这些类可能看起来像这样(非常简化):
addStuff = class
private
FStuff: string;
published
property stuff: string Index (IS_UNQL) read FStuff write FStuff;
end;
所以当我调用Web服务时,例如:
procedure CreateStuff;
var
req: addStuff;
res: addStuffResponse;
soap: MyWebServicePort;
begin
// Use the function in the wsdl-generated code to create HTTPRIO
soap := GetMyWebServicePort(false,'',nil);
// Create Parameter Object
req := addPhone.Create;
req.stuff := 'test';
// Send the SOAP Request
res := soap.addStuff(req);
end;
(是的,我知道我应该在那里使用try..finally和Free :-) )
然后,在代码的其他地方,我需要调用不同的方法:
procedure listStuff;
var
req: listStuff;
res: listStuffResponse;
soap: MyWebServicePort;
begin
// Use the function in the wsdl-generated code to create HTTPRIO
soap := GetMyWebServicePort(false,'',nil);
// Create Parameter Object
req := listPhone.Create;
req.stuff := 'test2';
// Send the SOAP Request
res := soap.listStuff(req);
end;
我知道参数始终是一个类,其名称相当于我调用的方法,因此我想能够执行下面的元代码以动态调用方法。我猜它需要一些RTTI魔法,但我还没有找到实现的方法:
procedure soapRequest(Param: Something; var Response: Something);
begin
soap := GetMyWebServicePort(false,'',nil);
Response := soap.DynamicInvoke(Param.ClassName, Param);
end
那么我可以做类似这样的事情:
soapRequest(VarOfTypeAddStuff,VarOfTypeAddStuffResponse)
soapRequest(VarOfTypeListStuff,VarOfTypeListStuffResponse)
...
有人知道如何简化我对web服务的调用吗?