Как сделать запрос HTTPS POST в Delphi? - PullRequest
17 голосов
/ 19 ноября 2010

Какой самый простой способ сделать HTTPS POST-запрос в Delphi? У меня нет проблем с выполнением запросов HTTP POST, но как я могу сделать это с помощью SSL? Я погуглил и не нашел ничего, что достаточно хорошо объясняет это.

Вот код, который я пробовал:

procedure TForm1.FormCreate(Sender: TObject);
var
  responseXML:TMemoryStream;
  responseFromServer:string;
begin
  responseXML := TMemoryStream.Create;
  IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(self);
  with idSSLIOHandlerSocketOpenSSL1 do
    begin
      SSLOptions.Method := sslvSSLv2;
      SSLOptions.Mode := sslmUnassigned;
      SSLOptions.VerifyMode := [];
      SSLOptions.VerifyDepth := 0;
      host := '';
    end;

  IdHTTP1 := TIdHTTP.Create(Self);
  with IdHTTP1 do
    begin
      IOHandler := IdSSLIOHandlerSocketOpenSSL1;
      AllowCookies := True;
      ProxyParams.BasicAuthentication := False;
      ProxyParams.ProxyPort := 0;
      Request.ContentLength := -1;
      Request.ContentRangeEnd := 0;
      Request.ContentRangeStart := 0;
      Request.Accept := 'text/html, */*';
      Request.BasicAuthentication := False;
      Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
      HTTPOptions := [hoForceEncodeParams];
    end;
  responsefromserver := IdHTTP1.Post('https://.../','name1=value1&name2=value2&....');
end;

Когда я пытаюсь запустить его, я получаю следующую ошибку:

Project myProject.exe raised exception class EFOpenError with message 'Cannot open file "C:\...\Projects\Debug\Win32\name1=value1name2=value2 The system cannot find the file specified'.

Я не понимаю этого. Я отправил параметры, хотя ошибки звучат так, как будто я отправил файл.

Также я включил libeay32.dll и ssleay32.dll в мою папку myProject.exe.

Ответы [ 3 ]

3 голосов
/ 19 ноября 2010

Вы не указали свою версию Delphi или версию indy, но у меня были некоторые проблемы с Indy в комплекте с Delphi 2009 и HTTPS, и когда я получил последний источник от indy svn , проблемарешено.

2 голосов
/ 24 ноября 2013

http://chee -yang.blogspot.com / 2008/03 / с использованием-Инди-HTTPS-клиент-consume.html

var S: TStringList;
   M: TStream;
begin
 S := TStringList.Create;
 M := TMemoryStream.Create;
 try
   S.Values['Email'] := 'your google account';
   S.Values['Passwd'] := 'your password';
   S.Values['source'] := 'estream-sqloffice-1.1.1.1';
   S.Values['service'] := 'cl';

   IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
   IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
   IdHTTP1.Post('https://www.google.com/accounts/ClientLogin', S, M);
   Memo1.Lines.Add(Format('Response Code: %d', [IdHTTP1.ResponseCode]));
   Memo1.Lines.Add(Format('Response Text: %s', [IdHTTP1.ResponseText]));

   M.Position := 0;
   S.LoadFromStream(M);
   Memo1.Lines.AddStrings(S);
 finally
   S.Free;
   M.Free;
 end;

конец;

0 голосов
/ 19 ноября 2010

Другой альтернативой Indy является Synapse .

Эта библиотека классов предлагает полный контроль над публикацией, но также предлагает простой метод публикации с одним вкладышем:

function HttpPostURL(const URL, URLData: string; const Data: TStream): Boolean;
...