lnet
Модератор: Модераторы
lnet
Очень прошу привести пример реализации get и post запросов с использованием компоненты LHTTPClientComponent из lnet
Так там же есть стандартная демка. Насчёт get запроса всё очень легко - просто дописываеш в конце урля параметры (в виде http://some.com?param1=val1¶m2=val2...) Насчёт post запроса чуть сложнее. Я делал так:
здесь PostData хранит переменные отправляемые на сервер в таком же формате как и в get запросе..
Кстати это работает через раз если использовать компоненты из архива что на офф сайте. У меня так и небыло времени разобраться почему, но когда я поставил себе CodeTyphon проблемы исчезли. Так что, наверно, в SVN уже пофиксили какие-то баги и можно просто обновиться или тоже поставить CodeTyphon как я
..
Код: Выделить всё
HTTPSSL.SSLActive := DecomposeURL(HTTPServerURL+'client_update.php', aHost, aURI, aPort);
HTTPClient.Host := aHost;
HTTPClient.URI := aURI;
HTTPClient.Port := aPort;
HTTPClient.Method:=hmPost;
PostData:='login='+Login+'&password='+Password+'&port='+IntToStr(TCPServer.Port)+'&time='+FormatDateTime('yyyy"-"mm"-"dd hh":"nn":"ss',LocalTimeToGMT(Now));
HTTPClient.AddExtraHeader('Content-Type: application/x-www-form-urlencoded');
HTTPClient.AddExtraHeader('Content-Length: '+IntToStr(Length(PostData))+#13#10);
HTTPClient.AddExtraHeader(PostData);
HTTPClient.SendRequest;
здесь PostData хранит переменные отправляемые на сервер в таком же формате как и в get запросе..
Кстати это работает через раз если использовать компоненты из архива что на офф сайте. У меня так и небыло времени разобраться почему, но когда я поставил себе CodeTyphon проблемы исчезли. Так что, наверно, в SVN уже пофиксили какие-то баги и можно просто обновиться или тоже поставить CodeTyphon как я
Прости сразу не заметил. Спасибо за ответ.FedeX писал(а):Так там же есть стандартная демка.
У меня появилась ещё пара вопросов. Для примера возьмём следующий код:
Код: Выделить всё
unit unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
Menus, ComCtrls, StdCtrls, ExtCtrls, Buttons, Windows, lNetComponents, lhttp, lNet, lHTTPUtil;
type
{ TForm1 }
TForm1 = class(TForm)
HTTPClient: TLHTTPClientComponent;
SSL: TLSSLSessionComponent;
MemoHTML: TMemo;
MemoStatus: TMemo;
TESTBUTON: TBitBtn;
procedure HTTPClientDisconnect(aSocket: TLSocket);
procedure HTTPClientDoneInput(ASocket: TLHTTPClientSocket);
procedure HTTPClientError(const msg: string; aSocket: TLSocket);
function HTTPClientInput(ASocket: TLHTTPClientSocket;ABuffer: pchar; ASize: integer): integer;
procedure HTTPClientProcessHeaders(ASocket: TLHTTPClientSocket);
procedure SSLSSLConnect(aSocket: TLSocket);
procedure TESTBUTONClick(Sender: TObject);
private
{ private declarations }
HTTPBuffer: string;
procedure AppendToMemo(aMemo: TMemo; const aText: string);
public
{ public declarations }
end;
var
Form1: TForm1;
Done: boolean;
implementation
{ TForm1 }
procedure TForm1.TESTBUTONClick(Sender: TObject);
var
retURL, email, password, URL: string;
aHost, aURI: string;
aPort: Word;
begin
MemoHTML.Text := '';
MemoStatus.Text := '';
HTTPBuffer := '';
SSL.SSLActive := DecomposeURL('http://www.yandex.ru/', aHost, aURI, aPort);
HTTPClient.Host := aHost;
HTTPClient.Method:=hmGet;
HTTPClient.URI := aURI;
HTTPClient.Port := aPort;
HTTPClient.SendRequest;
Done := false;
while not Done do HttpClient.CallAction; // C этой строкой повисает. Без неё TEST2.html будет пуст.
MemoHTML.Lines.SaveToFile('TEST2.html');
//*********************************************
URL:=MemoHTML.Text;
URL:=copy(URL,pos('Погода',URL),MaxInt);
URL:=copy(URL,pos('href="',URL)+6,pos('">',URL)-1-pos('href="',URL)-6);
MemoHTML.Text := '';
MemoStatus.Text := '';
HTTPBuffer := '';
SSL.SSLActive := DecomposeURL(URL, aHost, aURI, aPort);
HTTPClient.Host := aHost;
HTTPClient.Method:=hmGet;
HTTPClient.URI := aURI;
HTTPClient.Port := aPort;
HTTPClient.SendRequest;
Done := false;
end;
procedure TForm1.HTTPClientError(const msg: string; aSocket: TLSocket);
begin
MessageDlg(msg, mtError, [mbOK], 0);
end;
function TForm1.HTTPClientInput(ASocket: TLHTTPClientSocket; ABuffer: pchar; ASize: integer): integer;
var
oldLength: dword;
begin
oldLength := Length(HTTPBuffer);
setlength(HTTPBuffer,oldLength + ASize);
move(ABuffer^,HTTPBuffer[oldLength + 1], ASize);
MemoHTML.Text := HTTPBuffer;
MemoHTML.SelStart := Length(HTTPBuffer);
AppendToMemo(MemoStatus, IntToStr(ASize) + '...');
Result := aSize;
end;
procedure TForm1.AppendToMemo(aMemo: TMemo; const aText: string);
begin
aMemo.Append(aText);
aMemo.SelStart := Length(aMemo.Text);
end;
procedure TForm1.HTTPClientProcessHeaders(ASocket: TLHTTPClientSocket);
begin
AppendToMemo(MemoStatus, 'Заголовок: ' + IntToStr(HTTPStatusCodes[ASocket.ResponseStatus]) +
' ' + ASocket.ResponseReason);
end;
procedure TForm1.SSLSSLConnect(aSocket: TLSocket);
begin
AppendToMemo(MemoStatus,'Подключение по TLS успешно,');
end;
procedure TForm1.HTTPClientDisconnect(aSocket: TLSocket);
begin
AppendToMemo(MemoStatus,'Отключаюсь');
done := true;
MemoHTML.Lines.SaveToFile('TEST1.html');
end;
procedure TForm1.HTTPClientDoneInput(ASocket: TLHTTPClientSocket);
begin
aSocket.Disconnect;
AppendToMemo(MemoStatus,'Завершено');
end;
initialization
{$I unit1.lrs}
end.
1) При нажатии на клавишу получаю интернет страницу (в примере http://www.yandex.ru/) и хочу, получив её содержимое, перейти по ссылке, которая на ней расположена (в примере, ссылка скрывающаяся за текстом "Погода"). В связи с этим вопрос: "Как определить конец получения первой страницы? В приведённом выше коде Я пытался определить конец передачи при помощи переменной done, но при запуске программа повисает на строке while not Done do HttpClient.CallAction;"
2) Требуется перейти на страницу http://weather.yandex.ru/, на которой установлен редирект (код состояния HTTP 302). В связи с этим прошу привести пример получения заголовков от сервера.
Всё же хотелось бы увидеть ответ на мой вопрос. Помогите пожалуйста.
1) Добавте в цикл обработку сообщений
2) Компонентами Inet некогда не пользовался так, что сказать нечего...
Код: Выделить всё
...
while not Done do
begin
HttpClient.CallAction;
Application.ProcessMessages;
end;
...2) Компонентами Inet некогда не пользовался так, что сказать нечего...
- blacksirius
- новенький
- Сообщения: 16
- Зарегистрирован: 18.04.2010 18:43:49
- Откуда: UA, Николаев
подскажите, как с помощью компонента Inet я могу получить xml файлы:
http://ufs.com.ua/xml/nbu_fx.php
http://www.cbr.ru/scripts/XML_daily.asp
для дальнейшего редактирование
Добавлено спустя 11 часов 3 минуты 51 секунду:
забыл уточнить
проблема в том что
http://ufs.com.ua/xml/nbu_fx.php в кодировке koi8-u
а http://www.cbr.ru/scripts/XML_daily.asp в кодировке windows-1251
а нужно что бы руский язык остался понятным
http://ufs.com.ua/xml/nbu_fx.php
http://www.cbr.ru/scripts/XML_daily.asp
для дальнейшего редактирование
Добавлено спустя 11 часов 3 минуты 51 секунду:
забыл уточнить
проблема в том что
http://ufs.com.ua/xml/nbu_fx.php в кодировке koi8-u
а http://www.cbr.ru/scripts/XML_daily.asp в кодировке windows-1251
а нужно что бы руский язык остался понятным
А lnet можно использовать для приложений "многие к одному"? Где при работе с одним пользователем может значительное время тратиться на обработку его задачи?
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Sharfik, это от устройства сервера зависит. А не клиента.
Так там и идут компоненты клиент-сервер, или я что то путаю? Там в примерах лежит "lnet\examples\visual\tcpudp", который может подключаться, а может слушать порт. Другое дело как он это делает!
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Sharfik писал(а):Другое дело как он это делает!
Как настроишь, так и сделает. Можно синхронно, можно асинхронно, проблема программиста обеспечить прослушивание порта.
