Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )




> Как оформить автоматическое выполнение Post запроса?
aqwapaq
Вставить ник
сообщение 11:02:2008, 22:28
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 12
Регистрация: 28:01:2008
Пользователь №: 15 040



Репутация: - 0 +


Столкнулся с такой проблемой:
Не получается написать 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) и её можно было запускать из командной строки.
Подняться вверх 
 
Сообщение #1
 
Новая тема 
Ответов (1 - 24)
DZX
Вставить ник
сообщение 12:02:2008, 07:14
Цитата Ответить 


Продвинутый
**

Группа: Программист
Сообщений: 182
Регистрация: 15:09:2005
Из: г. Минск
Пользователь №: 2 297
Специализация: Клиент-серверные приложения



Репутация: - 0 +


Сделать консольное приложение и пускать его ...
Подняться вверх 
 
Сообщение #2
sax_ol
Вставить ник
сообщение 12:02:2008, 07:26
Цитата Ответить 


==============
*****

Группа: Модеры
Сообщений: 1 740
Регистрация: 11:01:2007
Пользователь №: 8 750
Специализация: specialist



Репутация: - 27 +


Цитата(aqwapaq @ 12:02:2008, 00:28 )
без GUI

А тогда форма вам зачем?
Подняться вверх 
 
Сообщение #3
aqwapaq
Вставить ник
сообщение 12:02:2008, 08:23
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 12
Регистрация: 28:01:2008
Пользователь №: 15 040



Репутация: - 0 +


Создал 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.
Подняться вверх 
 
Сообщение #4
sax_ol
Вставить ник
сообщение 12:02:2008, 08:28
Цитата Ответить 


==============
*****

Группа: Модеры
Сообщений: 1 740
Регистрация: 11:01:2007
Пользователь №: 8 750
Специализация: specialist



Репутация: - 27 +


Что значит не работает?
Подняться вверх 
 
Сообщение #5
aqwapaq
Вставить ник
сообщение 12:02:2008, 08:43
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 12
Регистрация: 28:01:2008
Пользователь №: 15 040



Репутация: - 0 +


Во втором случае:

[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




Где ошибка?
Подняться вверх 
 
Сообщение #6
sax_ol
Вставить ник
сообщение 12:02:2008, 08:51
Цитата Ответить 


==============
*****

Группа: Модеры
Сообщений: 1 740
Регистрация: 11:01:2007
Пользователь №: 8 750
Специализация: specialist



Репутация: - 27 +


кейворд uses вам знаком?
Подняться вверх 
 
Сообщение #7
aqwapaq
Вставить ник
сообщение 12:02:2008, 09:03
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 12
Регистрация: 28:01:2008
Пользователь №: 15 040



Репутация: - 0 +


Цитата(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
Подняться вверх 
 
Сообщение #8
sax_ol
Вставить ник
сообщение 12:02:2008, 09:06
Цитата Ответить 


==============
*****

Группа: Модеры
Сообщений: 1 740
Регистрация: 11:01:2007
Пользователь №: 8 750
Специализация: specialist



Репутация: - 27 +


Для: aqwapaq
Поставте курсор на TStringList, нажмите F1, откроется справка, под словом Unit найдете модуль, который надо добавить в uses. и т.д.
Подняться вверх 
 
Сообщение #9
aqwapaq
Вставить ник
сообщение 12:02:2008, 09:13
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 12
Регистрация: 28:01:2008
Пользователь №: 15 040



Репутация: - 0 +


Цитата(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 ругается на другое?
Подняться вверх 
 
Сообщение #10
sax_ol
Вставить ник
сообщение 12:02:2008, 09:19
Цитата Ответить 


==============
*****

Группа: Модеры
Сообщений: 1 740
Регистрация: 11:01:2007
Пользователь №: 8 750
Специализация: specialist



Репутация: - 27 +


она вам говорит, что надо перед использование создать объект класса TIdHTTP, а сейчас у вас в переменной IdHTTP1 находится nil.
Подняться вверх 
 
Сообщение #11
aqwapaq
Вставить ник
сообщение 12:02:2008, 09:32
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 12
Регистрация: 28:01:2008
Пользователь №: 15 040



Репутация: - 0 +


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)


и подсветка все той же строки
Подняться вверх 
 
Сообщение #12
sax_ol
Вставить ник
сообщение 12:02:2008, 09:35
Цитата Ответить 


==============
*****

Группа: Модеры
Сообщений: 1 740
Регистрация: 11:01:2007
Пользователь №: 8 750
Специализация: specialist



Репутация: - 27 +


Цитата(aqwapaq @ 12:02:2008, 11:32 )
type
TIdHTTP = class(TIdCustomHTTP);

это ботва ее надо убрать. ну и тоже самое с TStringList = class(TStrings);
вы знаете что такое создать объект (экземпляр) класса?
Подняться вверх 
 
Сообщение #13
aqwapaq
Вставить ник
сообщение 12:02:2008, 09:44
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 12
Регистрация: 28:01:2008
Пользователь №: 15 040



Репутация: - 0 +


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


1. Как тогда должен выглядеть код?
Как и где обявлять?
2. Может и знаю- видел в исходниках, но лучшей идеи (ботвы=) ) чем TIdHTTP = class(TIdCustomHTTP); нет
Подняться вверх 
 
Сообщение #14
sax_ol
Вставить ник
сообщение 12:02:2008, 09:48
Цитата Ответить 


==============
*****

Группа: Модеры
Сообщений: 1 740
Регистрация: 11:01:2007
Пользователь №: 8 750
Специализация: specialist



Репутация: - 27 +


Цитата(aqwapaq @ 12:02:2008, 11:44 )
Как и где обявлять?

Они УЖЕ "объявлены", повторите пост #9 и для TIdHTTP. Вам надо только правильно пользоваться УЖЕ готовым.
Поэтому мой предыдущий вопрос остается в силе.
Подняться вверх 
 
Сообщение #15
aqwapaq
Вставить ник
сообщение 12:02:2008, 09:54
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 12
Регистрация: 28:01:2008
Пользователь №: 15 040



Репутация: - 0 +


Если не затруднит- покажите на примере как должен выглядеть правильно составленный код.
Я думаю так разовратся будет легче.

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

*


Возможно что то типа ObjectName.Create
Так?
Подняться вверх 
 
Сообщение #16
sax_ol
Вставить ник
сообщение 12:02:2008, 10:17
Цитата Ответить 


==============
*****

Группа: Модеры
Сообщений: 1 740
Регистрация: 11:01:2007
Пользователь №: 8 750
Специализация: specialist



Репутация: - 27 +


Меня может и не затруднит, но разве в этом кайф? Кайф в тогм чтобы понять самому, и написать правильно. Вот тогда с чувством глубокого удовлетворения, можно заявлять "Я КРУТ" 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;
Подняться вверх 
 
Сообщение #17
aqwapaq
Вставить ник
сообщение 12:02:2008, 10:59
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 12
Регистрация: 28:01:2008
Пользователь №: 15 040



Репутация: - 0 +


На самом деле статьи, 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
Подняться вверх 
 
Сообщение #18
sax_ol
Вставить ник
сообщение 12:02:2008, 11:06
Цитата Ответить 


==============
*****

Группа: Модеры
Сообщений: 1 740
Регистрация: 11:01:2007
Пользователь №: 8 750
Специализация: specialist



Репутация: - 27 +


Все что я написал для myStringList также справедливо для всех остальных без исключения, не взирая на их названия и т.д.
Цитата(aqwapaq @ 12:02:2008, 12:59 )
Нужен ли в консольных приложениях TYPE? Если да, то для чего?

Ровна для того-же, для чего он нужен и в не консольных, без каких либо оговорок.
Подняться вверх 
 
Сообщение #19
aqwapaq
Вставить ник
сообщение 12:02:2008, 11:10
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 12
Регистрация: 28:01:2008
Пользователь №: 15 040



Репутация: - 0 +


Так где ошибка или в чем проблема? Почему переменная 'IdHTTP1' не запускается-> следственно не выполняется нужная функция?
Подняться вверх 
 
Сообщение #20
sax_ol
Вставить ник
сообщение 12:02:2008, 11:17
Цитата Ответить 


==============
*****

Группа: Модеры
Сообщений: 1 740
Регистрация: 11:01:2007
Пользователь №: 8 750
Специализация: specialist



Репутация: - 27 +


Т.к. ее тоже надо инициализировать предварительно созданным объектом, т.е. все в соответствии с правилами, см выше.

Почему вы все сделали для POSTData, а для IdHTTP1 нет, в чем она провинилась?
Подняться вверх 
 
Сообщение #21
aqwapaq
Вставить ник
сообщение 12:02:2008, 11:32
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 12
Регистрация: 28:01:2008
Пользователь №: 15 040



Репутация: - 0 +


Все работает хорошо!
Большое спасибо за урок и мой респект 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. В изучении любой науки практика для меня важнее всего
Подняться вверх 
 
Сообщение #22
zubr
Вставить ник
сообщение 12:02:2008, 15:32
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 899
Регистрация: 19:11:2003
Пользователь №: 133



Репутация: - 11 +


Для: aqwapaq
Хм..., странный метод изучения. Так у тебя долго не получится, ровно на столько - на сколько хватит терпения у участников форума, а оно не безгранично, имхо.
З.Ы. Тут есть еще один практик - Дима Ламо. Чтойто он затих.
Подняться вверх 
 
Сообщение #23
sax_ol