我们设法在服务器端生成日志..当我们传递输入有宽字符串时,我们正在使用& 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,'<','<', [rfReplaceAll, rfIgnoreCase]);
xml1.Text := StringReplace(xml2.Text,'>','>', [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><AgreementSearchRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.bank.com/dox/service/v1.0.0"& gt;
& lt;Header>
& lt;PageNo>1& lt;/PageNo>
& lt;PageSize>10& lt;/PageSize>
& lt;Source>IFBD&l t;/Source>
& lt;/Header>
& lt;SearchCriteria& gt;
& lt;AgreementId& gt;5027222& lt;/AgreementId& gt;
& lt;IsOffshoreUser& gt;true</IsOffshoreUser& gt;
& lt;bankLegalEntities>
& lt;bankLegalEntity& gt;
& lt;GCRS>Search LEgal Entity</GCRS>
& lt;bankLegalEntityName>Search Legal Entity Category& lt;/bankLegalEntityName& gt;
& lt;/bankLegalEntity& gt;
& lt;/bankLegalEntities>
& lt;/SearchCriteria& gt;
& lt;/AgreementSearchRequest& gt;</searchRequest>
</parameters>
</SearchAgreements>
</SOAP-ENV:Body>
答案 0 :(得分:0)
我不确定这是否可行,但我怀疑它是你想要的。
以下不是技术说明,而是我自己对此的看法。 SOAP发送的请求已经是XML,它将发送您自己的数据。
如果您保留少于<
且大于>
个字符,则您发送的数据将被视为SOAPrequest中data
节点的子节点。<登记/>
你不希望这样,因为它的数据是你想要实现的,而不是SOAP的一部分。
你可以尝试获取soaprequest,从data
节点中提取xml作为字符串。
在该字符串上执行stringreplace并将其解析为xml。
希望这会有所帮助。
问题在于您的SOAP消息,尽管它不是 问题
如果您阅读上述内容,则不希望将xml视为子节点,而是在使用SOAP发送时将其视为消息。因此,当您使用SOAP发送时,<>
个字符将转换为< >
。如果要将其转换回<>
,则必须在服务器端执行此操作。您可以在发送之前更改它,但这根本不会有任何区别,因为它无论如何都会被转换
所以在另一端这样做可能是唯一的方法。
答案 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,'<','<',[RfReplaceAll]);
StrEnd.Text := StringReplace(StrBeg.Text,'>','>',[RfReplaceAll]);
SOAPRequest.Position:=0;
SOAPRequest.Size := 0; //Clear the Stream
StrEnd.SaveToStream(SOAPRequest); //Reinitialise the stream with right string.
SOAPRequest.Position :=0;
end;