THETPrio onBeforeExecute更改soapRequest

Adn*_*KEN 4 delphi wsdl delphi-2009

我为项目导入了一些wsdl.我想在HttpRio onBeforeExecute事件上更改SoapRequest,但是当我更改请求时,我得到一些错误如何在此事件上使用stringReplace函数更改请求xml文件.

我试图改变流的大小,我改变了编码等,但无论如何它没有工作.

procedure TForm1.RiomBeforeExecute(const MethodName: string; SOAPRequest: TStream);
var
  sTmp                                  : TStringList;

begin

  sTmp:=TStringList.Create;
  SOAPRequest.Position := 0;
  sTmp.LoadFromStream(SOAPRequest);
  sTmp.Text := StringReplace(sTmp.Text,'blablaa','bla',[RfReplaceAll]);
  sTmp.SaveToStream(SOAPRequest);
  // blaa blaa...
end;
Run Code Online (Sandbox Code Playgroud)

Adn*_*KEN 6

procedure TForm1.RiomBeforeExecute(const MethodName: string; SOAPRequest: TStream);
var
  sTmp                                  : TStringList;

begin

  sTmp:=TStringList.Create;
  SOAPRequest.Position := 0;
  sTmp.LoadFromStream(SOAPRequest);
  sTmp.Text := StringReplace(sTmp.Text,'blablaa','bla',[RfReplaceAll]);
   **SOAPRequest.Postion:=0**;// i forget this here, as i write the code that worked
  sTmp.SaveToStream(SOAPRequest);
  // blaa blaa...
end;
Run Code Online (Sandbox Code Playgroud)

  • 是的!这样就可以了。顺便说一句,我也使用这种方法来修复损坏的命名空间。这也是将 SOAPRequest 转储到日志文件的好地方。 (3认同)

Chr*_*ton 5

可能的增强......我发现,根据我的情况(这是在肥皂反应中,顺便说一下,如果重要的话),如果结果请求比原始请求短(并且在你的情况下是),那就是将新字符串写回流中时遗留下来.
例如:

original: <blablaa some stuff>
intended: <bla some stuff>
actual:   <bla some stuff>uff>
Run Code Online (Sandbox Code Playgroud)

固定:

SOAPRequest.Postion:= 0; //我在这里忘记了这一点,因为我编写了
SOAPRequest.size的代码:= length(sTmp.Text); //重要 - 保存前设置新长度.
sTmp.SaveToStream(SOAPRequest);