gpt4 book ai didi

delphi - 调试 SOAP 传输

转载 作者:行者123 更新时间:2023-12-03 15:09:30 27 4
gpt4 key购买 nike

我正在尝试使用 Delphi 2010 和 Indy 对 Web 服务进行概念验证。我此时的代码是:

procedure TForm1.Log(const sEvent, sMsg: String);
const sPrior: String = '';
begin
if sEvent <> sPrior then begin
mTraffic.Lines.Append('');
mTraffic.Lines.Append(Format('%s: %s', [sEvent, FormatDateTime('mm/dd/yyyy hh:nn:ss.zzz', Now)]));
mTraffic.Lines.Append('--------------------------------------------------------------------------------');
sPrior := sEvent;
end;
mTraffic.Lines.Append(sMsg);
Application.ProcessMessages;
end;

function TForm1.BuildRequest: String;
const MINPERDAY = 1440;
var slRequest: TStringList;
sFileName: String;
sID: String;
sGUID: String;
oDoc: TNativeXML;
oNode: TXmlNode;
uNow: _SystemTime;
dtNow: TDateTime;
sNow: String;
sNonce: String;
oIdmd5: TIdHashMessageDigest5;
begin
sFileName := 'Send.xml';
slRequest := TStringList.Create;
oIdmd5 := TIdHashMessageDigest5.Create;
oDoc := TNativeXML.Create;
try
oDoc.LoadFromFile(sFileName);
SetAttrib(oDoc, 'inputMessage', 'utc', FormatDateTime('m/d/yyyy hh:mm:ss am/pm', Now));
sGUID := 'urn:uuid' + MyCreateUUID;
SetAttrib(oDoc, 'inputMessage', 'messageId', sGUID);
SetNode(oDoc, 'wsa:messageId', sGUID);
Windows.GetSystemTime(uNow);
dtNow := SysUtils.SystemTimeToDateTime(uNow);
sNow := FormatDateTime('yyyy-mm-dd"T"hh:mm:ss"Z"', dtNow);
sNonce := oIdmd5.HashStringAsHex(sNow + 'Jack' + 'Test' + 'Salt');
SetNodes(oDoc, 'wsu:Created', FormatDateTime('yyyy-mm-dd"T"hh:mm:ss"Z"', dtNow));
SetNode(oDoc, 'wsu:Expires', FormatDateTime('yyyy-mm-dd"T"hh:mm:ss"Z"', dtNow + 5 /MINPERDAY));
SetNode(oDoc, 'wsse:Nonce', sNonce);
SetNode(oDoc, 'ElectronicPostmark', FormatDateTime('yyyy-mm-dd"T"hh:mm:ss.zz-8.00', dtNow));
SetNode(oDoc, 'wsse:Username', '#MyUserName#');
SetNode(oDoc, 'wsse:Password', '#MyPassword#');
oDoc.XmlFormat := xfReadable;
Result := oDoc.WriteToString;
finally
slRequest.Free;
oIdmd5.Free;
oDoc.Free;
end;

end;

function TForm1.SSLPost(const url: String; sRequest: String): String;
var lHTTP: TIdHTTP;
lIOHandler: TIdSSLIOHandlerSocketOpenSSL;
lIDLogDebug: TIdLogDebug;
ss: TStringStream;
begin
lHTTP := TIdHTTP.Create(nil);
lIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
lIDLogDebug := TIdLogDebug.Create(nil);
ss := TStringStream.Create;
try
ss.WriteString(sRequest);
ss.Position := 0;
lIOHandler.SSLOptions.Method := sslvSSLv3;
lIOHandler.OnStatusInfo := IdSSLIOHandlerSocketOpenSSL1StatusInfo;
lHTTP.IOHandler := lIOHandler;
lIdLogDebug.OnSend := IdLogDebug1Send;
lIDLogDebug.OnReceive := IdLogDebug1Receive;
lIDLogDebug.Active := True;
lHTTP.Intercept := lIdLogDebug;
try
lHTTP.Request.CustomHeaders.Add('SOAPAction: "http://edd.ca.gov/SendTransmission"');
Result := lHTTP.Post(url, ss);
except
On e: Exception do begin
Result := e.Message + #13#10 + '**No Response**';
end;
end;
finally
lHTTP.Free;
lIOHandler.Free;
lIdLogDebug.Free;
ss.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var sResponse: String;
begin
sResponse := SSLPost('https://FSETTESTPROD.EDD.CA.GOV', BuildRequest);
Log('Response', sResponse);
end;

注意:我对 POST 之前的这一行特别不确定

lHTTP.Request.CustomHeaders.Add('SOAPAction: "http://edd.ca.gov/SendTransmission"'); 

根据 Web 服务文档,我应该收到 ACK1 成功或 ACK1 错误并附有解释。这是我此时得到的结果:

    SSL: 02/28/2012 16:33:55.609
--------------------------------------------------------------------------------
SSL status: "before/connect initialization"
SSL status: "before/connect initialization"
SSL status: "SSLv3 write client hello A"
SSL status: "SSLv3 read server hello A"
SSL status: "SSLv3 read server certificate A"
SSL status: "SSLv3 read server done A"
SSL status: "SSLv3 write client key exchange A"
SSL status: "SSLv3 write change cipher spec A"
SSL status: "SSLv3 write finished A"
SSL status: "SSLv3 flush data"
SSL status: "SSLv3 read finished A"
SSL status: "SSL negotiation finished successfully"
SSL status: "SSL negotiation finished successfully"
Cipher: name = RC4-MD5; description = RC4-MD5 SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=MD5
; bits = 128; version = TLSv1/SSLv3;

Send: 02/28/2012 16:33:55.859
--------------------------------------------------------------------------------
POST / HTTP/1.0
Content-Length: 3130
SOAPAction: "http://edd.ca.gov/SendTransmission"
Host: FSETTESTPROD.EDD.CA.GOV
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: identity
User-Agent: Mozilla/3.0 (compatible; Indy Library)


<?xml version="1.0" encoding="utf-8"?>
<log>
<inputMessage utc="2/28/2012 04:32:28 pm" messageId="urn:uuid{4A995507-9E23-49C3-A17C-19C30693C6C1}">
<processingStep description="Unprocessed message">
<soap:Envelope xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<soap:Header>
<wsa:Action>http://edd.ca.gov/Sendtransmission</wsa:Action>
<wsa:MessageID>urn:uuid{4A995507-9E23-49C3-A17C-19C30693C6C1}</wsa:MessageID>
<wsa:ReplyTo>
<wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
</wsa:ReplyTo>
<wsa:To>http://localhost:3031/EDD.DMRC.FSET.WebServices/FsetService.asmx</wsa:To>
<wsse:Security soap:mustUnderstand="1">
<wsu:Timestamp wsu:Id="Timestamp-db31b09e-9283-4ff1-9a57-5b97971328d4">
<wsu:Created>2012-02-29T00:32:28Z</wsu:Created>
<wsu:Expires>2012-02-29T00:37:28Z</wsu:Expires>
</wsu:Timestamp>
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-0ac2cf06-b8da-46c8-9314-8081144b09d5">
<wsse:Username>#MyUserName#</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">#MyPassword#</wsse:Password>
<wsse:Nonce>0D78327F3F671183149EEC5907A6A5F6</wsse:Nonce>
<wsu:Created>2012-02-29T00:32:28Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soap:Header>
<soap:Body>
<SendTransmission xmlns="http://edd.ca.gov/">
<SendTransmissionRequest xmlns="http://www.irs.gov/a2a/mef/MeFTransmitterServiceWse.xsd">
<transmissionDataList>
<Count>1</Count>
<transmissionData>
<transmissionId>123456789</transmissionId>
<ElectronicPostmark>2012-02-29T00:32:28.750-8.00</ElectronicPostmark>
</transmissionData>
</transmissionDataList>
</SendTransmissionRequest>
<fileBytes>UEsDBBQAAAAIAAaJUzYwks2W0QYAAD2IAAALAAAAREU2</fileBytes>
</SendTransmission>
</soap:Body>
</soap:Envelope>
</processingStep>
</inputMessage>
</log>

Receive: 02/28/2012 16:33:56.234
--------------------------------------------------------------------------------
HTTP/1.1 200 OK
Connection: close
Date: Wed, 29 Feb 2012 00:33:51 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Content-Length: 195
Content-Type: text/html
Set-Cookie: ASPSESSIONIDCQSQQDSS=BPLHDJLCKCLDKBDMLBNJOMHP; path=/
Cache-control: private

<html>
<head>
<title>This location has been marked as available</title>
</head>
<body>
<h1>AVAILABLE</h1>
This IP address has been assigned to EDD FSET User Test web site.
</body>
</html>

Response: 02/28/2012 16:33:56.281
--------------------------------------------------------------------------------
<html>
<head>
<title>This location has been marked as available</title>
</head>
<body>
<h1>AVAILABLE</h1>
This IP address has been assigned to EDD FSET User Test web site.
</body>
</html>

我已通过电话和电子邮件与维护网络服务的机构(加州 EDD)联系。他们有动力让尽可能多的人采用这项技术并减少他们必须处理的纸张数量,但他们对该系统没有深入的了解,因为它是由外部供应商创建的。

我下载了 SOAPUI,以尝试更好地理解该服务并消除因我的实现和可能误用 Indy 库而可能导致的任何错误。我不确定如何使用 SOAPUI 来实现此目的。这些说明似乎没有解决我的情况。如果我将 WSDL 加载到程序中并尝试测试其中一个功能,我得到的结果是测试已完成,状态为 [FINISHED],但我不知道该怎么办。

如果对我的小问题有任何帮助,我将不胜感激。

最佳答案

SoapUI 是要走的路,看看事情应该如何运作。使用 RIO.OnBeforeExecute 和 AfterExecute 事件检查您正在发送和接收的 XML。将它们与 SoapUI 发送和接收的内容进行比较。忽略命名空间中的差异,这应该不重要。理想情况下,您应该能够获取来自 OnBeforeExecute 事件的 XML(将流保存到文本文件或日志),粘贴到 SoapUI 中(右键单击以在 SoapUI 中进行清理/重新格式化)并查看 XML 是否很有道理,看看提交后会发生什么。

如果结果表明您的 XML 已接近工作,但需要“调整”,则可以使用 StringReplace 等在 OnBeforeExecute 事件中编辑 XML,并“修复”XML 使其工作。

关于delphi - 调试 SOAP 传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9504572/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com