2010-12-23 3 views
4

Je demande à l'adresse Web d'obtenir des fichiers XML via la connexion HTTPS. Mais cette connexion fonctionne comme 50%. Dans la plupart des cas, cela échoue. L'erreur habituelle est "erreur de socket # 10060". Ou "Erreur lors de la connexion avec SSL: EOF a été observé qui viole le protocole". Qu'est-ce que je fais mal? Peut-être que je peux le faire d'une autre manière, cela fonctionne comme 100%, quand la connexion Internet est disponible?HTTPS post - ce que je fais mal?

Cordialement, evilone

+0

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

+0

Je ne sais pas exactement. Cela est venu avec Delphi XE. OpenSSL library est la version 1.0.0.3 – evilone

+0

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

Répondre

2

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; 
+0

L'URL actuelle est https://www.erply.net/api/. Cette méthode de demande envoyer les paramètres request = verifyUser, clientCode = eng, nom d'utilisateur = demo, mot de passe = demouser, responseType = XML et version = 1.0 Mais j'utilise également d'autres méthodes. GetProducts(), GetEmployees() et ainsi de suite. Mais ils utilisent tous cette méthode SendRequest(). Vous pouvez voir cette référence de l'API ici http://www.inventoryapi.com/?id=347&page=getting-started#sending_request – evilone

+1

J'ai marqué cela comme une réponse, mais je n'ai pas encore obtenu de réponse totale. Mais c'est une meilleure réponse à cent pour cent que celle d'Eugène. – evilone

+0

Ce n'est pas une réponse du tout - la connexion échoue 50% des fois, et vous ne dites rien de plus que "n'utilise pas SSL pour commencer, ou les données SSL peuvent être corrompues", ce qui n'a aucun sens dans la question . De toute évidence, le problème est dans OpenSSL. –

Questions connexes