检查我在主机中上传的 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 异常

有几种不同的方法可以处理此问题:

  1. 捕获异常:

    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;
    
  2. 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;
    
  3. 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;