Как отправить вебформу на сервер при помощи TClientSocket (напрямую и через прокси)
Посетитель у провайдера.
- Ой, что это у вас так крякнуло.
- Сервер наверное...
{
Присоедините следующие события к Вашему ClientSocket:
procedure T...Form.ClientSocket1Write;
procedure T...Form.ClientSocket1Read;
procedure T...Form.ClientSocket1Disconnect;
procedure T...Form.ClientSocket1Error;
Так же пример показывает, как направлять передачу через прокси-сервер.
Для отправки на вебсервер используется следующий формат:
Напрямую:
'POST ' + PostAddr + 'HTTP/1.0' + HTTP_Data + Content
Через проксю:
'POST http://' Webserver + PostAddr + 'HTTP/1.0' + HTTP_Data + Content
}const
WebServer = 'www.somehost.com';
WebPort = 80;
PostAddr = '/cgi-bin/form';
{ Следующие переменные используются только для вебсервера: }
ProxyServer ='proxy.somewhere.com';
ProxyPort = 3128;
// В заголовке post необходимы некоторые данные
HTTP_Data =
'Content-Type: application/x-www-form-urlencoded'#10+
'User-Agent: Delphi/5.0 ()'#10+ { Отрекламируем Delphi 5! }
'Host: somewhere.com'#10+
'Connection: Keep-Alive'#10;
type
T...Form = class(TForm)
...
private{ Private declarations }
HTTP_POST : string;
FContent : string;
// Эта переменная будет содержать ответ сервера
FResult : string;
public{ Public declarations }end;
{ Эти функции сделают некоторое url-кодирование }{ Например. 'John Smith' => 'John+Smith' }function HTTPTran(St: string): string;
var
i: Integer;
begin
Result:='';
for i:=1 to length(St) doif St[i] in ['a'..'z','A'..'Z','0','1'..'9'] then
Result:=Result+St[i]
elseif St[i]=' ' then
Result:=Result+'+'
else
Result:=Result+'%'+IntToHex(Byte(St[i]),2);
end;
procedure T...Form.ClientSocket1Write(Sender: TObject;
Socket: TCustomWinSocket);
begin// Постим данные
Socket.SendText(HTTP_POST+FContent);
end;
procedure T...Form.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin// Получаем результат
FResult:=FResult+Socket.ReceiveText;
end;
procedure T...Form.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin// ЗДЕСЬ МОЖНО ОБРАБОТАТЬ FResult //end;
procedure T...Form.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode := 0; // Игнорируем ошибкиend;
{ А эта подпрограмма, которую можно
использовать для постинга данных формы. }procedure T...Form.PostTheForm;
begin// Очищаем результаты
FResult:='';
// Вы можете ввести поля формы, которые необходимы// Вот некоторые примеры:
FContent:=
'Name='+ HTTPTran('John Smith') +'&'+
'Address='+ HTTPTran('1 Waystreet') +'&'+
'Email='+ HTTPTran('jsmith@somewhere.com') +'&'+
'B1=Submit' + #10;
// Вычисляем длину содержимого
FContent:=
'Content-Length: '+IntToStr(Length(FContent))+#10+#10+FContent;
{-- Начало прокси ---}{ если Вы используете прокси, то раскоментируйте этот код }
ClientSocket1.Host := ProxyServer;
ClientSocket1.Port := ProxyPort;
HTTP_POST := 'POST http: //'+WebServer+PostAddr+' HTTP/1.0'#10;{--- Конец прокси ---}{--- Начало соединения напрямую --- }{ удалите этот код, еслы Вы будете использовать прокси }
ClientSocket1.Host := WebServer;
ClientSocket1.Port := WebPort;
HTTP_POST := 'POST '+PostAddr+' HTTP/1.0'#10;
{--- Конец соединения напрямую ---}// Соединяем заголовок
HTTP_Post := HTTP_Post + HTTP_Data;
// Пытаемся открыть соединение
ClientSocket1.Open;
end;
Статья Как отправить вебформу на сервер при помощи TClientSocket (напрямую и через прокси) раздела Интернет и Сети Сокеты может быть полезна для разработчиков на delphi & pascal.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.