Une erreur « EOF » vous suggère êtes connnecting à un serveur qui n'utilise pas réellement SSL pour commencer, ou les données SSL peuvent être endommagées.
De plus, pourquoi incluez-vous explicitement des caractères '&' entre vos paramètres de données? Ne faites pas cela, Indy va juste les encoder et envoyer ses propres caractères '&'. En outre, pensez à utiliser TMemoryStream au lieu de TStringStream pour vous assurer que IXMLDocumect.LoadFromStream() charge les données XML brutes originales du serveur telles quelles et non une version modifiée produite par RTL/VCL en raison de la gestion Unicode (TStringStream est activé pour TEncoding).
Edit: Étant donné l'URL que vous avez fourni, un exemple d'appel verifyUser() ressemblerait à ceci:
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;
Quel âge est votre version de Indy? Si c'est celui qui est livré avec Delphi, procurez-vous les dernières nouvelles de SVN. Quel âge a votre bibliothèque OpenSSL? Est-ce v0.9.x ou 1.x.x? – shunty
Je ne sais pas exactement. Cela est venu avec Delphi XE. OpenSSL library est la version 1.0.0.3 – evilone
que pensez-vous de StreamSec et SecureBridge? Cette connexion HTTP est importante pour mon application. Donc, c'est mieux que pas de DLL externe ici - seulement du code natif. – evilone