6

我正在尝试使用 DelphiXE 编译程序和 IdHTTP 组件访问我网站上的 update.txt 文件。

我正在使用的代码如下:

procedure TFormAbout.SpeedButtonUpdateClick(Sender: TObject);

function CheckUpdates: String;
var lIdHttp: TIdHTTP;
begin
  lIdHttp := TIdHTTP.Create(nil);
  result := lIdHttp.Get('http://www.test.com/test_down_load/update.txt');
end;

var
sWebVersion: String;
sVersionList: TStringList;

begin
try
  sWebVersion := Checkupdates;
except
  on E: Exception do
  begin 
    ShowMEssage(E.ErrorMessage);
    MessageDlg('An Error occured checking for an update.',mtError,[mbOK],0);
  end;
end;
if sWebVersion <> '' then
  begin
    sVersionList.CommaText := sWebVersion;
    ShowMessage('Version: ' + sVersionList[0] + ' - ' + 'Date: ' + sVersionList[1]);
  end;
end;

然而,这会导致错误:HTTP1.1/ 403 Forbidden

IdHTTP 组件已设置有以下属性。

HandleRedirects := true;
HTTPOptions [hoForceEncodeParams];
ProtocolVersion := pv1_1;
Request.UserAgent := Mozilla/5.0 (compatible; Test)

如果我在 IE 浏览器中输入 URL,它会返回没有错误的文件,但是从我的程序访问时,我会收到错误消息。任何指针将不胜感激。.htaccess 对于该站点是正确的。该文件的权限在网站上是正确的:0644。

我是否必须为 IdHTTP 组件设置任何其他属性。我在 about 表单上只有这个组件。我还需要什么吗。

updateinfo.txt 文件只包含引号中的文本:“18.3.5,2011/12/17”

我在这里简单地使用了“测试”来代替我的实际程序名称和 URL。

问候阿德里安

4

3 回答 3

10

我在使用 Indy 的 Get() 函数时遇到了完全相同的问题。

您很可能会收到此错误,因为您没有设置 UserAgent 属性,并且网站知道您没有访问该文件,因为浏览器正在大惊小怪。

function CheckUpdates: String;
var lIdHttp: TIdHTTP;
begin
  lIdHttp := TIdHTTP.Create(nil);
  //avoid getting '403 Forbidden' by setting UserAgent
  lIdHttp.Request.UserAgent :=
      'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
  result := lIdHttp.Get('http://www.test.com/test_down_load/update.txt');
end;

类似的问题,但在这里记录了正确的答案: https ://stackoverflow.com/questions/10870730/why-do-i-get-403-forbidden-when-i-connect-to-whatismyip-com

于 2014-04-07T22:45:58.550 回答
6

403 表示您无权访问请求的 URL。服务器可能要求您提供用户名/密码,特别是因为您使用的是 .htaccess 文件。为此使用Request.UserNameandRequest.Password属性。至于为什么浏览器不要求输入用户名/密码,我的猜测是浏览器将它们从较早的访问中缓存起来。

顺便说一句,你SpeedButtonUpdateClick()有内存泄漏。您正在创建一个新TIdHTTP对象,但您没有释放它。

于 2011-12-17T17:18:53.197 回答
-1

在我将所有答案放在一起之前,给出的答案对我不起作用。

//add Request.Username and supply the correct mysql username
tidHttpObject.Request.Username := 'username';

//do the same for the password
tidHttpObject.Request.Password := 'password';

//then add a UserAgent property with the string below
tidHttpObject.Request.UserAgent :=  'Mozilla/5.0 (Windows NT 6.1; WOW64;
rv:12.0) Gecko/20100101 Firefox/12.0';

//finally call the get() url method of the tidHttp object
Result :=  tidHttpObject.Get(url);
于 2015-06-30T13:25:47.017 回答