Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Delphi и HTML-тэги


Автор: Zabul 5.9.2008, 09:26
Всем здравствуйте ! Хотел спросить у знающих людей совета. Задавал уже этот вопрос в Королевстве Delphi, но пока безрезультатно. Итак: давно уже занят с одной странной проблемой, связанной с запуском программки, реализующей с помощью Web-сервиса связь с определенным сервером. Дело в следующем: в исходном коде загружаемой страницы присутствует несколько тэгов <link>, а у закрывающих их тэгов отсутствует символ "/", т.е. в HTML-тексте выглядит примерно так:

                     <link rel="icon" href="/favicon.ico" type="image/ico">

а должно бы по идее

                     <link rel="icon" href="/favicon.ico" type="image/ico" />

Все браузеры нормально съедают эти тэги, но с Delphi этот трюк не проходит: при попытке вызова сайта через сгенерированный с помощью WSDL модуль программа натыкается на закрывающий тэг </head>, что приводит к ошибке, поскольку он воспринимается ею как закрывающий тэг для <link>. Ту же самую ошибку на той же самой строке получаю, если пытаюсь указать местонахождение WSDL-файла в компоненте HTTPRIO следующим образом: 

http://<адрес>?WSDL

Может, кто-то знает, как это исправить ?

Вполне может быть, что сейчас этот слэш вышел из моды за ненадобностью, хотя в интернете полно сайтов именно с таким описанием: 

http://www.htmlquick.com/reference/tags/link.html 
или 
http://www.mediaevent.de/xhtml/link.html

Однако не это важно, а то, что Delphi хочет этот слэш ! Можно ли как-то отключить в HTTPRIO эту проверку ? Потому что исходник загружаемой страницы я по понятным причинам поправить не могу.

Автор: SneG0K 5.9.2008, 22:29
Цитата(Zabul @  5.9.2008,  08:26 Найти цитируемый пост)
а должно бы по идее

С чего бы это? Значит разработчику удобно было не ставить косые черты. Не нравится юзай pos(), copy() и del()

Автор: Zabul 8.9.2008, 12:50
Да вопрос ведь совсем не в этом, мне все равно как удобно разработчику, а со строковыми функциями я хорошо знаком. Мне интересно, почему HTTPRIO брыкается, или что там за причина с этой ошибкой ? Как средствами Delphi это можно обойти ?

Автор: sai_NT 8.9.2008, 16:24
Цитата(Zabul @  8.9.2008,  12:50 Найти цитируемый пост)
Как средствами Delphi это можно обойти ? 


или
Первое: разобраться с этим модулем самому или поискать подобную проблему с гугле
или
Второе: отказаться от этого компонента и заюзать другой: Инди, например, а дальше уже юзать те методы, о которых писал SneG0K.

Автор: Zabul 8.9.2008, 16:41
sai_NT, спасибо за предложения, однако:

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

второе: а почему тогда во всех примерах из сети и в книжках WEB-сервис для Delphi организуется с помощью HTTPRIO ? Если это можно как-то сделать с помощью компонентов Indy или еще каких-нибудь, то было бы неплохо увидеть это где-то. Может, есть ссылка на описание? Поделитесь, если не жалко  smile 

Автор: SneG0K 8.9.2008, 17:06
Zabul, де ты видел примеры на этом HTTPRIO? И не видеть на индейцах? Так искал значит! 

Код

var
 s:string;
begin
 s:= IdHTTP.Get('google.com'); //в переменной S будет код страницы
end;

Автор: Zabul 8.9.2008, 17:18
SneG0K, видел именно то, что виделось - простейший работающий пример везде с использованием именно этой компоненты. Что до "индейцев", то для них и не искал, поскольку не подозревал, что и с их помощью можно WEB-сервис организовать. Спасибо за кусочек, однако хотелось бы поподробнее про это, а то гугл выдал кучу чего-то заумного, а мне бы чего попроще, как это было в примере с HTTPRIO smile 

Автор: aktuba 8.9.2008, 18:00
С индейцами можно, но геморно ;)
А насчет проблемы - как мне кажеться, есть простое решение - указать DTD в начале страницы, соответствующее документу.

Автор: Zabul 9.9.2008, 09:11
aktuba, уже интересно. Правда, с XML и в частности DTD у меня не очень, имею чисто теоретические познания в этой области. Насколько помню, DTD - это такой специальный отдельный файл-описание для определенного XML-документа. Правильно ли я понял Вашу идею - прописать имя этого DTD в начале моего WSDL (спрашиваю, потому что память подсказывает - с XML делается именно так) ? Или опять чушь сморозил? Очень хотелось бы попробовать реализовать Ваш метод, потому как с индями все выглядит слишком сложно  smile 

Автор: aktuba 9.9.2008, 09:56
Открой код этой страницыи посмотри первую строку:
Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


От этой строки зависит многое ;)

Автор: Zabul 9.9.2008, 11:02
Так это выглядит:

Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">


Вообще-то этот файл с HTML-структурой имеет расширение jsp, во всяком случае в адресной строке в конце стоит файл с таим расширением. Это важно?

Автор: Zabul 9.9.2008, 12:41
Поразмыслив и поэкспериментировав, пришел к такому выводу: всему виной этот самый jsp-модуль. Чтобы получить доступ к WSDL-файлам интересующего сайта, необходимо ввести логин и пароль (во всяком случае, появляется такая страница с запросом, если ввести строчку http://.....?WSDL в строке браузера). Пароль и логин мне известны, при их вводе вручную получаю доступ к сайту, правда, с парой дебильных сообщений от Apache Tomcat. Если же теперь ввожу http://.....?WSDL в браузере, передо мной наконец-то предстает WSDL во всей своей красе. Тогда другой вопрос: можно ли как-то подсунуть программно этому jsp логин и пароль? Не знаю, как сделать в Delphi, и даже такой серьезный продукт как XMLSpy от Altova не в состоянии туда пробиться. Есть ли способ это сделать?  smile 

Автор: aktuba 9.9.2008, 14:46
снифать траффик и смотреть ;)

Автор: Zabul 9.9.2008, 15:20
Не совсем понял, зачем снифать? Мне же известны входные данные, или я опять не в ту степь?

Автор: aktuba 10.9.2008, 08:45
Посмотри, как осуществляется авторизация...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)