以下代码如图所示,但没有注释掉的URL。
你能看到我的错误吗?
var
IdHTTP1: TIdHTTP;
sl: TStringList;
Src : string;
LHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
try
IdHTTP1 := TIdHTTP.Create(nil);
try
LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
try
IdHTTP1.IOHandler := LHandler;
Src := IdHTTP1.Get(TIdURI.URLEncode(
//'https://geocoding.geo.census.gov/geocoder/locations/onelineaddress?address=4600+Silver+Hill+Rd%2C+Suitland%2C+MD+20746&benchmark=9&format=json'
'https://tools.usps.com/go/ZipLookupResultsAction!input.action?resultMode=0&companyName=&address1=1600+PENNSYLVANIA+AVE+NW&address2=&city=&state=Select&urbanCode=&postalCode=&zip=20500'
));
ShowMessage(Copy(src, 1, 100));
finally
LHandler.Free;
end;
finally
IdHTTP1.Free;
end;
except
on E: Exception do
ShowMessage('e');
end;
ShowMessage('done');
end;
注释掉的URL引发了一个异常:
EIdOSSLUnderlyingCryptoError:使用SSL连接时出错。连接SSL时出错。错误:14094410:SSL例程:SSL3_READ_BYTES:sslv3警报握手失败
答案 0 :(得分:1)
您显示的两个网址已经网址编码,因此您根本不应将其传递给TIdURI.URLEncode()
,只需按原样将其传递给TIdHTTP.Get()
。话虽如此,请确保您使用的是Indy的最新版本,以便this bug fix避免对已经百分比编码的任何序列进行双重编码。
在任何情况下,您遇到的问题与URL编码无关。 SSL警报错误的原因是TIdSSLIOHandlerSocketOpenSSL
默认情况下仅启用TLS 1.0,但许多现代Web服务器正在慢慢脱离TLS 1.0,现在需要TLS 1.1+。 geocoding.geo.census.gov
无法使用低于TLS 1.2的任何内容,而tools.usps.com
仍允许使用TLS 1.0。现代Web浏览器支持TLS 1.0 +。
因此修复是在TIdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersions
属性 1 中启用TLS 1.1和TLS 1.2。
1 :我在Indy的问题跟踪器中opened a ticket默认情况下在将来的版本中启用TLS 1.1+。