IdHTTP.get возвращает HTTP1.1 / 403 Запрещено - PullRequest
4 голосов
/ 17 декабря 2011

Я пытаюсь получить доступ к файлу update.txt на моем веб-сайте, используя скомпилированную программу DelphiXE и компонент IdHTTP.

Код, который я использую, выглядит следующим образом:

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)

Если я ввожу URL-адрес в браузере IE, он возвращает файл без ошибок, но при доступе из моей программы я получаю сообщение об ошибке. Любые указатели будут оценены. .htaccess подходит для сайта. Разрешения для файла правильные на сайте: 0644.

Нужно ли устанавливать какие-либо другие свойства для компонента IdHTTP. У меня есть только этот компонент о форме. Нужно ли что-нибудь еще.

Файл updateinfo.txt просто содержит текст в кавычках: "18.3.5,2011 / 12/17"

Я просто использовал здесь «test» вместо моего фактического названия программы и URL.

С уважением Адриан

Ответы [ 3 ]

7 голосов
/ 08 апреля 2014

Я сталкиваюсь с точно такой же проблемой при использовании функции Get () в Indy.

Более чем вероятно, что вы получаете эту ошибку, потому что вы не установили свойство 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

6 голосов
/ 17 декабря 2011

403 означает, что у вас нет разрешения на доступ к запрошенному URL.Сервер, вероятно, требует от вас ввести имя пользователя / пароль, особенно если вы используете файл .htaccess.Для этого используйте свойства Request.UserName и Request.Password.Что касается того, почему браузер не запрашивает имя пользователя / пароль, я предполагаю, что браузер кэшировал их с более раннего доступа.Вы создаете новый TIdHTTP объект, но не освобождаете его.

0 голосов
/ 30 июня 2015

Ответы, данные мне, не работали, пока я не собрал их все вместе.

//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);
...