Как нетрудно заметить по моим постам в блоге, при работе с HTTP-протоколом в Delphi я отдаю предпочтение библиотеке Synapse. Так уж получилось, что эта библиотека стала для меня практически незаменимой в момент, когда было необходимо написать небольшое приложение в Lazarus для работы в Сети, да так и привык к работе с ней, что не смог отказаться от её использования даже по возвращении в Delphi 2010, а потом и Delphi XE (частично). И с течением времени в блоге стали появляться посты по работе с библиотекой, а вместе с постами – вопросы, на которые я так или иначе пробовал отвечать как в блоге, так и по электронной почте, аське и т.д. Накопился кое-какой багаж вопросов, на которые ответил уже не один раз и решал сделать небольшой такой ТОП-10 вопросов по работе с Synapse в Delphi и ответов на них.
Вопрос 1: Как работать с TMemoryStream, TStringist и т.д.?
Ответ: почитать документацию Delphi на соответствующие темы. Изучением работы с этими типами данных необходимо заниматься задолго ДО начала работы с Synapse.
Ответ: для хранения cookies, полученных от сервера необходимо воспользоваться свойством THTTPSend:
Cookies: TStringList
Вопрос 3: Отправляю повторный запрос на сервер и не получаю ответа. Как быть?
Ответ: Метод HTTPMethod не стирает полученные в предыдущем запросе заголовки (свойство Headers), куки (свойство Cookies) и тело запроса (свойство Document), а использует их для отправки на заданный URL. Для того, чтобы повторный запрос выполнился успешно, необходимо удалить все записи из Headers, Cookies и Document, полученные первым запросом и, при необходимости заполнить их данными, которые необходимо отправить на сервер.
Вопрос 4: Как получить размер файла, который необходимо скачать из Сети?
Ответ: необходимо отправить HEAD-запрос на URL и, в случае успешно выполненного запроса, получить значение заголовка “Content-Length” из свойства Headers: TStringList, либо для Delphi 2010/Delphi XE воспользоваться хэлпером.
Вопрос 5: Как указать в заголовках размер отправляемого на сайт файла?
Ответ: никак. При выполнении HTTPMethod заголовок Content-Length заполнится автоматически, на основании данны, записанных в теле запроса (свойство Document: TMemoryStream).
Вопрос 6: Отправляю POST-запрос на сервер и не получаю ответа, либо возвращается код 4хх. Что я делаю не так?
Ответ: самая распространенная ошибка при отправке POST – неправильно заполненный заголовок Content-Type. По умолчанию этот заголовок имеет значение text/html. Для смены значения заголовка необходимо воспользоваться свойством MimeType: string, например так:
... var HTTP: THTTPSend; begin ... HTTP:=THTTPSend.Create; HTTP.MimeType:='application/x-www-form-urlencoded'; if HTTP.HTTPMethod('POST','http://webdelphi.ru') then ... end;
Вопрос 7: Сервер просит, чтобы присылаемые данные были закодированы, а в THTTPSend нет никаких методов кодирования. Как быть?
Ответ: Для всех видов кодирования/декодирования данных в Synapse используется модуль synacode.pas. Подключите его в uses и получит в распоряжение все необходимые методы, в т.ч. EncodeURL и EncodeURLElement для кодирования URL и его отдельных частей.
Вопрос 8: Загружаю данные web-странички в Memo а там вместо русских букв кракозябры. Synapse глючит?
Ответ: Synapse не глючит, а возвращает то, что попросили. Для того, чтобы текст в Memo стал читабельным необходимо исправить его кодировку. Подробное описание способов работы с кодировками есть здесь.
Вопрос 9: Как сделать визуализацию скачивания/закачки больших файлов?
Ответ: для этого необходимо обработать событие соккета OnStatus. Пример реализации скачивания файла с ProgressBar’ом есть здесь. Про другие события можно прочитать здесь.
Вопрос 10: Как работать с HTTPS в Synapse?
Для работы с HTTPS в Synapse необходимо подключить в uses модуль ssl_openssl.pas. При этом в папке с проектом необходимо держать следующие DLL: libeay32.dll, ssleay32.dll. Скачать последние версии библиотек можно здесь. Более подробную информацию по работе модуля ssl_openssl можно получить здесь.
Вот в принципе тот ТОП-10 вопросов, которые так или иначе задаются мне по работе с Synapse. Есть, конечно, и более сложные и интересные, но таковых не так уж и много и обычно для ответа на них пишется отдельный пост.
Книжная полка
Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
|
||
Название: О чем не пишут в книгах по Delphi
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
|
А почему на Lazarus-e была необходимость, чем Delphi не подходила?
На второй моей работе (теперь уже бывшей) поставили Linux — писал софт под Lazarus’ом
Здравствуйте!
Я новый человек в программирование (раньше работал на ехселе и писал макросы). Захотелось проверить свои силы на «Большое» программирование. Выбрал дельфи. Ищу всякие учебники, хельпи про него и по тихонько изучаю. В этом Ваш блог хорошо помогает. Я здесь узнал про библиотеке
Synapse решил изучать и его. Вроде понятно. Но вчера меня попросили написать простой прокси. И… Я узнал, что не могу понять как это делается… :( Скачал с инета несколько примеров но конкретно про прокси не нашел. В документации сказано, что надо заполнить свойтва HTTPTunnelIP. Я не понял когда его задать… Если у Вас будет время можете подсказать?
Никогда таким не занимался, если придётся — обязательно отпишусь
ПОДСКАЖИТЕ КАК ПРОЙТИ АВТОРИЗАЦИЮ С СЕРТИФИКАТОМ
Vlad подскажи а как сделать гет запрос, но оборвать прием данных а принять только хедеры(экономия трафа повышение скорости работы)? метод HEAD не всегда подходит некоторые сайты при этом дают не тот ответ который при GET.
в догонку:
или как оборвать прием данных посреди операции
например получили метатеги заголовок хтмл, чтобы дальше не качать бесполезный трафик(все данные нужные уже полученные в заголовке странички).
Торерро, для всего этого необходимо обрабатывать события сокета (THTTPSend.Sock). Про события я писал здесь
Vlad чуть чуть подробней можно — натолкни пожалуйста на мысль как это сделать.