|
#1
|
|||
|
|||
И снова Indy
Здравствуйте, уважаемые форумчане. Третий день бьюсь над одной проблемой. Стоит задача получить данные о состоянии сервиса электронного правительства (консольное приложение).
Вот код: Код:
program Project2; //{$APPTYPE CONSOLE} uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdHTTP, StdCtrls, xmldom, XMLIntf, msxmldom, XMLDoc; type soaper = class private XMLDocument1: TXMLDocument; XMLString : AnsiString; lService : AnsiString; ResponseStream: TMemoryStream; InputStringList : TStringList; RootNode: IXMLNode; public furl:string; fileIN:AnsiString; constructor Create; function servicestate():string; end; constructor soaper.Create; begin furl:=''; fileIN:=''; end; function soaper.servicestate ():string; var IdHTTP1: TIdHTTP; SSL: TIdSSLIOHandlerSocketOpenSSL; strok:string; begin IdHTTP1 := TIdHTTP.Create(nil); idhttp1.HTTPOptions:=[]; SSL := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP1); ResponseStream := TMemoryStream.Create; InputStringList := TStringList.Create; IdHttp1.IOHandler:=SSL; XMLString := fileIN; lService := 'imessage_send'; InputStringList.Add(XMLString); try IdHttp1.Request.Accept := '*/*'; IdHttp1.Request.ContentType := 'text/XML'; IdHTTP1.Post(furl, InputStringList, ResponseStream); responsestream.SaveToFile('d:\1_adv.xml'); //Dlya proverki finally XMLDocument1.LoadFromStream(responsestream); XMLDocument1.Active := true; RootNode := XMLDocument1.DocumentElement; strok:=RootNode.ChildNodes['SOAP-ENV:Body'].ChildNodes[0].ChildNodes[0].ChildNodes[5].ChildNodes[1].ChildNodes[0].text+ ' '+RootNode.ChildNodes['SOAP-ENV:Body'].ChildNodes[0].ChildNodes[0].ChildNodes[0].ChildNodes[1].ChildNodes[0].text+ ' ñîñòîÿíèå ñåðâèñà '+RootNode.ChildNodes['SOAP-ENV:Body'].ChildNodes[0].ChildNodes[0].ChildNodes[7].ChildNodes[1].ChildNodes[0].text+ ' '+RootNode.ChildNodes['SOAP-ENV:Body'].ChildNodes[0].ChildNodes[0].ChildNodes[4].ChildNodes[1].ChildNodes[0].text; ResponseStream.Free; InputStringList.Free; end; idhttp1.Free; result:=strok; end; Function GetFile(const FileName : AnsiString) : AnsiString; Var F : File; FSize : Longint; begin Result:=''; if not FileExists(FileName) then Exit; FileMode:=0; AssignFile ( F, FileName); Reset(F, 1); FSize:=FileSize(F); SetLength(Result,FSize); BlockRead(F, Result[1],FSize); CloseFile(F); FileMode:=2; end; var cl:soaper; t:string; begin cl:=soaper.Create; cl.fileIN:= GetFile('servst1.xml'); cl.furl:='https://sc-int.minsvyaz.ru/sd/soap'; t:=cl.servicestate(); showmessage(t); end. Самое интересное в том, что в файле d:\1_adv.xml я вижу ответ от сервиса. Все верно. Однако при парсинге кода заметил, что прога вылетает после Код:
XMLDocument1.LoadFromStream(responsestream); Со стандартной ошибкой "Accsess violation at address...." Помогите пожалуйста... горю. Спасибо всем, кто откликнется. |
#2
|
||||
|
||||
Попробуйте перед
Код:
XMLDocument1.LoadFromStream(responsestream); Код:
responsestream.Position := 0; Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |