gpt4 book ai didi

delphi - 使用 IdHttp Indy 连接 SSL 时出错

转载 作者:太空宇宙 更新时间:2023-11-03 13:45:20 26 4
gpt4 key购买 nike

我在使用 Indy (Delphi) 的 IdHttp 中遇到问题。

我尝试使用 IdHttp 在 Web 服务 SOAP 中发布 XML,但不起作用。返回“使用 SSL 连接时出错。”在 Indy 的 IdSSLOpenSSL.Connect@1437 中。

我的代码很简单:

procedure TForm1.Button1Click(Sender: TObject);
var
vRequest : TStringStream;
s : String;
begin
vRequest := TStringStream.Create((Memo1.Lines.Text));
try
IdHTTP1.Host := edHost.Text;
IdHTTP1.Request.ContentLength := length(Memo1.Lines.Text);
IdHTTP1.Request.ContentType := edContentType.Text;
IdHTTP1.Request.CustomHeaders.Text := 'SOAPAction: "removed for safe"'#13#10;
IdHTTP1.request.CacheControl := 'no-cache';
IdHTTP1.Request.AcceptEncoding := edAccept.Text;
IdHTTP1.HTTPOptions := [hoKeepOrigProtocol];
IdHTTP1.ProtocolVersion := pv1_1;

Memo2.Clear;
try
s := IdHTTP1.post(Edit1.Text, vRequest);
Memo2.Lines.Text := s;
except
on e: EIdHTTPProtocolException do begin
Label1.Caption := e.Message;
MEMO2.LINES.TEXT := e.Message;
end;
on e:Exception do begin
Label1.Caption := e.Message;
MEMO2.LINES.TEXT := e.Message;
end;
end;

requestHeaders.Lines.Text := IdHTTP1.Request.RawHeaders.Text;
responseHeaders.Lines.Text := IdHTTP1.Response.RawHeaders.Text;
finally
vRequest.Free;
end;
end;

在 exe 文件夹中包含 libeay32.dll 和 ssleay32.dll。有什么建议吗?

我用的是delphi 5,但在delphi 7中也是同样的问题。

最佳答案

默认情况下,SSLVersions TIdSSLIOHandlerSockOpenSSL的属性(property)设置为仅启用 TLS 1.0 1。但许多网站开始逐步淘汰 TLS 1.0,只接受 TLS 1.1+。因此,请尝试在 SSLVersions 中启用 TLS 1.1 和 TLS 1.2。属性(property),看看它是否有帮助。

1:有一个 open ticket在 Indy 的问题跟踪器中,默认情况下还启用 TLS 1.1 和 TLS 1.2。


附带说明一下,您应该对代码进行一些进一步的调整:

  • 不要为 TIdHTTP 分配任何值的 HostContentLength特性。它们由 TIdHTTP 自动填充.

  • 如果您设置 AcceptEncoding手动属性,确保不包含 deflategzip除非你有 Compressor分配给 TIdHTTP ,否则它将无法解码压缩响应。你真的不应该给 AcceptEncoding 分配任何东西除非您准备好处理自定义编码。 Compressor Handlebars deflate/gzipTIdHTTP会更新AcceptEncoding因此,如果 Compressor已分配并可供使用。

  • 使用 CustomHeaders.Values属性设置单独的标题,而不是 CustomHeaders.Text属性(property)。

  • 你不需要 catch EIdHTTPProtocolException明确地,因为那个异常处理程序没有做任何额外的事情,而不是更通用的 Exception处理程序没有做。

  • RawHeaders属性是 TStringList后代,所以使用 Lines.Assign(RawHeaders) 效率更高而不是 Lines.Text := RawHeaders.Text .

试试这个:

procedure TForm1.Button1Click(Sender: TObject);
var
vRequest : TStringStream;
s : String;
begin
IdHTTP1.Request.ContentType := edContentType.Text;
IdHTTP1.Request.CustomHeaders.Values['SOAPAction'] := 'removed for safe';
IdHTTP1.Request.CacheControl := 'no-cache';
IdHTTP1.HTTPOptions := [hoKeepOrigProtocol];
IdHTTP1.ProtocolVersion := pv1_1;

Memo2.Clear;
try
vRequest := TStringStream.Create(Memo1.Lines.Text);
try
s := IdHTTP1.Post(Edit1.Text, vRequest);
finally
vRequest.Free;
end;
Memo2.Lines.Text := s;
except
on e: Exception do begin
Label1.Caption := e.Message;
Memo2.Lines.Text := e.Message;
end;
end;

RequestHeaders.Lines.Assign(IdHTTP1.Request.RawHeaders);
ResponseHeaders.Lines.Assign(IdHTTP1.Response.RawHeaders);
end;

关于delphi - 使用 IdHttp Indy 连接 SSL 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50856121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com