Ошибка «EOF» предполагает, что вы подключаетесь к серверу, который на самом деле не использует SSL, или данные SSL могут быть повреждены.
Кроме того, почему вы включаете явные символы '&' между параметрами ваших данных? Не делайте этого, Indy просто закодирует их и отправит свои собственные символы '&'. Кроме того, рассмотрите возможность использования TMemoryStream вместо TStringStream, чтобы убедиться, что IXMLDocumect.LoadFromStream () загружает исходные необработанные данные XML сервера как есть, а не измененную версию, которую RTL / VCL создает из-за обработки Unicode (TStringStream поддерживает TEncoding).
Редактировать: Учитывая указанный вами URL, пример вызова verifyUser () будет выглядеть так:
const
ERPLYAccountCode = '...';
function verifyUser(const user, pass: string; const sessionLength: Integer = 3600): IXMLDocument;
var
sPostData: TStringList;
sHttpSocket: TIdHTTP;
sshSocketHandler: TIdSSLIOHandlerSocketOpenSSL;
resStream: TMemoryStream;
xDoc: IXMLDocument;
begin
Result := nil;
try
resStream := TMemoryStream.Create;
try
sPostData := TStringList.Create;
try
sPostData.Add('clientCode=' + ERPLYAccountCode);
sPostData.Add('request=verifyUser');
sPostData.Add('version=1.0');
sPostData.Add('responseType=XML');
sPostData.Add('responseMode=normal');
sPostData.Add('username=' + user);
sPostData.Add('password=' + pass);
sPostData.Add('sessionLength=' + IntToStr(sessionLength));
sHttpSocket := TIdHTTP.Create;
try
sshSocketHandler := TIdSSLIOHandlerSocketOpenSSL.Create(sHttpSocket);
sHttpSocket.IOHandler := sshSocketHandler;
sHttpSocket.Request.ContentType := 'application/x-www-form-urlencoded';
sHttpSocket.Post('https://www.erply.net/api/', sPostData, resStream);
finally
sHttpSocket.Free;
end;
finally
sPostData.Free;
end;
resStream.Position := 0;
xDoc := CreateXMLDoc;
xDoc.LoadFromStream(resStream);
Result := xDoc;
finally
resStream.Free;
end;
except
on E: Exception do
begin
TCommon.ErrorLog('errorLog.txt', DateTimeToStr(Now) + ' ' + E.Message);
end;
end;
end;