Как стать автором
Обновить

Delphi и C++ Builder — Компоненты для работы по HTTP, Indy vs Synapse

Решалась задача по написанию инструмента для seo'шников — написать авторегистратор. Первой мыслью было использовать php с curl, но на php не очень удобно делать многопоточность, а это было одним из требованием к решению, поэтому было решено делать десктопное приложение на борландовской реализации с++.

В продуктах фирмы Borland, и ее продолжателя CodeGear для работы с интернет протоколами есть компоненты Indy (Internet Direct).

В начале была использована 6 версия. Но в процессе разработки выяснилось, что в версии Indy, идущей в комплекте, у http запросов нет поддержки cookie. Под рукой была среда CodeGear Rad Studio 2007 — в ее Indy куки были.

Вместе с новой версией IDE, жутко напоминающей Visual Studio(кончился Борланд, блин), и Indy были получены мелкие неприятности в виде невлезания на этапе разработки в мой 17" моник, и крупные в виде нестабильной работы по http и pop протоколам.

В итоге было принято решение использовать стороннюю библиотеку — Synapse. При установке нет никаких хитростей: просто добавляете модуль с список uses(Delphi) или инклудите hpp файл(Builder). Возможно эта библиотека не так удобна на этапе дизайна в IDE, так как ее нельзя кинуть на форму и отредактировать логин и пароль для pop3, но для тех кто может и любит покопаться в чужих исходниках эта библиотека — самое то.

Переписанное с использованием Synapse приложение работало стабильно. Единственная мелочь — у текущей версии(39) нет обработки редиректов(код результата http 3xx). В Indy, кстати, можно просто выставить флажок HandleRedirect. Но это неудобство в итоге отпало само собой, так как сервис, для которого делался регистратор, выдавал ключевую информацию(удачно, неудачно) и редиректил после этого.

Дописать особой сложности нужный код не составило особого труда. К тому же использование этой библиотеки позволило соскочить с громадины от CodeGear обратно на шестой билдер, что облегчило разработку и файл итогового exe(сейчас, конечно, это мало кого волнует).

THTTPSend *TWebRequest::WebRequest(AnsiString Url, rqType Type, THTTPSend *HTTP, bool doUTF, AnsiString FileName, AnsiString* PostParams, int PostParamsCount)
{
RedirCount = 0;
Responses->Clear();
_begin:
HTTP->Clear();
switch (Type) {
case rqGet :
if (!HTTP->HTTPMethod("GET",Url)) {
delete HTTP;
return NULL;
}
break;
case rqPost :
HTTP->MimeType = "application/x-www-form-urlencoded";
TStringStream *Params = new TStringStream("");
if (PostParamsCount) {
for (int i=0; i <PostParamsCount; i++) {
AnsiString S = PostParams[2*i]+"="+PostParams[2*i+1];
if (i != PostParamsCount-1) S+= "&";
if (doUTF) S = UTF8Encode(S);
Params->WriteString(S);
}
}
HTTP->Document->LoadFromStream(Params);
delete Params;
if (!HTTP->HTTPMethod("POST",Url)) {
delete HTTP;
return NULL;
}
break;
}
if (FileName.Length())
HTTP->Document->SaveToFile(FileName);
if (HTTP->HeaderByName("Content-Type").Pos("text")) {
LastResponse = StreamToString(HTTP->Document);
if (doUTF) LastResponse = UTF8Decode(LastResponse);
Responses->Add(LastResponse);
}
if (HTTP->ResultCode >= 300 && HTTP->ResultCode < 400) {
RedirCount++;
Url = HTTP->HeaderByName("Location");
Type = rqGet;
goto _begin;
}
return HTTP;
}


Ссылки по теме:
Проект Indy
Synapse
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.