【问题标题】:How to use HTTPS in Delphi 10.3 with INDY如何在带有 INDY 的 Delphi 10.3 中使用 HTTPS
【发布时间】:2020-09-11 03:12:03
【问题描述】:

大家好,所有的程序员,

目前我想弄清楚如何在 Delphi 中使用 HTTPS 请求 (POST)。 我有这段代码:

uses ..., IdHTTP, IdSSLOpenSSL;

....

procedure TForm2.Button4Click(Sender: TObject);
var
  PostStrings    :TStringList;
  ResponseStream :TStringStream;
  ausgabe        :String;
  zeile          :String;
  i              :Integer;
  s              :array of string;
  Strings        :TStringList;
  Stream         :TStringStream;

begin
  Stream  := TStringStream.Create('');
  Strings := TStringList.Create;
  try
    Strings.Add('Noone='+Edit1.Text);
    Strings.Add('Foo='+Edit2.Text);

    IdHTTP1 := TIdHTTP.Create(nil);

    try
      IdHTTP1.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP1);
      IdHTTP1.HandleRedirects := True;
      idHTTP1.Post('https://api.mysitefortest.de/postit.php', Strings,stream);
      ausgabe := Stream.DataString; 
      zeile := ''; 

      for i:=1 to Length(ausgabe) do begin
        if (ausgabe[i]=#13) and (ausgabe[i+1]=#10) then begin
          ResponseMemo.Lines.Add(zeile);
          zeile:='';
        end else if s[i]<>#10 Then zeile:=zeile+ausgabe[i];
      end;
      ResponseMemo.Lines.Add(zeile);
    except 
     on E: Exception do
       showmessage('Error encountered during POST: ' + E.Message);
    end;
  finally
    Strings.Free;
    Stream.Free;
  end;
end;

php文件:

<?php
echo 'Noone: '.$zitatArray["Noone"]; 
echo Chr(13).Chr(10); 
echo 'Foo: '.$zitatArray["Foo"];

?>

如果我按下 sendpost 按钮,就会出现错误。它说,ssl.-library 无法加载。

MMhhh - 如何在 indy 中使用 ssl 似乎是个秘密。我搜索了谷歌,但我没有找到一些明确的例子。 我想我需要一个 ssl 库。但是哪一个?如何在我的 Delphi 中使用它?去哪里买?

希望有人能帮忙解释一下——也希望其他程序员能解决这个问题??

谢谢

(对不起,如果我的代码不清楚 - 我还在学习;))

【问题讨论】:

标签: delphi ssl post https


【解决方案1】:

我怀疑您可能没有安装 SSL 库。 使用 OpenSSL(此处安装https://slproweb.com/products/Win32OpenSSL.html

这是一个使用 Indy 10 使用 SSL/TLS 1.2 发布带有标头的正文的示例

设置连接

uses
      SysUtils, Classes, uTAuthToken, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack,
      IdSSL,IdSSLOpenSSL, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
      IdIntercept, IdHTTP, IdCoder, IdCoder3to4, IdCoderMIME;

var
    fIdHTTP: TIdHTTP;
    fIdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;

  fIdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  with fIdSSLIOHandlerSocketOpenSSL.SSLOptions do begin
   Method := sslvTLSv1_2;
   Mode   := sslmClient;
   SSLVersions := [sslvTLSv1_2];
  end;
  fIdHTTP := TIdHTTP.Create(nil);
  if aConnectTimeout>100 then
   fIdHTTP.ConnectTimeout := aConnectTimeout;
  if aReadTimeout>100 then
   fIdHTTP.ReadTimeout := aReadTimeout;
  fIdHTTP.IOHandler := fIdSSLIOHandlerSocketOpenSSL;
  if aProxyServer<>'' then begin
   with fIdHTTP.ProxyParams do begin
    ProxyServer := aProxyServer;
    ProxyPort   := aProxyPort;
   end;
  end;

发布带有授权标头的正文

  aResponse := '';
  aError    := '';
  aParams := TStringStream.create(aMessage);
  try
   with fIdHTTP do begin
    Request.Clear;
    Request.CustomHeaders.Clear;
    Request.CustomHeaders.Add(Format('Authorization: Bearer %s',[access_token]));
    Request.ContentType := 'application/json';
    Response.KeepAlive := False;
    aResponse := Post(aUri, aParams);
    aResponse := aResp;
   end;
  finally
   aParams.Free;
  end;

HTH

【讨论】:

  • 对我来说神奇的是:` IdHTTP1 := TIdHTTP.Create(nil);尝试 { IdHTTP1.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP1); IdHTTP1.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2]; IdHTTP1.HandleRedirects := True; } IdHTTP1.AllowCookies := True; SSL := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP1); SSL.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2]; IdHTTP1.IOHandler := SSL; `
猜你喜欢
  • 2020-08-21
  • 1970-01-01
  • 2012-10-28
  • 2014-08-21
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
相关资源
最近更新 更多