Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как оформить автоматическое выполнение Post запроса?
Форум программистов > Системное программирование > Delphi и Pascal > Delphi - Сети
aqwapaq
Столкнулся с такой проблемой:
Не получается написать bat файл который бы смог автоматизировать (посылку серверу POST запроса) т.к в нижеприведенном коде требуется непосредственное взаимодействие пользователя с формой. Помогите составить код, скомпилировав который можно получить exe (который в свою очередь можно выполнить из CMD-> тем самым послав POST запрос).

А вот код программки (которая с формой):

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdCustomTransparentProxy, IdSocks, IdHTTP, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
    response :TStringList;
    POSTData: TStringList;

implementation

{$R *.dfm}
  
procedure TForm2.Button1Click(Sender: TObject);
begin
POSTData := TStringList.create;
POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message=');
IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData);
end;

end.


PS. Программка должна выполняться скрытно (без GUI) и её можно было запускать из командной строки.
DZX
Сделать консольное приложение и пускать его ...
sax_ol
Цитата(aqwapaq @ 12:02:2008, 00:28 )
без GUI

А тогда форма вам зачем?
aqwapaq
Создал VCL. Удалил форму.
Почему не работает так составленный код?




program Phttp5435;

uses
Forms, IdHTTP,IdComponent,SysUtils, IdBaseComponent;

{$R *.res}
var
POSTData: TStringList;
begin
POSTData := TStringList.create;
POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message=');
IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData);
end;
end.



2. Создал консольное приложение
Тоже не работает:


program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils, IdHTTP,IdComponent;

var
POSTData: TStringList;

begin
try
{$R *.res}

POSTData := TStringList.create;
POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message=');
IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData);


except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.
sax_ol
Что значит не работает?
aqwapaq
Во втором случае:

[DCC Error] Project1.dpr(9): E2003 Undeclared identifier: 'TStringList'
[DCC Error] Project1.dpr(15): E2066 Missing operator or semicolon
[DCC Error] Project1.dpr(16): E2066 Missing operator or semicolon
[DCC Error] Project1.dpr(17): E2003 Undeclared identifier: 'IdHTTP1'

->Как я понимаю надо обявить 'TStringList' и 'IdHTTP1' но в type и в var их не получается обявить

1.
program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils, IdHTTP,IdComponent;

  type
  TStringList = class(TStrings);
  IdHTTP1: TIdHTTP;


var
POSTData: TStringList;


begin
try
{$R *.res}

POSTData := TStringList.create;
POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message=');
IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData);


except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.


errors:
[DCC Error] Project1.dpr(9): E2003 Undeclared identifier: 'TStrings'
[DCC Error] Project1.dpr(10): E2029 '=' expected but ':' found
[DCC Error] Project1.dpr(22): E2003 Undeclared identifier: 'add'\
[DCC Error] Project1.dpr(23): E2250 There is no overloaded version of 'Post' that can be called with these arguments


2.


program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils, IdHTTP,IdComponent;

var
TStringList = class(TStrings);
  IdHTTP1: TIdHTTP;
POSTData: TStringList;


begin
try
{$R *.res}

POSTData := TStringList.create;
POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message=');
IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData);


except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.


errors:

[DCC Error] Project1.dpr(9): E2029 ',' or ':' expected but '=' found
[DCC Error] Project1.dpr(9): E2021 Class type required
[DCC Error] Project1.dpr(11): E2007 Constant or type identifier expected
[DCC Error] Project1.dpr(19): E2066 Missing operator or semicolon
[DCC Error] Project1.dpr(20): E2250 There is no overloaded version of 'Post' that can be called with these arguments




Где ошибка?
sax_ol
кейворд uses вам знаком?
aqwapaq
Цитата(sax_ol @ 12:02:2008, 10:51 )
кейворд uses вам знаком?

*


Вообщето знаком. Но причем он тут?
Все что используется уже есть в uses(SysUtils, IdHTTP,IdComponent)

Если вы о том, что переместить TStringList в uses то это тоже заканчивается ошибкой:
[DCC Error] Project1.dpr(6): F1026 File not found: 'TStringList.dcu'

Наверное чтото другое ожидает Dephi.

Вот так вроде хорошо: uses classes
sax_ol
Для: aqwapaq
Поставте курсор на TStringList, нажмите F1, откроется справка, под словом Unit найдете модуль, который надо добавить в uses. и т.д.
aqwapaq
Цитата(sax_ol @ 12:02:2008, 11:06 )
Поставте курсор на TStringList, нажмите F1, откроется справка, под словом Unit найдете модуль, который надо добавить в uses. и т.д.
*


Thx!

после запуска:
First chance exception at $7C812A7B. Exception class EAccessViolation with message 'Access violation at address 0043666C in module 'cscasc.exe'. Read of address 00000128'. Process cscasc.exe (10820)


и подсвечена строка:

IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData);


Неужели консольное приложение не может корректно работать с Indy?
Или Delphi ругается на другое?
sax_ol
она вам говорит, что надо перед использование создать объект класса TIdHTTP, а сейчас у вас в переменной IdHTTP1 находится nil.
aqwapaq
type
TIdHTTP = class(TIdCustomHTTP);

Вроде правильно объявил.
Так почему же опять:

First chance exception at $7C812A7B. Exception class EAccessViolation with message 'Access violation at address 0043666C in module 'cscasc.exe'. Read of address 0B89F39C'. Process cscasc.exe (2408)


и подсветка все той же строки
sax_ol
Цитата(aqwapaq @ 12:02:2008, 11:32 )
type
TIdHTTP = class(TIdCustomHTTP);

это ботва ее надо убрать. ну и тоже самое с TStringList = class(TStrings);
вы знаете что такое создать объект (экземпляр) класса?
aqwapaq
Цитата(sax_ol @ 12:02:2008, 11:35 )
это ботва ее надо убрать. ну и тоже самое с TStringList = class(TStrings);
вы знаете что такое создать объект (экземпляр) класса?
*


1. Как тогда должен выглядеть код?
Как и где обявлять?
2. Может и знаю- видел в исходниках, но лучшей идеи (ботвы=) ) чем TIdHTTP = class(TIdCustomHTTP); нет
sax_ol
Цитата(aqwapaq @ 12:02:2008, 11:44 )
Как и где обявлять?

Они УЖЕ "объявлены", повторите пост #9 и для TIdHTTP. Вам надо только правильно пользоваться УЖЕ готовым.
Поэтому мой предыдущий вопрос остается в силе.
aqwapaq
Если не затруднит- покажите на примере как должен выглядеть правильно составленный код.
Я думаю так разовратся будет легче.

Цитата(sax_ol @ 12:02:2008, 11:35 )
вы знаете что такое создать объект (экземпляр) класса?

*


Возможно что то типа ObjectName.Create
Так?
sax_ol
Меня может и не затруднит, но разве в этом кайф? Кайф в тогм чтобы понять самому, и написать правильно. Вот тогда с чувством глубокого удовлетворения, можно заявлять "Я КРУТ" smile.gif

работаем с объектами:
var
   myStringList : TStringList; // объявляем переменную с именем myStringList типа TStringList
// так как эта переменная имеет тип класса то она сразу-же инициализируется значением nil
begin
// т.е. тут myStringList = nil
// собственно создаем объект
  myStringList := TStringList.Create;
// а вот тут переменныя myStringList будет содержать указатель на объект (т.е. 4 байта) в памяти типа TStringList
    // и только после зоздания объекта мы можем полноценно пользоваться им и его ресурсами
  try
      myStringList.Add ........ // пользуемся, количество строк кода зависит, естественно, от конкретики
  finally
      // в конце работы (т.е. тогда когда он уже не неужен) обязательно надо уничтожить объект, и тем самым освободить ресурсы занимаемые им.
      myStringList.Free;
      // "занилить" переменную, во избежание непоняток в случае если мы собираемся дальше ею пользоваться
      myStringList := nill;
  end;
end;
aqwapaq
На самом деле статьи, FAQ и Manual'ы по созданию объектов я читал не раз. Однако не применял на практике поэтому было интерестно увидеть правильный вариант, а не перелистывать бессмысленно груду "макулатуры". Спасибо за объяснение- теперь запускается без ошибок.
Только один большой нюанс- Post requet так и не отправляется при запуске/исполнении программы.

Чем такое может быть вызвано?
Разве при старте не инициализируется функция запроса?
PS. Нужен ли в консольных приложениях TYPE? Если да, то для чего?

Вот получившийся код:

program cscasc;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  IdHTTP,
  IdComponent,
  classes;
// type
//TIdHTTP = class(TIdCustomHTTP);

var
IdHTTP1: TIdHTTP;
POSTData: TStringList;


begin
POSTData := TStringList.Create;
//IdHTTP1:= IdHTTP;
try
{$R *.res}

POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message=');
IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData);


finally
POSTData.Free;

end;
end.



Такой ERROR:

[DCC Warning] cscasc.dpr(25): W1036 Variable 'IdHTTP1' might not have been initialized
sax_ol
Все что я написал для myStringList также справедливо для всех остальных без исключения, не взирая на их названия и т.д.
Цитата(aqwapaq @ 12:02:2008, 12:59 )
Нужен ли в консольных приложениях TYPE? Если да, то для чего?

Ровна для того-же, для чего он нужен и в не консольных, без каких либо оговорок.
aqwapaq
Так где ошибка или в чем проблема? Почему переменная 'IdHTTP1' не запускается-> следственно не выполняется нужная функция?
sax_ol
Т.к. ее тоже надо инициализировать предварительно созданным объектом, т.е. все в соответствии с правилами, см выше.

Почему вы все сделали для POSTData, а для IdHTTP1 нет, в чем она провинилась?
aqwapaq
Все работает хорошо!
Большое спасибо за урок и мой респект sax_ol!!!=)
Вот работоспособный код:

program cscasc;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  IdHTTP,
  IdComponent,
  classes;



var
IdHTTP1: TIdHTTP;
POSTData: TStringList;


begin
POSTData := TStringList.Create;
IdHTTP1:= TIdHTTP.Create(nil);
//IdHTTP1:= IdHTTP;
try
{$R *.res}

POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message=');
IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData);


finally
POSTData.Free;
  IdHTTP1.Free;
end;
end.


PS. В изучении любой науки практика для меня важнее всего
zubr
Для: aqwapaq
Хм..., странный метод изучения. Так у тебя долго не получится, ровно на столько - на сколько хватит терпения у участников форума, а оно не безгранично, имхо.
З.Ы. Тут есть еще один практик - Дима Ламо. Чтойто он затих.
sax_ol
Цитата(zubr @ 12:02:2008, 17:32 )
Чтойто он затих.

Все ник-нэймы известные ему зарубили, он больше не смог придумать. smile.gif
aqwapaq
Цитата(zubr @ 12:02:2008, 17:32 )
Хм..., странный метод изучения. Так у тебя долго не получится, ровно на столько - на сколько хватит терпения у участников форума, а оно не безгранично, имхо.
*


Согласен. Однако причина создания этой темы проста:
1. В короткие сроки надо было автоматизировать процесс (машины долго простаивать не могут)
2. Практически программа была написана за исключением такой мелочи которую я не знал как реализовать (ничего похожего не удалось найти ни в google ни в тех. литературе)

Начинал как не банально, но с AutoIt (скрипт языка)
Был вариант:
Автоматически нажать на кнопку/control в этой программке (та программы которая с формой ).
Это было успешно выполненно но выглядело полным извращением.
Тогда решил это все оформить грамотно с помощью Delphi.

Думаю такие идеи вы приветствуете?

PS. Кому интересно могу выложить код скрипта AutoIT который запускает эту програмку-> нажимает на button и выходит. (Этому кривому методу пришел на помощь полноценный код Delphi)

=)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.