检查我在主机中上传的 Noip 时出错(作为 txt 文件内容)
Error to check my Noip uploaded in a host (as txt file content)
我在我的站点上传了一个 txt,这个 txt 文件的内容是我的 Noip 地址,http 请求必须查询它。
我下面的代码中的问题是,如果此文件已从站点中删除,则会生成异常,并且不可能执行函数的以下行 returns 正确的结果。
如何解决?
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
idhttp,
SysUtils;
function GetURLAsString(const aURL, bURL: string): string;
var
lHTTP: TIdHTTP;
a, b: string;
begin
lHTTP := TIdHTTP.Create(nil);
try
a := lHTTP.Get(aURL);
if lhttp.responsecode = 200 then
begin
Result := a
end
else
begin
b := lHTTP.Get(bURL);
if lHTTP.ResponseCode = 200 then
Result := b
else
Result := 'mydnsname.ddns.net';
end;
finally
lHTTP.Free;
end;
end;
begin
try
GetURLAsString('http://www.mysite01.com/conn.txt','http://www.mysite02.com/conn.txt');
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
提前致谢。
编辑
如果两个请求中的某些请求失败,GetURLAsString 的结果必须是'mydnsname.ddns.net'。否则,结果必须是我网站上传的txt文件的内容(即mydnsname.ddns.net)。
根据设计,如果 HTTP 服务器 returns 出现失败响应代码,例如 404 NOT FOUND
。
,TIdHTTP
默认会引发 EIdHTTPProtocolException
异常
有几种不同的方法可以处理此问题:
捕获异常:
function GetURLAsString(const aURL, bURL: string): string;
var
lHTTP: TIdHTTP;
begin
lHTTP := TIdHTTP.Create(nil);
try
try
Result := lHTTP.Get(aURL);
except
try
Result := lHTTP.Get(bURL);
except
Result := 'mydnsname.ddns.net';
end;
end;
finally
lHTTP.Free;
end;
end;
在 Get()
的 AIgnoreReplies
参数中传递 404,因此不会在 404 错误上引发异常,但仍会在其他错误上引发:
function GetURLAsString(const aURL, bURL: string): string;
var
lHTTP: TIdHTTP;
begin
lHTTP := TIdHTTP.Create(nil);
try
Result := lHTTP.Get(aURL, [404]);
if lHTTP.ResponseCode = 200 then Exit;
Result := lHTTP.Get(bURL, [404]);
if lHTTP.ResponseCode = 200 then Exit;
Result := 'mydnsname.ddns.net';
finally
lHTTP.Free;
end;
end;
在 HTTPOptions
属性 中启用 hoNoProtocolErrorException
标志,因此根本不会引发异常:
function GetURLAsString(const aURL, bURL: string): string;
var
lHTTP: TIdHTTP;
begin
lHTTP := TIdHTTP.Create(nil);
try
lHTTP.HTTPOptions := lHTTP.HTTPOptions + [HoNoProtocolErrorException];
Result := lHTTP.Get(aURL);
if lHTTP.ResponseCode = 200 then Exit;
Result := lHTTP.Get(bURL);
if lHTTP.ResponseCode = 200 then Exit;
Result := 'mydnsname.ddns.net';
finally
lHTTP.Free;
end;
end;
我在我的站点上传了一个 txt,这个 txt 文件的内容是我的 Noip 地址,http 请求必须查询它。
我下面的代码中的问题是,如果此文件已从站点中删除,则会生成异常,并且不可能执行函数的以下行 returns 正确的结果。
如何解决?
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
idhttp,
SysUtils;
function GetURLAsString(const aURL, bURL: string): string;
var
lHTTP: TIdHTTP;
a, b: string;
begin
lHTTP := TIdHTTP.Create(nil);
try
a := lHTTP.Get(aURL);
if lhttp.responsecode = 200 then
begin
Result := a
end
else
begin
b := lHTTP.Get(bURL);
if lHTTP.ResponseCode = 200 then
Result := b
else
Result := 'mydnsname.ddns.net';
end;
finally
lHTTP.Free;
end;
end;
begin
try
GetURLAsString('http://www.mysite01.com/conn.txt','http://www.mysite02.com/conn.txt');
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
提前致谢。
编辑
如果两个请求中的某些请求失败,GetURLAsString 的结果必须是'mydnsname.ddns.net'。否则,结果必须是我网站上传的txt文件的内容(即mydnsname.ddns.net)。
根据设计,如果 HTTP 服务器 returns 出现失败响应代码,例如 404 NOT FOUND
。
TIdHTTP
默认会引发 EIdHTTPProtocolException
异常
有几种不同的方法可以处理此问题:
捕获异常:
function GetURLAsString(const aURL, bURL: string): string; var lHTTP: TIdHTTP; begin lHTTP := TIdHTTP.Create(nil); try try Result := lHTTP.Get(aURL); except try Result := lHTTP.Get(bURL); except Result := 'mydnsname.ddns.net'; end; end; finally lHTTP.Free; end; end;
在
Get()
的AIgnoreReplies
参数中传递 404,因此不会在 404 错误上引发异常,但仍会在其他错误上引发:function GetURLAsString(const aURL, bURL: string): string; var lHTTP: TIdHTTP; begin lHTTP := TIdHTTP.Create(nil); try Result := lHTTP.Get(aURL, [404]); if lHTTP.ResponseCode = 200 then Exit; Result := lHTTP.Get(bURL, [404]); if lHTTP.ResponseCode = 200 then Exit; Result := 'mydnsname.ddns.net'; finally lHTTP.Free; end; end;
在
HTTPOptions
属性 中启用hoNoProtocolErrorException
标志,因此根本不会引发异常:function GetURLAsString(const aURL, bURL: string): string; var lHTTP: TIdHTTP; begin lHTTP := TIdHTTP.Create(nil); try lHTTP.HTTPOptions := lHTTP.HTTPOptions + [HoNoProtocolErrorException]; Result := lHTTP.Get(aURL); if lHTTP.ResponseCode = 200 then Exit; Result := lHTTP.Get(bURL); if lHTTP.ResponseCode = 200 then Exit; Result := 'mydnsname.ddns.net'; finally lHTTP.Free; end; end;