gpt4 book ai didi

delphi - HTTPS 帖子 - 我做错了什么?

转载 作者:行者123 更新时间:2023-12-03 15:34:09 25 4
gpt4 key购买 nike

我正在向网址发出请求,以通过 HTTPS 连接获取 XML 文件。但这种连接的效果只有 50%。大多数情况下它都会失败。常见错误是“套接字错误#10060”。或“使用 SSL 连接时出错。观察到 EOF 违反了协议(protocol)”。我做错了什么?

function SendRequest(parameters: string): IXMLDocument;
var
sPostData: TStringList;
sHttpSocket: TIdHTTP;
sshSocketHandler: TIdSSLIOHandlerSocketOpenSSL;
resStream: TStringStream;
xDoc: IXMLDocument;

begin
sPostData := TStringList.Create;

try
sPostData.Add('add some parameter to post' + '&');
sPostData.Add('add some parameter to post' + '&');
sPostData.Add('add some parameter to post' + '&');
sPostData.Add(parameters);

sHttpSocket := TIdHTTP.Create;
sshSocketHandler := TIdSSLIOHandlerSocketOpenSSL.Create;
sHttpSocket.IOHandler := sshSocketHandler;

sHttpSocket.Request.ContentType := 'application/x-www-form-urlencoded';
sHttpSocket.Request.Method := 'POST';

resStream := TStringStream.Create;
sHttpSocket.Post(Self.sUrl, sPostData, resStream);

xDoc := CreateXMLDoc;
xDoc.LoadFromStream(resStream);

Result := xDoc;

resStream.Free;
sHttpSocket.Free;
sshSocketHandler.Free;
sPostData.Free;
except on E: Exception do
begin
TCommon.ErrorLog('errorLog.txt', DateTimeToStr(Now) + ' ' + E.Message);
end
end;
end;

也许我可以用另一种方式做到这一点,当互联网连接可用时,效果就像 100% 一样?

问候,邪恶之人

最佳答案

“EOF”错误表明您连接的服务器实际上并未使用 SSL,或者 SSL 数据可能已损坏。

除此之外,为什么要在发布数据参数之间包含明确的“&”字符?不要这样做,Indy 只会对它们进行编码并发送自己的“&”字符。另外,请考虑使用 TMemoryStream 而不是 TStringStream,以确保 IXMLDocumect.LoadFromStream() 按原样加载服务器的原始 XML 数据,而不是 RTL/VCL 由于 Unicode 处理而生成的更改版本(TStringStream 启用了 TEncoding)。

编辑:根据您提供的 URL,调用 verifyUser() 的示例如下所示:

const
ERPLYAccountCode = '...';

function verifyUser(const user, pass: string; const sessionLength: Integer = 3600): IXMLDocument;
var
sPostData: TStringList;
sHttpSocket: TIdHTTP;
sshSocketHandler: TIdSSLIOHandlerSocketOpenSSL;
resStream: TMemoryStream;
xDoc: IXMLDocument;
begin
Result := nil;
try
resStream := TMemoryStream.Create;
try
sPostData := TStringList.Create;
try
sPostData.Add('clientCode=' + ERPLYAccountCode);
sPostData.Add('request=verifyUser');
sPostData.Add('version=1.0');
sPostData.Add('responseType=XML');
sPostData.Add('responseMode=normal');
sPostData.Add('username=' + user);
sPostData.Add('password=' + pass);
sPostData.Add('sessionLength=' + IntToStr(sessionLength));
sHttpSocket := TIdHTTP.Create;
try
sshSocketHandler := TIdSSLIOHandlerSocketOpenSSL.Create(sHttpSocket);
sHttpSocket.IOHandler := sshSocketHandler;
sHttpSocket.Request.ContentType := 'application/x-www-form-urlencoded';
sHttpSocket.Post('https://www.erply.net/api/', sPostData, resStream);
finally
sHttpSocket.Free;
end;
finally
sPostData.Free;
end;
resStream.Position := 0;
xDoc := CreateXMLDoc;
xDoc.LoadFromStream(resStream);
Result := xDoc;
finally
resStream.Free;
end;
except
on E: Exception do
begin
TCommon.ErrorLog('errorLog.txt', DateTimeToStr(Now) + ' ' + E.Message);
end;
end;
end;

关于delphi - HTTPS 帖子 - 我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4516168/

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