Здравствуйте, уважаемые форумчане. Третий день бьюсь над одной проблемой. Стоит задача получить данные о состоянии сервиса электронного правительства (консольное приложение).
Вот код:
Код:
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...."
Помогите пожалуйста... горю.
Спасибо всем, кто откликнется.