Ответ 1
Вы не указали свою версию Delphi или версию indy, но раньше у меня были проблемы с подключенным Indy с Delphi 2009 и HTTPS, и когда я получил последний источник из indy svn, проблема решена.
Каков самый простой способ сделать запрос POST HTTPS в Delphi? У меня нет проблем с выполнением HTTP POST-запросов, но как я могу это сделать с помощью SSL? Я googled вокруг и не нашел ничего, что объясняет это достаточно хорошо.
Вот код, который я пробовал:
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.
Вы не указали свою версию Delphi или версию indy, но раньше у меня были проблемы с подключенным Indy с Delphi 2009 и HTTPS, и когда я получил последний источник из indy svn, проблема решена.
Другой альтернативой Indy является Synapse.
Эта библиотека классов предлагает полный контроль над сообщением, но также предлагает простой метод почтового сообщения:
function HttpPostURL(const URL, URLData: string; const Data: TStream): Boolean;
http://chee-yang.blogspot.com/2008/03/using-indy-https-client-to-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;
конец;
Если вы хотите попробовать что-то другое, кроме Indy, вы можете искать код на основе WinInet, там доступно много онлайн. Здесь просто: http://www.explainth.at/en/delphi/winwrap.shtml
Вот пример из более крупного коммерческого пакета: http://www.clevercomponents.com/articles/article009/httppost.asp
Или просто используйте то, что на StackOverflow: Как отправить запрос HTTP POST в Delphi с помощью WinInet api