| Автор | Сообщение |
|
|
| |
Пост N: 726
Зарегистрирован: 08.07.06
|
|
Отправлено: 20.08.25 22:33. Заголовок: Проверка web-страницы на предмет ее существования.
Есть справочник товаров с дополнительными полями его характеристик. Одна из них - "http ссылка на сайт производителя", чтобы там посмотреть дополнительные параметры, сертификаты, документацию итп. Со временем, меняются каталоги у производителей, обновляются их сайты и ссылки становятся нерабочими. Как-бы из harbour проверить конкретную ссылку и понять, что она "протухла" и ее пора обновить ? Пока напрямую с интернет-протоколами не работал. Подскажите пожалуйста, откуда начать изучение ? Спасибо.
|
 |

|
|
Ответов - 17
[только новые]
|
|
|
|
| постоянный участник
|
Пост N: 8019
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.08.25 10:31. Заголовок: https://www.kresin.r..
|
 |

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

|
|
|
| moderator
|
Пост N: 1648
Зарегистрирован: 06.07.06
|
|
Отправлено: 21.08.25 16:25. Заголовок: Sergy пишет: Как-бы..
Sergy пишет: | цитата: | | Как-бы из harbour проверить конкретную ссылку и понять, что она "протухла" и ее пора обновить ? |
| Я бы запустил curl из программы. Можно ping. Я вообще предпочитаю при возможности использовать внешние программы, чтобы не перегужать свою.
|
 |

|
|
|
| |
Пост N: 728
Зарегистрирован: 08.07.06
|
|
Отправлено: 21.08.25 23:55. Заголовок: alkresin пишет: Я б..
alkresin пишет: | цитата: | | Я бы запустил curl из программы |
| С curl только-только знакомлюсь, никогда не имел дела. Так понимаю, что в случае отсутствия запрошенной страницы "как-то" можно будет получить код 404.
|
 |

|
|
|
| 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 - на случай, если главная страница многомегабайтная.
|
 |

|
|
|
| |
Пост N: 729
Зарегистрирован: 08.07.06
|
|
Отправлено: 22.08.25 23:01. Заголовок: Да, хороший способ ч..
Да, хороший способ читать только заголовки. Первая строка передается "HTTP/1.1 404 Not Found", если страница не найдена и "HTTP/1.1 200 OK", если норм. Спасибо.
|
 |

|
|
|
| |
Пост 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
|
 |

|
|
|
| |
Пост N: 730
Зарегистрирован: 08.07.06
|
|
Отправлено: 27.08.25 11:51. Заголовок: Спасибо, Михаил. Тож..
Спасибо, Михаил. Тоже попробую. Отмечу, что понравилось в методе с curl: при ответе "301 Moved permanently" передается еще и строка "Location :", куда запрашиваемый ресурс был перемещен. Я анализирую этот новый адрес, еще раз проверяю и если ответ по новому адресу "200 OK", автоматически обновляю в базе ссылку. Красота. Может быть, это будет кому-то полезно.
|
 |

|
|
|
| |
Пост 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 , но я так не делал, тут еще нужно разбираться...
|
 |

|
|
|
| |
Пост N: 731
Зарегистрирован: 08.07.06
|
|
Отправлено: 30.08.25 21:24. Заголовок: Гугл пишет, что MSXM..
Гугл пишет, что MSXML2.XMLHTTP устарел и вместо него использовался window.XMLHttpRequest, а теперь даже более новый - fetch API. Идея с фоновой проверкой мне нравится и хочу ее потестить, но начинать с устаревшего метода...
|
 |

|
|
|
| |
Пост 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 При множественных запросах, на каждый запрос создаешь свой объект и помещаешь его в массив, затем в массиве опрашиваешь состояние...
|
 |

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

|
|
|
| постоянный участник
|
Пост 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 Может неправильно делаю ? 
|
 |

|
|
|
| |
Пост N: 371
Зарегистрирован: 05.10.06
|
|
Отправлено: 24.10.25 10:32. Заголовок: убери - oHttp:Abort(..
убери - oHttp:Abort() попробуй добавить заголовок - oHttp:SetRequestHeader("Content-Type","application/json")
|
 |

|
|
|
| постоянный участник
|
Пост 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 - плохое соединение ...
|
 |

|
|
|
| постоянный участник
|
Пост N: 8065
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.10.25 13:37. Заголовок: SergKis пишет: выда..
SergKis пишет: | цитата: | выдает ========> 404 4 все в порядке, не найден url прерывание возможно по timeout - плохое соединение ... |
| Почему тогда пишет другую ошибку ? Соединение с сервером было неожиданно прервано - (0x80072EFE) SEND 1
|
 |

|
|
|
| постоянный участник
|
Пост N: 4846
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.10.25 16:57. Заголовок: Andrey пишет Почему ..
Andrey пишет | цитата: | | Почему тогда пишет другую ошибку ? |
| Вопрос объекту системы oHttp := Win_OleCreateObject( "MSXML2.ServerXMLHTTP" ), в нем аварийное завершение и до ответа 404 4 дело просто еще не дошло. У тебя ситуация обработана, программа не свалилась, пробуй, повторяй попытки ... может пройдет соединение нормально. У меня (моб. интернет 3G) все работает нет аварийных завершений, все время ===> 404 4
|
 |

|
|