【问题标题】:HTTPS post not workingHTTPS 帖子不起作用
【发布时间】:2018-12-15 03:17:44
【问题描述】:

我正在使用此代码向 azurewebsites 发布 HTTPS 帖子。 http://MYAPP.azurewebsites.net/api/MYFUNC

我目前正在使用此代码:

procedure TForm1.OriginalTest();
var
  lHTTP: TIdHTTP;
  HTTPResult: string;
  RequestBody: TStream;
  URL: String;
  Body: string;
  IOHandler: TIdSSLIOHandlerSocketOpenSSL;

begin
  lHTTP := TIdHTTP.Create;
  try
    Body := '{}';
    RequestBody := TStringStream.Create(Body, TEncoding.UTF8);
    lHTTP.Request.Accept := '';
    lHTTP.Request.UserAgent := '';

    lHTTP.Request.CustomHeaders.Add('x-functions-key:<your api key>');
    lHTTP.ConnectTimeout := 24000;
    lHTTP.ReadTimeout := 24000;
    IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    IOHandler.SSLOptions.Method := sslvTLSv1_2;

    lHTTP.IOHandler := IOHandler;
    try
      URL := 'https://<yourapp>.azurewebsites.net/api/<funcname>';

      HTTPResult := lHTTP.Post(url, RequestBody);

      Memo1.Lines.Add(HTTPResult);
    except
      on E:Exception do
      begin
        Memo1.Lines.Add(Format('Error sending data. Error: %s', [E.Message] ));
      end;
    end;
  finally
    lHTTP.Free;
    RequestBody.Free;
  end;
end;

无论出于何种原因,这段代码给了我以下错误:

发送数据时出错。错误:Socket Error #10054 Connection reset by peer。

我尝试使用 .NET 和 HttpWebRequest 制作一个简单的 HTTPS Post,它工作正常。我在这里做错了什么?

【问题讨论】:

  • 您是否尝试过其他 HTTP 客户端,例如 curl
  • 该错误意味着服务器正在终止连接。它可能不喜欢您的 SSL/TLS 握手或 HTTP 请求中的某些内容。您是否严格要求仅使用 TLS 1.2?您是否尝试过启用 TLS 1.0 和 TLS 1.1?你为什么要清除UserAgent?为什么不指定ContentType?此外,您正在泄漏IOHandler 对象,因为您没有在其上调用Free(),或为其分配Owner
  • @mjn 是的,就像我写的那样,我尝试用 .NET 和 C# 编写一个简单的应用程序,它在那里运行良好。我还下载了另一个 HTTP 客户端 - 也可以在那里工作。这个问题只发生在我的 Delphi 代码中。我尝试了所有不同的 TLS 版本,但似乎都没有。我试过设置内容类型和用户代理。我将它们留空的原因是因为当我在 C# 代码中将它们留空时它可以工作。我也确实更改了代码,因此我为 IOHandler 分配了一个所有者并释放了该对象,没有任何区别。那只是一些测试代码,我正在尝试各种不同的代码。
  • @Yako "Connection Refused" 发生在 TCP 层,而不是 HTTP 层。这意味着 1) 客户端尝试连接到未侦听连接的 IP:Port,2) IP:Port 正在侦听但有太多未决连接,或 3) IP:Port 被防火墙阻止/路由器、防病毒软件等。很可能,您的应用程序未连接到其他应用程序连接到的同一 IP:端口。使用 Wireshark 进行验证。

标签: delphi ssl post https indy


【解决方案1】:

我只是放弃并改用 WinApi.WinInet。

【讨论】:

  • 如果 WinInet 可以工作,那么TIdHTTP 也没有理由不能工作。
猜你喜欢
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多