开发者

HTTPS post - what I'm doing wrong?

I'm making requests to the webaddress to get XML files throught the HTTPS connection. But this connection works like 50%. In most cases it fails. Usual error is "socket error #10060". Or "Error connecting with SSL. EOF was observed that violates the protocol". What I'm doing wrong?

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开发者_C百科 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;

Maybe I can do this in another way, that works like 100%, when internet connection is available?

Regards, evilone


An "EOF" error suggests you are connnecting to a server that is not actually using SSL to begin with, or the SSL data may be corrupted.

Besides that, why are you including explicit '&' characters between your post data parameters? Don't do that, Indy will just encode them and send its own '&' characters. Also, consider using TMemoryStream instead of TStringStream to ensure IXMLDocumect.LoadFromStream() is loading the server's original raw XML data as-is, and not an altered version that the RTL/VCL produces due to Unicode handling (TStringStream is TEncoding-enabled).

Edit: Given the URL you provided, an example of calling verifyUser() would look like this:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜