2010-12-23 101 views
4

我正在向Web地址發送請求,以通過HTTPS連接獲取XML文件。但是這種連接的工作原理是50%。在大多數情況下,它失敗。常見的錯誤是「套接字錯誤#10060」。或者「連接SSL出錯,觀察到EOF違反協議」。我做錯了什麼?HTTPS後 - 我做錯了什麼?

function SendRequest(parameters: string): IXMLDocument; 
var 
    sPostData: TStringList; 
    sHttpSocket: TIdHTTP; 
    sshSocketHandler: TIdSSLIOHandlerSocketOpenSSL; 
    resStream: TStringStream; 
    xDoc: IXMLDocument; 

    begin 
     sPostData := TStringList.Create; 

     try 
     sPostData.Add('add some parameter to post' + '&'); 
     sPostData.Add('add some parameter to post' + '&'); 
     sPostData.Add('add some parameter to post' + '&'); 
     sPostData.Add(parameters); 

     sHttpSocket := TIdHTTP.Create; 
     sshSocketHandler := TIdSSLIOHandlerSocketOpenSSL.Create; 
     sHttpSocket.IOHandler := sshSocketHandler; 

     sHttpSocket.Request.ContentType := 'application/x-www-form-urlencoded'; 
     sHttpSocket.Request.Method := 'POST'; 

     resStream := TStringStream.Create; 
     sHttpSocket.Post(Self.sUrl, sPostData, resStream); 

     xDoc := CreateXMLDoc; 
     xDoc.LoadFromStream(resStream); 

     Result := xDoc; 

     resStream.Free; 
     sHttpSocket.Free; 
     sshSocketHandler.Free; 
     sPostData.Free; 
     except on E: Exception do 
     begin 
     TCommon.ErrorLog('errorLog.txt', DateTimeToStr(Now) + ' ' + E.Message); 
     end 
     end; 
    end; 

也許我可以用另一種方式做到這一點,當互聯網連接可用時,它可以像100%一樣工作?

問候, evilone

+0

幾歲的印版?如果是Delphi的,那麼從SVN獲取最新版本。你的OpenSSL庫有多大?它是v0.9.x還是1.x.x? – shunty 2010-12-23 08:11:26

+0

我不完全清楚。隨着Delphi XE的出現。 OpenSSL庫的版本是1.0.0.3 – evilone 2010-12-23 08:34:09

回答

2

的「EOF」的錯誤提示你連接需到未實際使用SSL來開始與服務器,或者SSL數據可能會被破壞。

除此之外,爲什麼在您的發佈數據參數之間包含明確的'&'字符?不要那樣做,Indy將會編碼它們併發送它自己的'&'字符。另外,考慮使用TMemoryStream而不是TStringStream來確保IXMLDocumect.LoadFromStream()正在加載服務器的原始XML數據,而不是由於Unicode處理(TStringStream啓用了TEncoding)而導致的RTL/VCL生成的更改版本。

編輯:給你提供)的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;