我的代码中有一个警告,我不知道如何删除。该方法是一个调用THTTPRIO的FConverter字段的IOPConvert.ProcessResponse
方法的实用方法。
IOPConvert中有几个ProcessResponse重载版本,其中以参数类型InvString
作为第一个参数声明的版本是不推荐使用的版本。
在整个Delphi SOAP RTL中,从Delphi 7到现在(Delphi XE/XE2),趋势已经从字符串类型转向流类型。
问题是为什么?在这种情况下,我甚至不知道如何转换我的助手代码,除非我添加一个丑陋的字符串流包装器:
TRIOHelper = class helper for THTTPRIO
public
function HelperMethod(aMethName: String; aSoapString: String) : TRemotable;
end;
function TRIOHelper.HelperMethod(aMethName, aSoapString: String): TRemotable;
var
tmpString:String;
begin
//FConverter is a field in THTTPRIO
tmpStr := GrievousXmlHackery(aSoapString);
FConverter.ProcessResponse(InvString(tmpStr), IntfMD, MethMD, FContext);
...
end;
不推荐使用的调用上面的代码正在调整XML文档(SOAP响应),并从传入流中删除一些有问题的元素。是的,一个黑客。我应该如何更改它,以及为什么OpConvert中的字符串不好?
我想我需要为tmpString制作一个字符串流或内存流包装器?请注意,在我的情况下,GrivousXmlHackery函数会在存在<encoding>
标记时从SOAP中删除该标记,原因在这里仍然不重要。
除非旧方法和基于字符串的api在技术上确实出了问题,否则我会接受这个警告。但是,如果(像VCL中的许多地方一样),不推荐使用的警告也意味着"这里有龙",我想知道它。
我不熟悉Delphi的SOAP实现,但为什么不能直接使用TStringStream
呢?
function TRIOHelper.HelperMethod(aMethName, aSoapString: String): TRemotable;
var
Strm: TStringStream;
begin
//FConverter is a field in THTTPRIO
Strm := TStringStream.Create(GrievousXmlHackery(aSoapString));
// or
// Strm := TStringStream.Create('');
// Strm.DataString := GreviousXmlHackery(aSoapString);
FConverter.ProcessResponse(Strm, IntfMD, MethMD, FContext);
// Not sure if you or THTTPRIO is responsible for releasing the stream
...
end;