On-line: гостей 2. Всего: 2 [подробнее..]
АвторСообщение





Пост N: 726
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 20.08.25 22:33. Заголовок: Проверка web-страницы на предмет ее существования.


Есть справочник товаров с дополнительными полями его характеристик.
Одна из них - "http ссылка на сайт производителя", чтобы там посмотреть дополнительные параметры, сертификаты, документацию итп.
Со временем, меняются каталоги у производителей, обновляются их сайты и ссылки становятся нерабочими.

Как-бы из harbour проверить конкретную ссылку и понять, что она "протухла" и ее пора обновить ?
Пока напрямую с интернет-протоколами не работал.

Подскажите пожалуйста, откуда начать изучение ?
Спасибо.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 17 [только новые]


постоянный участник




Пост N: 8019
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.08.25 10:31. Заголовок: https://www.kresin.r..


https://www.kresin.ru/hrbfaq_3.html#Doc10
3.10 INET подсистема

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 727
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 21.08.25 11:54. Заголовок: Спасибо. Буду изучат..


Спасибо. Буду изучать.

Спасибо: 0 
ПрофильЦитата Ответить
moderator


Пост N: 1648
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 21.08.25 16:25. Заголовок: Sergy пишет: Как-бы..


Sergy пишет:

 цитата:
Как-бы из harbour проверить конкретную ссылку и понять, что она "протухла" и ее пора обновить ?


Я бы запустил curl из программы. Можно ping. Я вообще предпочитаю при возможности использовать внешние программы, чтобы не перегужать свою.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 728
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 21.08.25 23:55. Заголовок: alkresin пишет: Я б..


alkresin пишет:

 цитата:
Я бы запустил curl из программы


С curl только-только знакомлюсь, никогда не имел дела. Так понимаю, что в случае отсутствия запрошенной страницы "как-то" можно будет получить код 404.

Спасибо: 0 
ПрофильЦитата Ответить
moderator


Пост N: 1650
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 22.08.25 16:18. Заголовок: curl www.somesite.ru..


curl www.somesite.ru -o aa.txt
запишет в aa.txt главную страницу сайта. Если имя сайта dns не сможет найти, файл даже не будет создан.

Можно
curl -I www.somesite.ru -o aa.txt
тогда будет читать только HEAD - на случай, если главная страница многомегабайтная.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 729
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 22.08.25 23:01. Заголовок: Да, хороший способ ч..


Да, хороший способ читать только заголовки.
Первая строка передается "HTTP/1.1 404 Not Found", если страница не найдена и "HTTP/1.1 200 OK", если норм.

Спасибо.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 363
Зарегистрирован: 05.10.06
ссылка на сообщение  Отправлено: 24.08.25 13:38. Заголовок: Метод HEAD — правиль..


Метод HEAD — правильный заголовок в HTTP-запросе, который указывает серверу возвращать только заголовки ответа, а не тело ответа

oHttp:=CreateObject( 'MSXML2.XMLHTTP' )
oHttp:Open( "HEAD", cUrl, varAsync:=.f., login, pasw )
oHttp:Send( )
if oHttp:status==200
? "ресурс доступен"
endif

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 730
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 27.08.25 11:51. Заголовок: Спасибо, Михаил. Тож..


Спасибо, Михаил. Тоже попробую.

Отмечу, что понравилось в методе с curl: при ответе "301 Moved permanently" передается еще и строка "Location :", куда запрашиваемый ресурс был перемещен. Я анализирую этот новый адрес, еще раз проверяю и если ответ по новому адресу "200 OK", автоматически обновляю в базе ссылку. Красота.

Может быть, это будет кому-то полезно.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 365
Зарегистрирован: 05.10.06
ссылка на сообщение  Отправлено: 28.08.25 17:14. Заголовок: Sergy пишет: Отмечу..


Sergy пишет:

 цитата:
Отмечу, что понравилось в методе с curl: при ответе "301 Moved permanently" передается еще и строка "Location :", куда запрашиваемый ресурс был перемещен. Я анализирую этот новый адрес, еще раз проверяю и если ответ по новому адресу "200 OK", автоматически обновляю в базе ссылку. Красота.



протокол стандартный, поэтому возвращает один и тот же набор данных, в MSXML2.XMLHTTP можно получить значение нужного заголовка через getResponseHeader(headerName) — возвращает значение указанного заголовка
или все заголовки в виде строки getAllResponseHeaders()

кстати, если требуется выполнить большое число запросов сразу, то можно использовать асинхронный режим varAsync=.t. , при этом программа не будет приостанавливать выполнение до получения ответа, а результат опрашивать потом в цикле через onreadystatechange и readyState , но я так не делал, тут еще нужно разбираться...

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 731
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 30.08.25 21:24. Заголовок: Гугл пишет, что MSXM..


Гугл пишет, что MSXML2.XMLHTTP устарел и вместо него использовался window.XMLHttpRequest, а теперь даже более новый - fetch API.

Идея с фоновой проверкой мне нравится и хочу ее потестить, но начинать с устаревшего метода...

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 366
Зарегистрирован: 05.10.06
ссылка на сообщение  Отправлено: 01.09.25 09:01. Заголовок: Sergy пишет: Идея с..


Sergy пишет:

 цитата:
Идея с фоновой проверкой мне нравится и хочу ее потестить, но начинать с устаревшего метода...



да их много, все плюс минус похожи, у меня просто много лет работает без проблем...
вот попробовал в асинхронном режиме, работает так:

oHttp:=CreateObject( 'Msxml2.ServerXMLHTTP.6.0' )
if empty(oHttp)
break "не создан объект Msxml2.ServerXMLHTTP.6.0"
endif
oHttp:Open( "POST", cUrl, async:=.t., login, pasw )
oHttp:SetRequestHeader("Content-Type","application/json")
oHttp:send(str)
do while .t.
if oHttp:readyState<>4
* ожидание ответа
oHttp:waitForResponse(50)
else
status:=oHttp:status
str:=oHttp:ResponseBody
exit
endif
enddo

При множественных запросах, на каждый запрос создаешь свой объект и помещаешь его в массив, затем в массиве опрашиваешь состояние...

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 732
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 04.09.25 00:15. Заголовок: Спасибо, попробую..


Спасибо, попробую

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8064
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.10.25 18:44. Заголовок: Как скачать файл по ..


Как скачать файл по определенной ссылке ?
2 метода попробовал, не всегда работают...
Вот код
      bErr  := ErrorBlock(bErrStd) 
BEGIN SEQUENCE
oHttp := Win_OleCreateObject( "MSXML2.ServerXMLHTTP" )
oHttp:Open( "GET", cUrl, .F. )
oHttp:setRequestHeader( "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Chrome/126.0" )
oHttp:Send()

IF oHttp:Status == 200

DEFAULT lText := .f.
if lText
cContents := oHttp:ResponseText()
else
cContents := oHttp:ResponseBody()
endif

ENDIF

oHttp:Abort()

RECOVER USING oErr
? ProcNL(), oErr
? REPL(".",5), oErr:description, oErr:operation, oErr:genCode
cErr := 'ERROR !;;' + oErr:description
cErr += if(!Empty(oErr:operation),';'+oErr:operation,'')
cErr += ' (' + HB_NtoS(oErr:genCode) + ');;'
cErr += ProcNL() + ";" + ProcNL(1)
AlertStop( cErr, "Error", "ZZZ_B_STOP64", 64, {RED} )
? cErr ; ?
END SEQUENCE
ErrorBlock(bErr)

Выдаёт такую ошибку:
Соединение с сервером было неожиданно прервано 
(0x80072EFE) SEND 1

Может неправильно делаю ?

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 371
Зарегистрирован: 05.10.06
ссылка на сообщение  Отправлено: 24.10.25 10:32. Заголовок: убери - oHttp:Abort(..


убери - oHttp:Abort()
попробуй добавить заголовок - oHttp:SetRequestHeader("Content-Type","application/json")

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4845
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.10.25 11:01. Заголовок: MIKHAIL пишет попроб..


MIKHAIL пишет
 цитата:
попробуй добавить заголовок - oHttp:SetRequestHeader("Content-Type","application/json")


 
oHttp := Win_OleCreateObject( "MSXML2.ServerXMLHTTP" )

oHttp:Open( "GET", cUrl, .F. )

oHttp:setRequestHeader( "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Chrome/126.0" )

oHttp:Send()

? "========>",oHttp:Status, oHttp:readyState

выдает ========> 404 4
все в порядке, не найден url
прерывание возможно по timeout - плохое соединение ...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8065
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.10.25 13:37. Заголовок: SergKis пишет: выда..


SergKis пишет:

 цитата:
выдает ========> 404 4
все в порядке, не найден url
прерывание возможно по timeout - плохое соединение ...


Почему тогда пишет другую ошибку ?
Соединение с сервером было неожиданно прервано - (0x80072EFE) SEND 1

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4846
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.10.25 16:57. Заголовок: Andrey пишет Почему ..


Andrey пишет
 цитата:
Почему тогда пишет другую ошибку ?


Вопрос объекту системы oHttp := Win_OleCreateObject( "MSXML2.ServerXMLHTTP" ), в нем аварийное завершение и до ответа 404 4 дело просто еще не дошло. У тебя ситуация обработана, программа не свалилась, пробуй, повторяй попытки ... может пройдет соединение нормально. У меня (моб. интернет 3G) все работает нет аварийных завершений, все время ===> 404 4

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 17
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет