delphi – 调试SOAP传输
发布时间:2020-12-15 09:29:39 所属栏目:大数据 来源:网络整理
导读:我正在尝试使用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:
我正在尝试使用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,'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',dtNow + 5 /MINPERDAY)); SetNode(oDoc,'wsse:Nonce',sNonce); SetNode(oDoc,'ElectronicPostmark',FormatDateTime('yyyy-mm-dd"T"hh:mm:ss.zz-8.00','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以使其正常工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |