Pull to refresh

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
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.