6

DelphiXEコンパイル済みプログラムとIdHTTPコンポーネントを使用して、自分のWebサイトの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 / 403Forbidden

IdHTTPコンポーネントは、次のプロパティで設定されています。

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

IEブラウザにURLを入力すると、エラーなしでファイルが返されますが、プログラムからアクセスするとエラーが発生します。任意のポインタをいただければ幸いです。.htaccessはサイトに適しています。ファイルのアクセス許可は、Webサイト0644で正しいです。

IdHTTPコンポーネントの他のプロパティを設定する必要がありますか?このコンポーネントはaboutフォームにのみあります。他に何か必要ですか。

updateinfo.txtファイルには、「18.3.5,2011/12/17」というテキストが引用符で囲まれているだけです。

ここでは、実際のプログラム名とURLの代わりに「テスト」を使用しました。

よろしくエイドリアン

4

3 に答える 3

10

IndyのGet()関数を使用すると、まったく同じ問題が発生します。

UserAgentプロパティを設定しておらず、ブラウザが大騒ぎしているためにファイルにアクセスしていないことをWebサイトが認識しているために、このエラーが発生する可能性が高くなります。

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.UserNameそのためにとRequest.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 に答える