使用 IdHttp Indy 连接 SSL 时出错
Error connecting with SSL using IdHttp Indy
我在使用 Indy 的 IdHttp 中遇到问题 (Delphi)。
我尝试在 Web 服务 SOAP 中使用 IdHttp post XML,但没有用。 Return "Error connecting with 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。有什么建议吗?
我用的是delphi5,但是在delphi7也是同样的问题。
默认情况下,TIdSSLIOHandlerSockOpenSSL
的 SSLVersions
属性 设置为仅启用 TLS 1.0 1。但许多网站开始逐步淘汰 TLS 1.0,只接受 TLS 1.1+。因此,请尝试在 SSLVersions
属性 中启用 TLS 1.1 和 TLS 1.2,看看是否有帮助。
1:在 Indy 的问题跟踪器中有一个 open ticket 也默认启用 TLS 1.1 和 TLS 1.2。
附带说明一下,您应该对代码进行一些进一步的调整:
不要为 TIdHTTP
的 Host
或 ContentLength
属性分配任何值。它们由 TIdHTTP
.
自动填充
如果您手动设置 AcceptEncoding
属性,请确保不要包含 deflate
或 gzip
,除非您有 Compressor
分配给 TIdHTTP
,否则将无法解码压缩响应。除非您准备好处理自定义编码,否则您真的不应该为 AcceptEncoding
分配任何内容。 Compressor
句柄 deflate
/gzip
和 TIdHTTP
将相应地更新 AcceptEncoding
如果 Compressor
已分配并准备好使用。
使用CustomHeaders.Values
属性设置个人headers,而不是CustomHeaders.Text
属性.
您不需要显式捕获 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;
我在使用 Indy 的 IdHttp 中遇到问题 (Delphi)。
我尝试在 Web 服务 SOAP 中使用 IdHttp post XML,但没有用。 Return "Error connecting with 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。有什么建议吗?
我用的是delphi5,但是在delphi7也是同样的问题。
默认情况下,TIdSSLIOHandlerSockOpenSSL
的 SSLVersions
属性 设置为仅启用 TLS 1.0 1。但许多网站开始逐步淘汰 TLS 1.0,只接受 TLS 1.1+。因此,请尝试在 SSLVersions
属性 中启用 TLS 1.1 和 TLS 1.2,看看是否有帮助。
1:在 Indy 的问题跟踪器中有一个 open ticket 也默认启用 TLS 1.1 和 TLS 1.2。
附带说明一下,您应该对代码进行一些进一步的调整:
不要为
TIdHTTP
的Host
或ContentLength
属性分配任何值。它们由TIdHTTP
. 自动填充
如果您手动设置
AcceptEncoding
属性,请确保不要包含deflate
或gzip
,除非您有Compressor
分配给TIdHTTP
,否则将无法解码压缩响应。除非您准备好处理自定义编码,否则您真的不应该为AcceptEncoding
分配任何内容。Compressor
句柄deflate
/gzip
和TIdHTTP
将相应地更新AcceptEncoding
如果Compressor
已分配并准备好使用。使用
CustomHeaders.Values
属性设置个人headers,而不是CustomHeaders.Text
属性.您不需要显式捕获
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;