Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2017, 19:46   #1
brownb
Форумчанин
 
Регистрация: 16.10.2016
Сообщений: 156
По умолчанию Idhtpp \ 200 ok - проверить в цикле на доступность список сайтов

Пытаюсь сделать проверку сайта на доступность,вроде разобрался как быть с ошибками(и кидать юрл в бад)
Код:
var i: Integer;
url, siteName: String;
begin
try
for i:=0 to Memo1.Lines.Count-1 do
 url := IdHTTP1.Get(Memo1.Lines[i]);
except on e : EIDHttpProtocolException do
   Begin
     if e.ErrorCode = 302 then
       begin
         try
           // получаем новый адрес - адрес перенаправления
           Memo3.lines.add(idhttp1.Get(IdHTTP1.Response.Location));
         except on e:Exception do
    // предусматриваем, что исключение может возникнуть и тут
           memo3.Lines.Add(memo1.Lines[i]);
         end;
       end
     else
       //http 404, 501 и так далее
       memo3.Lines.Add(memo1.Lines[i]);
   end;
 on e:Exception do
   memo3.Lines.Add(memo1.Lines[i]);
 end;
А вот как быть теперь если ответ от сервера 200(то есть сайт доступен)
memo2.Lines.Add(idHTTP1.Response.Re sponseText+url[i]); не пашет(
brownb вне форума Ответить с цитированием
Старый 10.03.2017, 08:27   #2
brownb
Форумчанин
 
Регистрация: 16.10.2016
Сообщений: 156
По умолчанию

Код:
function CheckUrl(url: string): boolean;
var
  hSession, hfile, hRequest: hInternet;
  dwindex, dwcodelen: dword;
  dwcode: array [1..20] of char;
  res: pchar;
begin
  if pos('http://', lowercase(url)) = 0 then
    url := 'http://'+url;
  Result := false;
  hSession := InternetOpen('InetURL:/1.0', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if assigned(hsession) then
  begin
    hfile := InternetOpenUrl(hsession, pchar(url), nil, 0, INTERNET_FLAG_RELOAD, 0);
    dwIndex := 0;
    dwCodeLen := 10;
    HttpQueryInfo(hfile, HTTP_QUERY_STATUS_CODE, @dwcode, dwcodeLen, dwIndex);
    res := pchar(@dwcode);
    result := (res = '200') or (res = '302');
    if assigned(hfile) then
      InternetCloseHandle(hfile);
    InternetCloseHandle(hsession);
  end;
  end;
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
for i:=0 to Memo1.Lines.Count-1 do begin
if CheckUrl(memo1.Lines[i]) then memo2.Lines.Add(memo1.Lines[i])
else memo3.Lines.Add(memo1.Lines[i])
end;
Нашел функцию работает все отлично,только вот если закидываешь сайтов 10-20 то сразу зависает(Кидал антифриз и тд не помогает(Подскажите как можно выйти с этой ситуации
brownb вне форума Ответить с цитированием
Старый 10.03.2017, 19:40   #3
brownb
Форумчанин
 
Регистрация: 16.10.2016
Сообщений: 156
По умолчанию

Так и не нашел решения(Помогите плз
brownb вне форума Ответить с цитированием
Старый 10.03.2017, 19:47   #4
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,758
По умолчанию

как цикл делал? делай итерации только после того как получил ответ

for тут не подойдет, получишь в Get только последний сайт

Хотя можешь попробовать и с For, тогда придётся задержку делать.

если сайтов не много, то делай массив ответов и грузи в цикле ответы в массив, а потом анализируй, хотя и тут могут быть проблемы.

Как проверять сайт на доступность IDHTTP.GET - если что-то пришло, значит доступно, если ничего не пришло, не доступен. и не усложняй ))
Установи в компоненте время ожидания ответа и от этого работай.

Зачем вообще знать какая ошибка и прочее, если твоя задача получить что-то или узнать что ничего не отвечает )
Alar вне форума Ответить с цитированием
Старый 10.03.2017, 20:28   #5
brownb
Форумчанин
 
Регистрация: 16.10.2016
Сообщений: 156
По умолчанию

Код:
for i:=0 to Memo1.Lines.Count-1 do begin
if CheckUrl(memo1.Lines[i]) then memo2.Lines.Add(memo1.Lines[i])
else memo3.Lines.Add(memo1.Lines[i])
так вот он цикл) пока до конца списка не дойдет.Суть такова есть список сайтов типо sdfasdgsdfg.com 1000 шт.Так вот мне нужно проверить их на доступность т.е там процентов 80 не валидны.
Да вы правельно сказали,нужно отправить гет получить ответ потом только отправлять на второй адрес гет.

Код:
function CheckUrl(url: string): boolean;
var
  hSession, hfile, hRequest: hInternet;
  dwindex, dwcodelen: dword;
  dwcode: array [1..20] of char;
  res: pchar;
begin
  if pos('http://', lowercase(url)) = 0 then
    url := 'http://'+url;
  Result := false;
  hSession := InternetOpen('InetURL:/1.0', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if assigned(hsession) then
  begin
    hfile := InternetOpenUrl(hsession, pchar(url), nil, 0, INTERNET_FLAG_RELOAD, 0);
    dwIndex := 0;
    dwCodeLen := 10;
    HttpQueryInfo(hfile, HTTP_QUERY_STATUS_CODE, @dwcode, dwcodeLen, dwIndex);
    res := pchar(@dwcode);
    result := (res = '200') or (res = '302');
    if assigned(hfile) then
      InternetCloseHandle(hfile);
    InternetCloseHandle(hsession);
  end;
  end;
Разве эта функция не так работает?
brownb вне форума Ответить с цитированием
Старый 10.03.2017, 20:30   #6
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,758
По умолчанию

разбирайся, гугление готовых функций, ничего полезного с сетями тебе не поможет сделать, нужно понимать как ждать ответа.

все что тебе надо idhttp1.Get и memo1.text

Еще как вариант, при небольшом количестве запросов, пустить их все в разных потоках, тогда и цикл не нужен )
Alar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi. Проверить сайт на доступность igrok111 Общие вопросы Delphi 4 08.06.2013 01:40
Перебрать список в цикле bulat786 JavaScript, Ajax 5 29.05.2012 13:45
Выполнить список функций в цикле BARNEY Общие вопросы Delphi 10 04.04.2011 18:39
Список сайтов и программ где можно получить сертификат Иллидан Софт 1 19.11.2010 21:52
Акция: хостинг 200 Гб, 200 р. в месяц. Viteef Свободное общение 2 28.07.2008 23:43