lnet

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

lnet

Сообщение dimka » 14.06.2009 22:02:05

Очень прошу привести пример реализации get и post запросов с использованием компоненты LHTTPClientComponent из lnet
dimka
незнакомец
 
Сообщения: 3
Зарегистрирован: 14.06.2009 21:49:36

Re: lnet

Сообщение FedeX » 14.06.2009 22:48:44

Так там же есть стандартная демка. Насчёт get запроса всё очень легко - просто дописываеш в конце урля параметры (в виде http://some.com?param1=val1&param2=val2...) Насчёт post запроса чуть сложнее. Я делал так:
Код: Выделить всё
  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
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Re: lnet

Сообщение dimka » 05.07.2009 17:34:02

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). В связи с этим прошу привести пример получения заголовков от сервера.
dimka
незнакомец
 
Сообщения: 3
Зарегистрирован: 14.06.2009 21:49:36

Re: lnet

Сообщение dimka » 19.09.2009 09:01:12

Всё же хотелось бы увидеть ответ на мой вопрос. Помогите пожалуйста.
dimka
незнакомец
 
Сообщения: 3
Зарегистрирован: 14.06.2009 21:49:36

Re: lnet

Сообщение Mr.Smart » 19.09.2009 09:37:26

1) Добавте в цикл обработку сообщений
Код: Выделить всё
...
while not Done do
  begin
   HttpClient.CallAction;
   Application.ProcessMessages;
  end;
...

2) Компонентами Inet некогда не пользовался так, что сказать нечего...
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: lnet

Сообщение blacksirius » 26.04.2010 02:33:47

подскажите, как с помощью компонента 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
а нужно что бы руский язык остался понятным
Аватара пользователя
blacksirius
новенький
 
Сообщения: 16
Зарегистрирован: 18.04.2010 18:43:49
Откуда: UA, Николаев

Re: lnet

Сообщение Sharfik » 02.02.2022 22:43:59

А lnet можно использовать для приложений "многие к одному"? Где при работе с одним пользователем может значительное время тратиться на обработку его задачи?
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 805
Зарегистрирован: 20.07.2013 01:04:30

Re: lnet

Сообщение Снег Север » 03.02.2022 15:42:34

Sharfik, это от устройства сервера зависит. А не клиента.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3050
Зарегистрирован: 27.11.2007 16:14:47

Re: lnet

Сообщение Sharfik » 03.02.2022 23:55:07

Так там и идут компоненты клиент-сервер, или я что то путаю? Там в примерах лежит "lnet\examples\visual\tcpudp", который может подключаться, а может слушать порт. Другое дело как он это делает!
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 805
Зарегистрирован: 20.07.2013 01:04:30

Re: lnet

Сообщение Снег Север » 04.02.2022 00:36:31

Sharfik писал(а):Другое дело как он это делает!

Как настроишь, так и сделает. Можно синхронно, можно асинхронно, проблема программиста обеспечить прослушивание порта.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3050
Зарегистрирован: 27.11.2007 16:14:47


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru