Delphi SoapRequest转换< >到< >

时间:2014-08-20 21:35:11

标签: xml web-services delphi delphi-2010

Continuation to this..

我们设法在服务器端生成日志..当我们传递输入有宽字符串时,我们正在使用& LT; &安培; gt;(不是:字符之间没有空格)而不是< > ..有没有办法在Delphi中限制它?

甚至在HTTPRIO1.BeforeExecute ..

中尝试过StringReplace
  LDocument := NewXMLDocument;
  LDocument.Active := True;
  LDocument.Encoding := 'utf-8';
  LDocument.Options := [doNodeAutoIndent];
  ns := 'http://www.bank.com/dox/service/v1.0.0';
  RootNode := LDocument.AddChild('AgreementSearchRequest');
  RootNode.Attributes['xmlns:i'] := 'http://www.w3.org/2001/XMLSchema-instance';
  RootNode.DeclareNamespace('', ns);

  HeaderNode := RootNode.AddChild('Header', ns);
  HeaderNode.AddChild('PageNo').Text := '1';
  HeaderNode.AddChild('PageSize').Text := '10';
  HeaderNode.AddChild('Source').Text := 'IFBD';

  SearchCriteriaNode := RootNode.AddChild('SearchCriteria', ns);
  SearchCriteriaNode.AddChild('AgreementId').Text := '5027222';
  SearchCriteriaNode.AddChild('IsOffshoreUser').Text := 'true';
  BankLegalNode := SearchCriteriaNode.AddChild('BankLegalEntities');
  LegalNode := BankLegalNode.AddChild('BankLegalEntity');
  LegalNode.AddChild('GCRS').Text := 'Search LEgal Entity';
  LegalNode.AddChild('BankLegalEntityName').Text :=
    'Search Legal Entity Category';
  DocSearchOut := SearchArgsResponse.Create();
  DoxSerchIn := SearchArgs.Create();
  DoxSerchIn.SearchArgs := LDocument.DocumentElement.XML;
  DoxService := GetIDoxService(True,'',HTTPRIO1);
  DocSearchOut :=DoxService.SearchAgreements(DoxSerchIn)  

在执行之前尝试转换,但是当它将String转换为Stream

procedure TFormDelegate.HTTPRIO1BeforeExecute(const MethodName: string;
  SOAPRequest: TStream);
var
  StrStrm : TStringStream;
  xml,xml1,xml2: TStringList;
begin
  ShowMessage(MethodName);
  Memo1.Clear;
    StrStrm := TStringStream.Create();
    xml := TStringList.Create;
    xml1 := TStringList.Create;
    xml2 := TStringList.Create;
    try
      xml.Text := StreamToString(SOAPRequest);
      xml2.Text := StringReplace(xml.Text,'&lt;','<', [rfReplaceAll, rfIgnoreCase]);
      xml1.Text := StringReplace(xml2.Text,'&gt;','>', [rfReplaceAll, rfIgnoreCase]);
      xml2.Text := StringReplace(xml1.Text,'<parameters>','', []);
      xml1.Text := StringReplace(xml2.Text,'</parameters>','', []);
      xml1.SaveToFile('response1.xml');
      //SOAPRequest := StringToStream(xml1.Text);
      SOAPRequest:=  StringToStream(xml1.Text);
    except
      xml.Free;
       xml1.Free;
        xml2.Free;
     StrStrm.Free;
    end;
    Memo1.Lines.Append(StreamToString(SOAPRequest));
end;

服务器端日志..

  <SOAP-ENV:Body>
    <SearchAgreements xmlns="http://www.bank.com/dox/service/v1.0.0">
      <parameters>
   <searchRequest>&lt;AgreementSearchRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.bank.com/dox/service/v1.0.0"& gt;
  & lt;Header&gt;
    & lt;PageNo&gt;1& lt;/PageNo&gt;
    & lt;PageSize&gt;10& lt;/PageSize&gt;
    & lt;Source&gt;IFBD&l t;/Source&gt;
  & lt;/Header&gt;
  & lt;SearchCriteria& gt;
    & lt;AgreementId& gt;5027222& lt;/AgreementId& gt;
    & lt;IsOffshoreUser& gt;true&lt;/IsOffshoreUser& gt;
    & lt;bankLegalEntities&gt;
      & lt;bankLegalEntity& gt;
        & lt;GCRS&gt;Search LEgal Entity&lt;/GCRS&gt;
        & lt;bankLegalEntityName&gt;Search Legal Entity Category& lt;/bankLegalEntityName& gt;
      & lt;/bankLegalEntity& gt;
    & lt;/bankLegalEntities&gt;
  & lt;/SearchCriteria& gt;
& lt;/AgreementSearchRequest& gt;</searchRequest>
      </parameters>
    </SearchAgreements>
  </SOAP-ENV:Body>

2 个答案:

答案 0 :(得分:0)

我不确定这是否可行,但我怀疑它是你想要的。

以下不是技术说明,而是我自己对此的看法。 SOAP发送的请求已经是XML,它将发送您自己的数据。

如果您保留少于<且大于>个字符,则您发送的数据将被视为SOAPrequest中data节点的子节点。<登记/> 你不希望这样,因为它的数据是你想要实现的,而不是SOAP的一部分。

你可以尝试获取soaprequest,从data节点中提取xml作为字符串。 在该字符串上执行stringreplace并将其解析为xml。

希望这会有所帮助。

修改

问题在于您的SOAP消息,尽管它不是 问题 如果您阅读上述内容,则不希望将xml视为子节点,而是在使用SOAP发送时将其视为消息。因此,当您使用SOAP发送时,<>个字符将转换为&lt; &gt;。如果要将其转换回<>,则必须在服务器端执行此操作。您可以在发送之前更改它,但这根本不会有任何区别,因为它无论如何都会被转换 所以在另一端这样做可能是唯一的方法。

答案 1 :(得分:0)

我们修改了HTTPRIO在执行之前进行了少量修改,我们能够成功地将XML发送到服务。

procedure HTTPRIO1SoapBeforeExecute(const MethodName: string;
  SOAPRequest: TStream);
var
 StrTemp,Fheader : TStringList;
  StrBeg,StrEnd,StrParam,StrParam1  : TStringList;
  StreamTemp : TStream;
  StrLst : TStringList;
  StrLstTmp: TStringList;

begin
  StrBeg:=TStringList.Create();
  StrEnd:=TStringList.Create();
  SOAPRequest.Position := 0;
  StrTemp.LoadFromStream(SOAPRequest);
  StrBeg.Text := StringReplace(StrTemp.Text,'&lt;','<',[RfReplaceAll]);
  StrEnd.Text := StringReplace(StrBeg.Text,'&gt;','>',[RfReplaceAll]);
  SOAPRequest.Position:=0;
  SOAPRequest.Size := 0; //Clear the Stream
  StrEnd.SaveToStream(SOAPRequest); //Reinitialise the stream with right string.
  SOAPRequest.Position :=0;
end;